Netflix Hystrix是SOA/微服务架构中提供服务隔离、熔断、降级机制的工具/框架。Netflix Hystrix是断路器的一种实现,用于高微服务架构的可用性,是防止服务出现雪崩的利器。 在分布式架构中,一个应用依赖多个服务是非常常见的。如果其中一个依赖由于延迟过高发生阻塞,调用该服务的线程就会阻塞。如果相关业务的QPS较高,就可能产生大量阻塞,从而导致该应用/服务由于服务器资源被耗尽而拖垮。 关于服务雪崩、降级、熔断的概念请看这里:https://blog.csdn.net/qq_43753724/article/details/119948804
Hystrix具有隔离(线程池隔离、信号量隔离)服务降级、熔断、限流、缓存等功能,基本上能覆盖到微服务中调用依赖服务会遇到的问题。
限流就是信号量隔离(一般不会使用该模式)
出发快速失败,保证系统可用性。
使用回调方法返回托底数据。 Hystrix被设计的目标是:对通过第三方客户端访问的依赖项(通常通过网络)的延迟和故障进行保护和控制;在复杂的分布式系统中阻止级联故障;快速失败,快速回复;回退,尽可能优雅地降级;启用类似实时监控、警报和操作的控制。
这里将consul和web依赖都引入
<!--引入hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--consul client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!-- actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.properties:
@GetMapping("demo")
@HystrixCommand(fallbackMethod = "demoFallBack") //自定义熔断处理
public String demo(Integer id){
System.out.println("demo OK!!!");
if(id<=0){
throw new RuntimeException("无效id");
}
return "demo OK!!!";
}
//自己备选处理
public String demoFallBack(Integer id){
return "当前活动过于火爆,服务已经被熔断了!!!";
}
上述的fallbackMethod参数用来指定熔断时快速返回的处理方法,而当Id<0时抛出异常是为了模拟非法参数时服务熔断。 这里也可用默认的处理方法:
先启动consul,在cmd中consul agent -dev
随后启动项目,访问localhost:8500
查看服务是否注册成功
正常的参数访问
错误参数访问:
引入hystrix依赖
配置文件开启feign支持hystrix
在feign客户端调用加入fallBack指定降级处理
开发降级处理方法
项目结构:
在客户端配置文件中加入:feign.hystrix.enabled=true #开启openfeign支持降级
启动服务:
服务注册中心查看:
客户端用于测试的controller:
访问:localhost:8991/test
上图可看出,这时出发了Hystrix的fallback
现在我们直接将HystrixApplication这个服务停掉再次访问localhost:8991/test
访问前:
访问后:
即当调用服务不可用时,直接回执自定义默认处理。