1、什么是 Hystrix
在微服务架构中,服务与服务之间可以相互调用(RPC)。为保证高可用,服务多以集群部署。由于网络原因或者服务故障,服务无法正常调用,调用这个服务就会出现网络延迟。若此时有大量的请求,甚至可能导致服务“雪崩”。
Hystrix 是 Netflix 公司开源的一个项目,它提供了熔断器功能,能够阻止分布式系统中出现联动故障。Hystrix 是通过隔离服务的访问点阻止联动故障的,并提供了故障的解决方案,从而提高了整个分布式系统的弹性。
2、什么是服务雪崩?
微服务中,服务间调用关系错综复杂,一个请求,可能需要调用三个微服务接口才能实现,会形成非常复杂的调用链路。
当某个服务出现异常,就会造成请求阻塞,用户不会得到响应,对应的线程无法释放,当大量的用户请求到来,越来越多的线程会阻塞。
最后甚至把可用连接全都占满了,服务器支持的线程和并发数有限,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其他服务都不可用,形成雪崩效应。
3、Hystrix如何解决服务雪崩
服务降级
服务熔断
服务隔离
4、服务降级
优先保证核心服务,而非核心服务不可用或弱可用。
这样用户的请求故障时,不会被阻塞,更不会无休止的等待或者看到系统崩溃,至少可以看到一个执行结果(例如返回友好的提示信息)
服务降级有两种实现方式,一种是针对单个方法,一个是针对类下全部方法
4.1、指定某个服务降级处理逻辑
@HystrixCommand(fallbackMethod = "helloHystrix")
public String helloService() {
return restTemplate.getForObject("http://SERVICE-CLIENT/hello", String.class);
}
public String helloHystrix() {
return "服务繁忙,稍后再试!";
}
PS:降级逻辑方法要和正常逻辑具有相同的参数列表和返回值声明
4.2、类统一全局降级逻辑
为该类下所有方法统一处理服务降级,控制器上加上DefaultProperties注解并指定降级处理逻辑的方法:
@DefaultProperties(defaultFallback = "defaultCallBack")
public class HelloService {
@Autowired
RestTemplate restTemplate;
@HystrixCommand
public String helloService(String name) {
return restTemplate.getForObject("http://SERVICE-CLIENT/hello?name=" + name, String.class);
}
// 注意,这里不能写任何参数
public String defaultCallBack()
{
return "服务繁忙,稍后再试!";
}
}
4.3、设置Hystrix服务降级的超时时间
设置超时时间,有两