这里的熔断器与我们家庭生活中使用的保险丝差不多

保险丝是通过牺牲自己保护家庭电路

熔断器为了避免多个服务中的一个服务出现异常,而连带其余服务出现异常的情况而出现的。采用与保险丝类似的机制,但比保险丝要强

主页:https://github.com/Netflix/Hystrix/

工作机制

1525658640314

正常工作的情况下,客户端请求调用服务API接口:

1525658906255

当有服务出现异常时,直接进行失败回滚,服务降级处理:

1525658983518

当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果。

这就好比去买鱼,平常超市买鱼会额外赠送杀鱼的服务。等到逢年过节,超市繁忙时,可能就不提供杀鱼服务了,这就是服务的降级。

系统特别繁忙时,一些次要服务暂时中断,优先保证主要服务的畅通,一切资源优先让给主要服务来使用,在双十一、618时,京东天猫都会采用这样的策略。

结论:Hystrix熔断器,避免某个小服务宕机,导致整个系统级联宕机,从而导致整个系统挂了,可以有效保护其他服务正常提供服务

项目中使用

导入依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

开启熔断功能

千万注意在消费端开启,我们熔断相当于消费端的自我保护行为

1543873773671

加入节目效果

让服务端随机睡眠一阵,因为熔断机制决定了,触发时间是1秒

在service段增加一行代码:

image-20200819111714967

意为随机睡眠 1 - 2 s

熔断使用

将需要进行熔断的服务上添加 @HystrixCommand(fallbackMethod = “异常时执行方法名”),熔断的触发时间默认为1s,当我们的请求时间超过了1s,就会执行熔断中指定的方法,但是要求两个方法的参数、返回值,必须相同

消费端中添加

image-20200819112512871

image-20200819113348176

运行效果

录制_2020_08_19_11_49_00_21

至此,结束

注意

昨天我们曾经定义过重试机制,只要又请求超时了,就会重试,问题:

如果重试时间与熔断时间冲突怎么办?

熔断会先执行,重试机制名存实亡。

解决方式是调大熔断时间:

1
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=50