注:本文涉及代码,已上传至github:https://github.com/2NaCl/tensquare/tree/master
1. 熔断器Hystrix简介
在进行微服务开发的时候,基础服务的故障会导致多级故障,进而最后导致整个系统都无法继续使用,这种现象就是雪崩现象。服务雪崩的现象,是因为服务提供者的不可用导致服务消费者的不可用,并且将这种问题不断方法的结果,积少成多,聚沙成塔。
于是我们就可以使用熔断器Hystrix来隔离出现问题的微服务,以防出现级联故障,同时提供失败回退机制,让系统可以从微服务中进行恢复。
Hystrix的设计目标是什么?
- 回退任务,优雅降级
- 在等待中,快速失败并且迅速恢复
- 阻止故障的连锁反应
- 对来自依赖的延迟和故障进行防护和控制——这些依赖通常都是通过网络访问的
- 提供近实时的监控与告警
Hystrix遵循的设计原则是什么?
- 对feign管辖的事务进行容错保护
- 在复杂的分布式系统中,阻止某一个依赖服务的故障在整个系统中蔓延
- 提供fall-fast(快速失败)和快速恢复的支持
- 提供fallback优雅的降级的支持
Hystrix究竟做了什么?
我们用一个demo来说明:
Hystrix是依赖于Feign的,所以不需要额外引入依赖了
首先我们启动三个微服务:Eureka(EurekaApplication),使用Feign的模块(QaApplication),被其他模块使用Feign去远程服务调用的模块(BaseApplication)。注意开启的顺序,不然会报错。
然后我们正常访问使用Feign来远程调用的接口(在QaApplication模块里)
查询是可以成功的
并且可以发现通过注册中心Eureka自动触发了负载均衡
这证明我们的Feign生效了,那么如果我们将QaApplication所调用的模块BaseApplication关掉了会如何呢?
失败是肯定会失败的,但是我们发现,状态值竟然是200!!
这就是我们的熔断器产生了作用,没错,这样看似乎有些不太明显。那么我们来写一个证明Hystrix生效的接口实现类:
这是我们在QaApplication使用Feign的接口:
然后我们来写一个实现类,并且注入到容器
然后对于我们的接口进行一个的修改,为了让我们的实现类进行触发
最后,我们要在yml配置文件中打开我们的熔断器
然后重新运行QaApplication,可以发现,熔断器触发了