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