在前面的文章:
我们聊了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)日志输出级别配置
给指定包 / 类配置日志输出级别:
日志输出级别:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
我们的FeignClient所在的包为: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> 属性配置:- 配置更加直观、优先级更高(相对代码配置);
- 线上修改无需重新打包、发布;但是极端场景下没有代码配置方式灵活。
局部优于全局,属性优于代码:
先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。因此我收集了一份《java开发全套学习资料》送给大家,初衷也很简单,就是希望帮助到想自学又不知道该从何学起的朋友,同时减轻大家的负担。添加下方名片,即可获取全套学习资料哦