在微服务广泛使用的架构中,成群的服务通过服务注册与订阅来建立关联,但每个微服务都是独立的部分(跨进程,跨机器,跨机房),服务之间通过远程调用的方式相互访问,这种架构就增加了因为网络原因造成阻塞的风险,一旦发生阻塞,一个请求经过漫长的等待最终失败,高并发情况下就可能导致整个为服务群体瘫痪,就性能上,此种微服务架构还不如传统的集中式服务安全,稳定,性能高。为了解决这种问题,springcloud提供了断路器。
“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果。
在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
在Spring Cloud中使用了Hystrix 来实现断路器的功能。Hystrix是Netflix开源的微服务框架套件之一,该框架目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包,以及监控和配置等功能。
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,如下图:
说明断路器起了效果!
不需要在Feigh工程中引入Hystix,Feign中已经依赖了Hystrix,
新建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)