- 推荐序一
- 推荐序二
- 推荐序三
- 推荐语
- 前言
- 第1章 基础知识
- 第2章 微服务构建:Spring Boot
- 第3章 服务治理:Spring Cloud Eureka
- 第4章 客户端负载均衡:Spring Cloud Ribbon
- 第5章 服务容错保护:Spring Cloud Hystrix
- 第6章 声明式服务调用:Spring Cloud Feign
- 第7章 API网关服务:Spring Cloud Zuul
- 第8章 分布式配置中心:Spring Cloud Config
- 第9章 消息总线:Spring Cloud Bus
- 第10章 消息驱动的微服务:Spring Cloud Stream
- 附录 A Starter POMs
- 后记
Hystrix配置
在Spring Cloud Feign中,除了引入了用于客户端负载均衡的Spring Cloud Ribbon之外,还引入了服务保护与容错的工具Hystrix。默认情况下,Spring Cloud Feign会为将所有Feign客户端的方法都封装到Hystrix命令中进行服务保护。在上一节末尾,我们介绍重试机制的配置时,也提到了关于Hystrix的超时时间配置。那么在本节中,我们就来详细介绍一下,如何在使用Spring Cloud Feign时配置Hystrix属性以及如何实现服务降级。
全局配置
对于Hystrix的全局配置同Spring Cloud Ribbon的全局配置一样,直接使用它的默认配置前缀hystrix.command.default就可以进行设置,比如设置全局的超时时间:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=5000
另外,在对Hystrix进行配置之前,我们需要确认feign.hystrix.enabled参数没有被设置为false,否则该参数设置会关闭Feign客户端的Hystrix支持。而对于我们之前测试重试机制时,对于Hystrix的超时时间控制除了可以使用上面的配置来增加熔断超时时间,也可以通过 feign.hystrix.enabled=false 来关闭 Hystrix 功能,或者使用hystrix.command.default.execution.timeout.enabled=false来关闭熔断功能。
禁用Hystrix
上文我们提到了,在 Spring Cloud Feign 中,可以通过 feign.hystrix.enabled=false来关闭Hystrix功能。另外,如果不想全局地关闭Hystrix支持,而只想针对某个服务客户端关闭 Hystrix 支持时,需要通过使用@Scope("prototype")注解为指定的客户端配置Feign.Builder实例,详细实现步骤如下所示。
- 构建一个关闭Hystrix的配置类。
@Configuration
public class DisableHystrixConfiguration {
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder(){
return Feign.builder();
}
}
- 在HelloService的@FeignClient注解中,通过configuration参数引入上面实现的配置。
@FeignClient(name="HELLO-SERVICE",configuration=DisableHystrixConfiguration.class)
public interface HelloService {
...
}
指定命令配置
对于Hystrix命令的配置,在实际应用时往往也会根据实际业务情况制定出不同的配置方案。配置方法也跟传统的 Hystrix 命令的参数配置相似,采用 hystrix.command.<commandKey>作为前缀。而<commandKey>默认情况下会采用Feign客户端中的方法名作为标识,所以,针对上一节介绍的尝试机制中对/hello 接口的熔断超时时间的配置可以通过其方法名作为<commandKey>来进行配置,具体如下:
hystrix.command.hello.execution.isolation.thread.timeoutInMilliseconds=5000
在使用指定命令配置的时候,需要注意,由于方法名很有可能重复,这个时候相同方法名的Hystrix配置会共用,所以在进行方法定义与配置的时候需要做好一定的规划。当然,也可以重写Feign.Builder的实现,并在应用主类中创建它的实例来覆盖自动化配置的HystrixFeign.Builder实现。
服务降级配置
Hystrix提供的服务降级是服务容错的重要功能,由于Spring Cloud Feign在定义服务客户端的时候与Spring Cloud Ribbon有很大差别,HystrixCommand定义被封装了起来,我们无法像之前介绍Spring Cloud Hystrix时,通过@HystrixCommand注解的fallback参数那样来指定具体的服务降级处理方法。但是,Spring Cloud Feign提供了另外一种简单的定义方式,下面我们在之前创建的feign-consumer工程中进行改造。
- 服务降级逻辑的实现只需要为Feign客户端的定义接口编写一个具体的接口实现类。比如为HelloService接口实现一个服务降级类HelloServiceFallback,其中每个重写方法的实现逻辑都可以用来定义相应的服务降级逻辑,具体如下:
@Component
public class HelloServiceFallback implements HelloService {
@Override
public String hello(){
return "error";
}
@Override
public String hello(@RequestParam("name")String name){
return "error";
}
@Override
public User hello(@RequestHeader("name")String name,@RequestHeader("age")
Integer age){
return new User("未知",0);
}
@Override
public String hello(@RequestBody User user){
return "error";
}
}
- 在服务绑定接口HelloService中,通过@FeignClient注解的fallback属性来指定对应的服务降级实现类。
@FeignClient(name="HELLO-SERVICE",fallback=HelloServiceFallback.class)
public interface HelloService {
@RequestMapping("/hello")
String hello();
@RequestMapping(value="/hello1",method=RequestMethod.GET)
String hello(@RequestParam("name")String name);
@RequestMapping(value="/hello2",method=RequestMethod.GET)
User hello(@RequestHeader("name")String name,@RequestHeader("age")Integer age);
@RequestMapping(value="/hello3",method=RequestMethod.POST)
String hello(@RequestBody User user);
}
测试验证
下面我们来验证一下服务降级逻辑的实现。启动服务注册中心和feign-consumer,但是不启动 hello-service 服务。发送 GET 请求到http://localhost:9001/feign-consumer2,该接口会分别调用 HelloService 中的4个绑定接口,但因为hello-service服务没有启动,会直接触发服务降级,并获得下面的输出内容:
error
error
name=未知,age=0
error
正如我们在HelloServiceFallback类中实现的内容,每一个服务接口的断路器实际就是实现类中的重写函数的实现。
注意:在Brixton.SR5版本中,fallback的实现函数中不再支持返回com.netflix.hystrix.HystrixCommand 和 rx.Observable 类型的异步执行方式和响应式执行方式。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论