Spring Cloud学习笔记(五)-熔断器Hystrix介绍以及Feign,RestTemplate的熔断配置

说明:本文仅作为本人学习<<深入理解Spring Cloud与微服务构建>>一书的学习笔记,所有代码案例及文字描述均参考该书,不足之处,请留言指正,不胜感激.
一.什么是Hystrix,能干什么?
  分布式系统中服务与服务之间相互依赖,一种不可避免的情况就是当某些服务出现故障时,依赖于它们的其他服务出现远程调度的线程阻塞,在高并发的情况下,可能在几秒钟内就会使整个服务处于线程负载饱和状态,从而从一个服务不可用扩散到整个服务不可用,既雪崩效应.Hystrix是Netflix公司开源的一个项目,它提供了熔断器功能,能够阻止分布式系统中的联动故障.

二.Hystrix的设计原则.
  a.防止单个服务的故障耗尽整个服务的线程资源.
  b.快速失败机制,如果某个服务出现故障,则调用该服务的请求快速失败,而不是线程等待.
  c.提供回退方案,在请求发生故障时,执行设定好的回退方案.
  d.通过隔离服务的访问点来阻止联动故障,防止故障扩散到其他服务,从而提高整个分布式系统的可用性.

三.Hystrix的工作机制
  首先,当服务的某个API接口的失败次数在一定时间内小于设定的阀值时,熔断器处于关闭状态,该API接口正常提供服务.当API接口处理请求的失败次数大于设定的阀值时,Hystrix判定该API接口出现故障,打开熔断器,这时请求该API接口会执行快速失败逻辑(即fallback回退逻辑),请求的线程不会处于阻塞状态.处于打开状态的熔断器,一段时间后会处于半打开的状态,并将一定数量的请求执行正常逻辑.剩余的请求会执行快速失败,若执行正常逻辑的请求失败了,则熔断器继续打开;若成功了,则将熔断器关闭.这样熔断器就具有了自我修复的能力.
四.在Feign上使用熔断器
  Feign的起步依赖中已经加入了Hystrix的依赖(可以在maven中点击feign的依赖查看),所以在Feign中使用Hystrix不需要引入任何的依赖,只需要在application.yml中配置开启Hystrix的功能,如下:

feign:
   hystrix:
       enabled: true

然后在@FeignClient注解的fallback配置上快速失败的处理类.该处理类作为Feign熔断器的逻辑处理类,必须实现被@FeignClient修饰的接口.最后将该Bean注入到IoC容器中.代码如下:
这里写图片描述
ProducerServerHystrix作为熔断器的逻辑处理类,需要实现ProducerServerFeign接口,并需要在hi方法中写下处理熔断的具体逻辑,最后别忘了加上@Component注解,将该类交给Spring来管理.
这里写图片描述
启动服务,正常情况下访问是可以的,此时我们关闭producer-server服务,让它处于不可用状态,再到浏览器访问,浏览器就会显示:
这里写图片描述
由此可见,当远程服务不可用时进入到了fallback的逻辑处理类(HelloHystrix),由这个类来执行熔断器打开时的处理逻辑.
五.在RestTemplate上使用熔断器
首先,我们需要引入Hystrix的起步依赖spring-cloud-starter-hystrix,代码如下:

<dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

如果我们先引入了Feign的起步依赖,里面包含了Hystrix的依赖,那么我们在使用RestTemplate的熔断器时需要再次引入该依赖不?答案是需要的,因为我们需要使用的@HystrixCommand在该依赖中提供.
接着,我们在启动类上加上@EnableHystrix注解开启熔断器功能:
这里写图片描述
最后,我们修改RestTemplate的远程调用方法hi(),加上@HystrixCommand注解,这样hi()方法就加入了熔断器功能.其中fallbackMethod是回退的逻辑方法,如下:
这里写图片描述
我们关闭生产者服务,发现程序执行了熔断逻辑,说明配置成功.
这里写图片描述

猜你喜欢

转载自blog.csdn.net/fly_zhaohy/article/details/80669026
今日推荐