在微服务架构中,存在着那么多的单元,若一个单元初夏故障,就很容易因依赖关系而引发故障的蔓延,最终导致整个系统的瘫痪,这样的架构相较传统架构更加不稳定,为了解决这样的问题,产生了断路器等一系列的服务保护机制
“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路中时,“断路器”能够及时切断故障电路,防止发生过载,发热设置起火等严重后果。
在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器放生短路)之后,通过断路器的故障监控(类似熔断保险丝),像调用方返回一个错误响应,而不是漫长的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。
Spring Cloud Hystrix实现了断路器、线程隔离等一系列服务保护功能。他也是基于Netflix的开源框架Hystrix实现的,该框架的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。
在main方法中加注解
/**
* 开启断路器功能
*/
@EnableCircuitBreaker
@HystrixCommand
public String helloService(){
return restTemplate.getForEntity("http://hello-server/hello",String.class).getBody();
}
在调用方法时加注解@HystrixCommand(fallbackMethod = "helloFallback")【参数为调用方法】。@HystrixCommand注解可以优雅的定义Hystrix命令的实现,但是如上定义的方法helloService()只是同步执行的实现,若要实现异步执行则还需另外定义,比如:
@HystrixCommand
public Future<String> asnyc(){
return new com.netflix.hystrix.contrib.javanica.command.AsyncResult<String>() {
@Override
public String invoke() {
return restTemplate.getForEntity("http://hello-server/hello",String.class).getBody();
}
};