在 Spring Cloud Feign 中,除了引入了用于客户端负载均衡的 Spring Cloud Ribbon 之外,还引入了服务保护与容错的工具 Hystrix。
一、准备工作
请参考:Spring Cloud Feign 服务调用组件1:使用负载均衡 Ribbon
我们基于参考文章项目进行改造。
二、开启 Hystrix 断路器
编辑项目的 application.properites 文件,添加如下相关配置:
#开启Hystrix支持
feign.hystrix.enabled=true
如果需要关闭可以设置为 false。还可以关闭某个服务客户端 Hystrix 支持。通过使用 @Scope("prototype") 注解为指定的客户端配置 Feign.Builder 实例。
@Configuration
public class DisableHystrixConfiguration {
@Bean
@Scope("propotype")
public Feign.Builder feignBuilder() {
return Feign.builder();
}
}
我们可以通过 configuration 参数引入上面实现的配置来关闭 Hystrix 支持。
@FeignClient(name = "piao-client", configuration = DisableHystrixConfiguration.class)
public interface ConsumerService {
@RequestMapping("/client")
String client();
@RequestMapping("/param")
String param(@RequestParam String param);
}
三、超时配置
使用 Hystrix 的默认配置前缀 hystrix.command.default 配置。
全局配置:
#设置全局的超时时间为5秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
指定方法配置:
使用 hystrlx.command.<commandKey> 作为前缀。而 <commandKey> 默认情况下会采用 Feign 客户端中的方法名作为标识。这里我使用一下这个方法来编写配置示例。
由于方法名很有可能重复,这个时候相同方法名的 Hystrix 配置会共用,所以在进行方法定义与配置的时候需要做好一定的规划。也可以重写 Feign.Builder 的实现,并在应用主类中创建它的实例来覆盖自动化配置的 HystrixFeign.Builder 实现。
#设置/hello接口的超时时间为5秒
hystrix.command.param.execution.isolation.thread.timeoutInMilliseconds=5000
四、服务降级配置
Feign 的服务降级很假单,是通过 @FeignClient 注解的 fallback 属性来指定对应的服务降级实现类。
4.1、编写服务降级实现类
public class ConsumerHystrix implements ConsumerService {
@Override
public String client() {
return "client is error";
}
@Override
public String param(String param) {
return "param is error";
}
}
4.2、指定服务降级实现类
@FeignClient(name = "piao-client", fallback = ConsumerHystrix.class)
public interface ConsumerService {
@RequestMapping("/client")
String client();
@RequestMapping("/param")
String param(@RequestParam String param);
}
4.3、启动应用
我们访问注册中心地址:http://127.0.0.1:2000/
这里我们只启动 Feign 客户端一个服务,所谓消费者无法调用服务提供者,因此会抛出异常。
访问地址:http://127.0.0.1:2007/consumer
访问地址:http://127.0.0.1:2007/param?param=piao