Eclipse搭建Cloud组件Hystrix
Eclipse搭建Cloud组件Hystrix
服务容错保护:Spring Cloud Hystrix
在微服务架构中,存在着那么多的服务单元,若一个单元出现故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定。为了解决这样的问题,产生了断路器等一系列的服务保护机制。
断路器:在分布式架构中,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误的响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
针对上述问题,Spring Cloud Hystrix实现了断路器、线程隔离等一系列服务保护功能。它也是基于Netflix的开源框架Hystrix实现的,该框架的目标在于通过控制那些访问远程系统、服务和第三方库节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。
1、 为了测试Spring Cloud Hystrix,我们需要先搭建一个基础架构:
- eureka-hsp工程:服务注册中心,端口为9010
- register-hsp工程:会员服务单元,启动两个服务实例,端口分别为9011、9013,该服务中提供一个接口“/getRegister”,返回一个字符串信息。
- consumer-hsp工程:使用Ribbon实现的服务消费者,端口为9012,该服务中通过提供一个接口“/getConsumerr”,通过Ribbon调用register-hsp工程的“/ getRegister”接口。

2、在未加入断路器之前,关闭9011的实例,发送GET请求到http://localhost:9012/getConsumer,可以看到浏览器提示以下信息

3、然后引入Spring Cloud Hystrix。在consumer -hsp工程的pom.xml中引入spring-cloud-starter-hystrix依赖

4、在consumer-hsp工程的启动类中是使用@EnableCircuitBreaker注解开启断路器,这里还可以是所有SpringCloud应用中的@SpringCloudApplication注解来修饰启动类,进入该注解源码可以看到,该注解包含了上述我们所引用的三个注解,这也意味着一个Spring Cloud标准应用应包含服务发现以及断路器。)

5、改造服务消费方式,新增CustomerRibbonService类,注入RestTemplate实例。然后,将在CustomerController中对RestTemplate的使用迁移到新增的CustomerRibbonService类中,最后,在CustomerRibbonService类的getConsumer方法上增加@HystrixCommand注解来指定回调方法(注:不要忘记在启动类上添加对service层的扫描)



6、修改ConsumerController类,注入ConsumerRibbonService,实例,并在方法中调用/getConsumer

7、接下来验证一下通过断路器实现的服务回调逻辑,重新启动之前关闭的9011端口的register-hsp工程,确保此时服务注册中心、两个register-hsp以及customer-hsp均已启动,访问http://localhost:9012/getConsumer可以轮询两个register-hsp并返回信息。此时断开9011的register-hsp,然后访问http://loalhost:9012/getConsumer ,当轮询到9011服务端时,输出内容为error,不再是之前的错误内容,Hystrix的服务回调生效

8、除了通过断开具体的服务实例来模拟某个节点无法访问的情况之外,我们还可以模拟一下服务阻塞(长时间未响应)的情况。对register-hsp的/getRegister接口进行改装

9、重新启动register-hsp和consumer-hsp实例,连续访问http://localhost:9012/getConsumer几次,通过观察可以看到,当控制台输出的时间大于1000的时候,就会返回error,即服务消费者因调用的服务超时从而触发熔断请求,并调用回调逻辑返回结果,由此也可以猜测到Hystrix的默认超时时间为1000毫秒
a) :当时间未超过1000毫秒时;


b) :当时间超过1000毫秒时;


备注:多个register-hsp服务注册提供时,调用随机,负载均衡。
ps:学习引用☞Oven5217

浙公网安备 33010602011771号