Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能保证在一个服务出问题的情况下不会导致整体服务失败,避免级联故障,提高分布式系统的弹性。
服务降级(FallBack)
Hystrix可以实现服务降级和熔断。“断路器”相当于一个开关,当某个服务发生故障后,会像调用方返回一个符合预期的、可处理的备选响应(FallBack
),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统中的蔓延乃至雪崩。
一般都在客户端处理降级,当然服务端也可以处理但是通常在客户端
1.feign开启降级
feign:hystrix:enabled: true
2.启动类添加注解
@EnableHystrix
3.在调用服务端接口的controller方法上添加降级注解
// fallbackMethod 是服务降级的方法,当发生降级就会调用该方法,注意该方法的参数需和本方法的参数一致
// 以下注解不只是超时会触发服务降级,当本方法发生运行时异常也会触发服务降级,如果想发生异常进行全局异常处理可以添加 ignoreExceptions = {
Exception.class} 属性进行排除
@HystrixCommand(fallbackMethod = "timeOut_handler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1000")})
以上name的值需要手写,也可以使用以下这个类
@HystrixCommand(fallbackMethod = "timeOut_handler",commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,value = "1000")}
4.在第3步只是针对一个方法做了服务降级,以下是全局降级
-
4.1在controller上添加注解
@DefaultProperties(defaultFallback = "default_hystrix",commandProperties = { @HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,value = "1500")})
-
4.2在具体方法上添加注解
@HystrixCommand,如果此时注解上加入了fallbackMethod
属性,那么以该注解为优先全局注解次之,如果没加表示该方法要走服务降级 使用的是全局的降级
5.业务逻辑和服务降级进行解耦。当在调用过程中服务方突然宕机,如果是使用的fegin可以使用@FeignClient
中的fallback
进行降级
-
5.1添加fallback要指定的降级类,实现调用接口类,重写要调用的方法,然后@FeignClient 添加 fallback
/** * 调用第三方的接口类 */ @Component @FeignClient(value = "cloud-payment-hystrix-service",fallback = PaymentHystrixService.class) public interface PaymentHystrixService { @GetMapping("payment/hystrix/ok/{id}")public String ok(@PathVariable("id") Integer id);@GetMapping("payment/hystrix/timeOut/{id}")public String timeOut(@PathVariable("id") Integer id); }/** * 调用第三方的接口类的降级类 */ @Component public class PaymentFallbackService implements PaymentHystrixService{ @Overridepublic String ok(Integer id) { return "调用方宕机";}@Overridepublic String timeOut(Integer id) { return "调用方宕机";} }
服务熔断(break)
相当于生活中的保险丝,当访问量达到最大量后,将拒绝访问,然后调用服务降级的方法返回友好提示。
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出的链路的某个微服务出错不可用或者响应时间太长时,会进行服务降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到节点微服务调用响应正常后,恢复调用链路
@HystrixCommand(fallbackMethod = "breaker_handler",commandProperties = {
@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"),@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "10000"),@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "60")})
1.断路器开关
2.请求总数
3.时间范围
4.错误百分比
在规定时间内请求总数达到峰值且达到错误百分比就会打开断路器。如果达不到峰值哪怕请求全部发生异常也不会打开断路器。当打开断路器后,就会进入fallbackMethod 指定的方法,断路器是打开状态所有请求都不会进行正常转发。一段时间之后(默认是5秒),这个时候断路器进入半开状态,会让一个请求进行转发,如果这个请求转发成功,会关闭断路器,之后恢复正常。