SpringBoot 使用 Feign 无废话 All-in-one 指南( 二 )

2.2.2 配置启用feign:okhttp:enabled: true复制代码三、如何修改日志级别在发送和接收请求的时候,其内部将日志的打印输出定义成了四个等级,对应的详情如下:
级别
说明
NONE
不做任何记录
BASIC
仅记录请求方法和 URL 以及响应状态代码和执行时间
HEADERS
记录基本信息以及请求和响应标头
FULL
记录请求和响应的标题,正文和元数据
3.1 通过配置文件修改日志级别注意需要指定接口的全限定名
logging:level:com.zto.titans.test.feign.service.TestService : DEBUG复制代码3.2 通过配置类修改日志级别@Configurationpublic class FooConfiguration {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}}复制代码这个一看即懂,不再废话 。
四、如何实现数据压缩可以分别对 HTTP 通信的request和response设置是否启用 GZIP 压缩,配置方法如下:
feign:compression:request:enabled: truemime-types: text/xml,application/xml,application/json # 配置压缩支持的MIME TYPEmin-request-size: 2048# 配置压缩数据大小的下限response:enabled: true # 配置响应GZIP压缩复制代码五、FeignClient 的配置以及配置的优先级机制有 2 种途径设置 FeignClient 的配置,通过自定义配置类来设置配置和在配置文件中设置,其中配置文件方式有点特殊,它里边可以指定全局配置对所有 FeignClient 有效,也可以为特定名称的 FeignClient 设置专属的配置 。
5.1 通过自定义配置类来定制配置实现一个配置类
public class TestConfiguration {@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}}复制代码将配置类 TestConfiguration 指定给configuration 。
@FeignClient(name = "test-service",configuration = {FeignInterceptor2.class,TestConfiguration.class})复制代码5.2 在配置文件中设置全局配置feign.client.config.default.xxx,这个default意为全局的配置属性 。
feign:client:config:default:connectTimeout: 5000readTimeout: 5000loggerLevel: basic复制代码5.3 在配置文件中设置专属配置feign.client.config.feignName.xxx , 给名字为feignName的FeignClient指定专属的配置 。
feign:client:config:feignName:connectTimeout: 5000readTimeout: 5000loggerLevel: fullerrorDecoder: com.example.SimpleErrorDecoderretryer: com.example.SimpleRetryerrequestInterceptors:- com.example.FooRequestInterceptor- com.example.BarRequestInterceptordecode404: falseencoder: com.example.SimpleEncoderdecoder: com.example.SimpleDecoder复制代码5.4 理解配置的优先级与拦截器的追加原则从
org.springframework.cloud.openfeign.FeignClientFactoryBean#configureFeign中可以确认以上 3 种配置的优先级:
configureUsingConfiguration(context, builder); // 1configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()),builder); //2configureUsingProperties(properties.getConfig().get(this.contextId),builder);//3复制代码

  1. 第 1 类为通过自定义配置类来指定配置
  2. 第 2 类为在配置文件中的feign.client.config.default.xxx设置全局配置
  3. 第 3 类为在配置文件中的feign.client.config.feignName.xxx设置专属配置
5.4.1 优先级的效果配置文件里的专属配置 -覆盖-> 配置文件里的全局配置 -覆盖-> 配置类的配置
5.4.2 追加的原则RequestInterceptor 是拦截器,可以在发送前做一些处理,比如统一添加header信息 。每一类中的requestInterceptors可以存储多个拦截器,拦截器并非覆盖的效果,而是链式追加的效果;从执行顺序来看优先级是:1 > 2 > 3,即先执行 配置类中指定的拦截器,然后是 配置文件中指定的全局拦截器,最后是配置文件中指定的专属拦截器 。
需特别注意:RequestInterceptor 的实现类(例如 RI-A,RI-B)上如果添加了@Component注解,就都会被扫描识别到,并被追加到第一类的requestInterceptors列表中;倘若不小心 RI-A 还在第 2 类中又被指定了,则还会将拦截器 RI-A 追加在第二类的requestInterceptors列表中,结果是会 RI-A 总计会执行 2 次;若也在第三类中指定 RI-A,则 RI-A 也在其列表中追加,结果是 RI-A 总计会执行 3 次 。
5.4.3 拦截器的效果验证以一个实例来验证说明效果
  • 自定义三个 RequestInterceptor
class FeignInterceptor implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {requestTemplate.header("user", "myuser1");requestTemplate.header("password", "mypassword");}}复制代码


推荐阅读