springcloud实战之7 断路器(Hystrix)

xiaoxiao2021-02-28  15

在微服务广泛使用的架构中,成群的服务通过服务注册与订阅来建立关联,但每个微服务都是独立的部分(跨进程,跨机器,跨机房),服务之间通过远程调用的方式相互访问,这种架构就增加了因为网络原因造成阻塞的风险,一旦发生阻塞,一个请求经过漫长的等待最终失败,高并发情况下就可能导致整个为服务群体瘫痪,就性能上,此种微服务架构还不如传统的集中式服务安全,稳定,性能高。为了解决这种问题,springcloud提供了断路器。

断路器简介

“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果。

在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。

在Spring Cloud中使用了Hystrix 来实现断路器的功能。Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。

改造springcloud-consumer-ribbon项目

添加依赖

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

改造service接口

@Service("restfulSerivce") public class RestfulServiceImpl { @Autowired private RestTemplate restTemplate ; @HystrixCommand(fallbackMethod = "serviceFallback") public String getRestData(){ return restTemplate.getForObject("http://springcloud-producer-rest/api/rest/info",String.class) ; } public String serviceFallback() { return "hi,sorry,error!"; } }

启动项目

1.启动springcloud-eureka-server集群,端口分别为 8080,8090

2.启动springcloud-producer-rest,端口分别为 8001

3.启动springcloud-consumer-ribbon,端口 8002

启动服务图如下:

访问http://localhost:8002/api/rest/home服务图如下:

此时停掉springcloud-producer-rest服务,再次访问接口http://localhost:8002/api/rest/home,如下图:

说明断路器起了效果!

改造springcloud-consumer-feign项目

添加依赖

不需要在Feigh工程中引入Hystix,Feign中已经依赖了Hystrix,

改造service层接口

@FeignClient(value = "springcloud-producer-rest",fallback = SchedualRestServiceHystrix.class) public interface ISchedualRestService { @GetMapping("/api/rest/info") String info() ; }

新建SchedualRestServiceHystrix.java,继承ISchedualRestService

@Service(value = "schedualRestService") public class SchedualRestServiceHystrix implements ISchedualRestService{ @Override public String info() { return "error,this is Hystrix return"; } }

启动服务

1.启动springcloud-eureka-server集群,端口分别为 8080,8090

2.启动springcloud-producer-rest,端口分别为 8001

3.启动服务消费者springcloud-consumer-feign。端口 8003

测试结果如下图:

源码

springcloud-server-eureka

springcloud-producer-rest

springcloud-consumer-feign

springcloud-consumer-ribbon

历史文章

springcloud实战之高可用服务注册中心(eureka集群)

springcloud实战之服务注册与发现(eureka实现)

springcloud实战之技术选型:dubbo还是springcloud

springboot实战之服务消费者(ribbon)

springcloud实战之服务消费者(Feign)

转载请注明原文地址: https://www.6miu.com/read-1650330.html

最新回复(0)