在前面的文章:
- SpringCloud之Feign实现声明式客户端负载均衡详细案例
- SpringCloud之OpenFeign实现服务间请求头数据传递(OpenFeign拦截器RequestInterceptor的使用)
我们聊了OpenFeign的概述、为什么会使用Feign代替Ribbon、Feign和OpenFeign的区别、详细的OpenFeign实现声明式客户端负载均衡案例、OpenFeign中拦截器RequestInterceptor的使用;
本文我们继续讨论OpenFeign有哪些常用配置?
配置项 | 作用 |
---|---|
Logger.Level | 指定日志级别 |
Retryer | 执行重试策略 |
ErrorDecoder | 指定错误解码器 |
Request.Options | 超时时间 |
Collection |
拦截器 |
常见可配置的参数:
feign:
hystrix:
# Feign启用断路器,默认为FALSE
enabled: true
client:
config:
# 针对所有的服务
default:
# Feign的连接建立超时时间,默认为10秒
connectTimeout: 5000
# Feign的请求处理超时时间,默认为60秒
readTimeout: 5000
# 日志级别
loggerLevel: full
# 拦截器配置(和@Bean的方式二选一)
requestInterceptors:
- com.saint.feign.config.MyFeignRequestInterceptor
# 错误解码器
errorDecoder: com.example.SimpleErrorDecoder
# 重试策略
retryer: com.example.SimpleRetryer
# 是否对404错误码解码
# 处理逻辑详见feign.SynchronousMethodHandler#executeAndDecode
decode404: false
# 编码器
encoder: com.example.SimpleEncoder
# 解码器
decoder: com.example.SimpleDecoder
# 契约
contract: com.example.SimpleContract
feign:
hystrix:
# Feign启用断路器,默认为FALSE
enabled: true
client:
config:
# 针对某个服务(服务名:SERVICE-A)
SERVICE-A:
# Feign的连接建立超时时间,默认为10秒
connectTimeout: 5000
# Feign的请求处理超时时间,默认为60秒
readTimeout: 5000
# 日志级别
loggerLevel: full
# 拦截器配置(和@Bean的方式二选一)
requestInterceptors:
- com.saint.feign.config.MyFeignRequestInterceptor
# 错误解码器
errorDecoder: com.example.SimpleErrorDecoder
# 重试策略
retryer: com.example.SimpleRetryer
# 是否对404错误码解码
# 处理逻辑详见feign.SynchronousMethodHandler#executeAndDecode
decode404: false
# 编码器
encoder: com.example.SimpleEncoder
# 解码器
decoder: com.example.SimpleDecoder
# 契约
contract: com.example.SimpleContract
优先使用针对单个服务的配置
用户在网络请求过程中,如果传输数据量过大,会造成体验差的问题;因此,我们需要将传输数据做压缩以提升体验。SpringCloud OpenFeign支持对请求和响应进行GZIP压缩,以减少通信过程中的性能损耗。
需要在Consumer端做如下配置:
feign:
# Feign请求响应压缩配置
compression:
request:
# 开启Feign请求压缩,默认不开启
enabled: true
# 配置支持压缩的MIME TYPE,默认为:text/xml,application/xml,application/json
mime-types: text/xml,application/xml,application/json
# 触发请求数据压缩的最小Size,默认2048KB
min-request-size: 2048
response:
# 开启Feign响应压缩,默认不开启
enabled: true
# 使用GZip解码器,默认不使用
useGzipDecoder: false
注意从GZIP的自动装配类(FeignContentGzipEncodingAutoConfiguration、FeignAcceptGzipEncodingAutoConfiguration)来看,如果使用的是okhttp,gzip是不生效的;
仅建议大家在测试环境开日志(辅助debug、调试),生产环境一般采用日志采集系统(ELK 或 Kafka那一套)。
logger level:none,basic,headers,full
日志配置有多种方式:JavaBean方式,属性方式
这种方式会导致所有的FeignClient都使用相同的日志级别(不推荐使用)。
(1)Logger.Level实例注册
在启动类可以扫描到的包路径下注入一个Logger.Level实例;
package com.saint.feign.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Saint
*/
@Configuration
public class MyConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
(2)日志输出级别配置
给指定包 / 类配置日志输出级别:
com.siant.feign.client
logging:
level:
# root日志以WARN级别输出
root: WARN
# com.saint.feign.client包下的日志以DEBUG级别输出
com.saint.feign.client: DEBUG
效果:
下面不再重复说明日志输出级别配置,只针对Feign日志配置。
将配置类放在SpringBoot扫描不到的包路径下;
注意:不要给MyConfiguration添加@Configuration注解,否者会出现Spring父子上下文的问题,导致所有的feign都使用该配置类。
package com.saint.configuration;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Saint
*/
public class MyConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
在FeignClient中指定configuration。
@FeignClient(value = "SERVICE-A",configuration = MyConfiguration.class)
public interface ServiceAClient extends ServiceA {
}
通用配置格式:
feign:
client:
config:
:
loggerLevel: full
为要调用的微服务名称;以本文的要调用的SERVICE-A
服务为例,属性配置方式如下:
feign:
client:
config:
# 针对某个服务
SERVICE-A:
# 日志级别
loggerLevel: full
Feign日志的全局配置有两种方式:代码方式、属性方式。
在启动类中的负责启动FeignClient的注解@EnableFeignClients
中添加defaultConfiguration属性
,指定一个Feign配置类。
@EnableFeignClients(defaultConfiguration = MyConfiguration.class)
将日志配置--局部
属性方式中的微服务的名称改为default即可;
feign:
client:
config:
# 想要调用的微服务名称
default:
loggerLevel: full
1> 代码配置:
- 基于代码、更加灵活;
- 但是线上修改得重新打包、发布,并且还有小坑(父子上下问问题)
2> 属性配置:- 配置更加直观、优先级更高(相对代码配置);
- 线上修改无需重新打包、发布;但是极端场景下没有代码配置方式灵活。
局部优于全局,属性优于代码: