Hystrix介绍
在分布式环境中,不可避免地会有许多服务依赖项中的某些失败。Hystrix是一个库,可通过添加等待时间容限和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点,停止服务之间的级联故障并提供后备选项来实现此目的,所有这些都可以提高系统的整体弹性
Hystrix的作用是什么?
Hystrix旨在执行以下操作:
提供保护并控制延迟和失败,以及通过第三方客户端库(通常是通过网络)访问的依赖项的失败。停止复杂的分布式系统中的级联故障。快速失败并快速恢复。回退并在可能的情况下正常降级。启用近乎实时的监视,警报和操作控制。
Hystrix的作用是什么?
复杂的分布式体系结构中的应用程序具有数十种依赖关系,每种依赖关系不可避免地会在某个时刻失败。如果主机应用程序未与这些外部故障隔离开来,则可能会被淘汰。例如,对于依赖于30个服务的应用程序,其中每个服务的正常运行时间为99.99%,您可以期望:
99.99 ^30 = 99.7%的正常运行时间 10亿个请求中的0.3%= 3,000,000个故障 /每月2小时以上的停机时间,即使所有依赖项都具有出色的正常运行时间。 现实情况通常更糟。即使您没有对整个系统进行弹性设计,即使所有依赖项都能很好地执行,即使宕机0.01%,对数十种服务中的每一项的总影响也等于一个月可能会有几小时的宕机。当一切正常时,请求流如下所示:
当其中有一个系统有延迟时,它可能阻塞整个用户请求:
总结一下当系统中一条链路中的某个微服务出现了宕机的问题,如果没有处理这个问题就会导致系统这一条链路崩溃,进而引发其他通过此微服务的链路也崩溃导致整个系统宕机,豪猪哥Hystrix就可以去处理这一系列的问题,可以对微服务进行降级和熔断的操作让程序能够正常的执行下去。
服务熔断
服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。
<!--首先使用Hystrix要导入maven依赖,主启动类上加@EnableCircuitBreaker注解,开启服务熔断机制hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
下面的方法是说在1.5s以内调用的微服务没有给响应就启动熔断机制,调用自己的方法显示给用户让用户稍后再试,这样不会让用户一直处于等待加大负载
@GetMapping("/hystrix/timeout/{id}")
@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = { @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="1500")})
public String paymentInfoTimeOut(@PathVariable("id") Integer id){
String result = paymentHystrixService.paymentInfoTimeOut(id);
return result;
}
public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id)
{
return "我是消费者80,对方支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,o(╥﹏╥)o";
}
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
也可以使用这个注解声明一个全局的熔断回调方法这样不用一个方法对应一个回调方法很麻烦
// 下面是全局fallback方法
public String payment_Global_FallbackMethod()
{
return "Global异常处理信息,请稍后再试,/(ㄒoㄒ)/~~";
}
服务降级
服务降级处理是在客户端实现完成的,与服务端没有关系整体资源快不够了,忍痛将某些服务单元先关掉,关闭后还要返回一些可处理的备选方法,待渡过难关,再开启回来。
#开启feign的降级略,客户端是用openFeign来进行负载均衡的操作,openFeign支持hystrix的操作,只需引入openFeign的jar包
feign:
hystrix:
enabled: true
/**
* 当使用openFeign进行远程方法调用的时候,在其中添加一个fallback参数给定类当调用的服务停止了之后就进行降级
*/
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {
@GetMapping("/payment/hystrix/ok/{id}")
public String paymentInfoOk(@PathVariable("id") Integer id);
@GetMapping("/payment/hystrix/timeout/{id}")
public String paymentInfoTimeOut(@PathVariable("id") Integer id);
}
/**
* 加入到spring的容器中
*/
@Component
public class PaymentFallbackService implements PaymentHystrixService {
/**
* 方法名必须得一致
*/
@Override
public String paymentInfoOk(Integer id) {
return "-----PaymentFallbackService fall back-paymentInfoOk ,o(╥﹏╥)o";
}
@Override
public String paymentInfoTimeOut(Integer id) {
return "-----PaymentFallbackService fall back-paymentInfoTimeOut ,o(╥﹏╥)o";
}
}