熔断机制是应对服务雪崩效应的一种微服务链路保护机制,当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回”错误”的响应信息。当检测到该节点微服务响应正常后恢复调用链路,在SpringCloud框架机制通过Hystrix实现,Hystrix会监控微服务见调用的状况,当失败的调用到一个阈值,缺省是5秒内20次调用失败就会启动熔断机制,熔断机制的注解是@HystrixCommand
![b93e6478377088762d7282fb8357486c.png](https://i-blog.csdnimg.cn/blog_migrate/6c810ca759b8612e7d1118959678bf7e.jpeg)
创建项目
1、添加依赖
<project
2、修改全局配置文件
spring.application.name=eureka-consumer-ribbon-breaker
server.port=9010
#设置服务注册中心地址,指向另一个注册中心
eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8761/eureka/
3、业务层代码
![d9ef350a99a2306d6b40c05c7cddd9d0.png](https://i-blog.csdnimg.cn/blog_migrate/639822b06cd1caee4bc0193bc4bdcb2e.jpeg)
@Service
4、启动类
![8f8dff96d099542df523b15bbdfafca8.png](https://i-blog.csdnimg.cn/blog_migrate/e5da4075075736889eac6dddbf9fb582.png)
5、测试,启动主程序,然后启动provider服务进行测试访问。
这是在10秒内一直异常访问的效果,此时已经达到要求,启动熔断器
![1f0d18ac724f3609732dac7a9808ad0b.png](https://i-blog.csdnimg.cn/blog_migrate/cb9c153700de838f568a31e5083cd356.png)
启动熔断器后再次访问,走的是默认5秒
![efb9068022cafd7b881f95427ca38e2d.png](https://i-blog.csdnimg.cn/blog_migrate/a6d188b96d655da88a1af34016c1f2ab.png)
![fdb986333444af64ac78d3a3a4d485ab.png](https://i-blog.csdnimg.cn/blog_migrate/c88c4ba8fa1f2bb76d61482d6984b684.png)
hystrix工作原理
![4881295bbfffd120cdfb887e0bda50e8.png](https://i-blog.csdnimg.cn/blog_migrate/ec5b02ed4f045e27ed49d897a4fc426b.png)
流程说明:
1:每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中.
2:执行execute()/queue做同步或异步调用,可参考文档。
Netflix/Hystrixgithub.com![c2b65098d274dcf9c92c2a52c3157bfa.png](https://i-blog.csdnimg.cn/blog_migrate/9754eeab1a4b20048725b364c4a121db.png)
3:判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤8,进行降级策略,如果关闭进入步骤4.
4:判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8,否则继续后续步骤.
5:调用HystrixCommand的run方法.运行依赖逻辑
5a:依赖逻辑调用超时,进入步骤8.
6:判断逻辑是否调用成功
6a:返回成功调用结果
6b:调用出错,进入步骤8.
7:计算熔断器状态,所有的运行状态(成功、失败、拒绝、超时)上报给熔断器,用于统计从而判断熔断器状态.
8:getFallback()降级逻辑.
以下四种情况将触发getFallback调用:
(1):run()方法抛出非HystrixBadRequestException异常。
(2):run()方法调用超时
(3):熔断器开启拦截调用
(4):线程池/队列/信号量是否跑满
8a:没有实现getFallback的Command将直接抛出异常
8b:fallback降级逻辑调用成功直接返回
8c:降级逻辑调用失败抛出异常
9:返回执行成功结果