客户端负载均衡Feign之四:Feign配置
Ribbon配置
在Feign中配置Ribbon非常简单,直接在application.properties中配置即可,如:
# 设置连接超时时间 ribbon.ConnectTimeout=500 # 设置读取超时时间 ribbon.ReadTimeout=5000 # 对所有操作请求都进行重试 ribbon.OkToRetryOnAllOperations=true # 切换实例的重试次数 ribbon.MaxAutoRetriesNextServer=2 # 对当前实例的重试次数 ribbon.MaxAutoRetries=1
同样也可以指定服务配置,直接在application.properties中采用.ribbon.key=value的格式进行配置,如下:
# 设置针对user-service服务的连接超时时间 user-service.ribbon.ConnectTimeout=600 # 设置针对user-service服务的读取超时时间 user-service.ribbon.ReadTimeout=6000 # 设置针对user-service服务所有操作请求都进行重试 user-service.ribbon.OkToRetryOnAllOperations=true # 设置针对user-service服务切换实例的重试次数 user-service.ribbon.MaxAutoRetriesNextServer=2 # 设置针对user-service服务的当前实例的重试次数 user-service.ribbon.MaxAutoRetries=1
在SpringCloudFeign中是默认打开重试机制,从上面的配置信息也可以看出,我们可以设置重试的次数。对于重试机制的测试,可以让服务提供方的方法延迟随机毫秒数来测试。
Hystrix配置
对于Hystrix的配置同样可以在application.properties中配置,全局配置直接使用默认前缀hystrix.command.default
,如
# 设置熔断超时时间 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000 # 关闭Hystrix功能(不要和上面的配置一起使用) feign.hystrix.enabled=false # 关闭熔断功能 hystrix.command.default.execution.timeout.enabled=false
也可以直接对指定的接口进行配置,采用hystrix.command.default.<commandKey>
作为前缀,比如如/findAllUser
:
# 设置熔断超时时间 hystrix.command.findAllUser.execution.isolation.thread.timeoutInMilliseconds=10000 # 关闭熔断功能 hystrix.command.findAllUser.execution.timeout.enabled=false
对于重复的接口名会共用这一条Hystrix配置;
禁用Hystrix
上面的配置信息中,可以通过配置文件全局禁用Hystrix也可以指定接口禁用。我们也可以注解属性的方式禁用Hystrix;
- 构建一个关闭Hystrix的配置类
@Configuration public class DisableHystrixConfiguration { @Bean @Scope("prototype") public Feign.Builder feignBuilder(){ return Feign.builder(); } }
- 在
@FeignClient
注解中,通过configuration
参数引入上面实现的配置
@FeignClient(value = "USER-SERVICE",configuration = DisableHystrixConfiguration.class) public interface UserRafactorService extends UserService { }
服务降级配置
在Hystrix中我们可以直接通过@HystrixCommand注解的fallback参数进行配置降级处理方法,然而Feign对其进行封装,并提供了一种简单的定义方式:
1. 在之前的feign-consumer服务中创建一个UserServiceFallback类,该类实现UserService接口。这里对于哪个类接口的降级就实现哪个接口,
@Component public class UserServiceFallback implements UserService { @Override public List<User> findAll() { return null; } @Override public User finUserById(Long id) { return new User(-1L,"error",0); } @Override public User findUserHeader(String name, Long id, Integer age) { return new User(-1L,"error",0); } @Override public User insertUser(User user) { return new User(-1L,"error",0); } }
- 然后再@FeignClient注解中指定服务降级处理类即可:
@FeignClient(value = "USER-SERVICE",fallback = UserServiceFallback.class)
- 在配置文件中开启Hystrix:
feign: hystrix: enabled: true
然后在USER-SERVICE服务中将某个接口设置延迟测试:
请求压缩
Spring Cloud Feign支持对请求和响应进行GZIP压缩,以提高通信效率,配置方式如下:
# 配置请求GZIP压缩 feign.compression.request.enabled=true # 配置响应GZIP压缩 feign.compression.response.enabled=true # 配置压缩支持的MIME TYPE feign.compression.request.mime-types=text/xml,application/xml,application/json # 配置压缩数据大小的下限 feign.compression.request.min-request-size=2048
日志配置
SpringCloudFeign为每一个FeignClient都提供了一个feign.Logger实例。可以根据logging.level.<FeignClient>
参数配置格式来开启Feign客户端的DEBUG日志,其中<FeignClient>
为Feign客户端定义接口的完整路径。如:
logging:
level:
com.wqh.feign.service.UserService: debug
然后再主类中直接加入Looger.Level的Bean
@Bean public Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; }
这里也可以通过配置,然后在具体的Feign客户端来指定配置类实现日志。
日志级别有下面4类:
- NONE:不记录任何信息;
- BASIC:仅记录请求方法、URL以及响应状态码和执行时间;
- HEADERS:除了记录BASIC级别的信息外,还记录请求和响应的头信息;
- FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据等。