由于网络原因或者自身的原因,微服务并不能保证服务百分之百可用。如果单个服务出现问题,则调用该服务时会出现延迟甚至调用失败的情况;若调用失败,用户则会重新刷新页面并尝试再次调用,再加上其他服务的调用,从而增加了服务器的负载,导致某个服务瘫痪,甚至整个服务崩溃。

什么是微服务容错保护

Hystrix库可以解决以下问题:

  • 对第三方接口/依赖服务潜在的调用失败提供保护和控制机制。
  • 在分布式系统中隔离资源,减低耦合,防止服务之间相互调用而导致级连失败。
  • 快速失败及迅速恢复。
  • 在合适的时机对服务进行优雅降级处理。
  • 对服务提供近乎实时的监控、报警和控制操作。

Hystrix是根据”断路器“模式创建的。”断路器“本身是一个开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个符合预期的服务降级处理,而不是长时间地等待或抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间不必要地占用,从而避免了故障在分布式系统中蔓延乃至崩溃。




微服务熔断后怎么回滚 微服务熔断原理_线程池


在请求失败频率较低的情况下,Hystrix还会直接把故障返回给客户端。只有当失败次数达到阈值(默认在20s内失败5次)时,断路器才会被打开并且不再进行后续通信,从而直接进行服务降级(ballback)处理。

Hystrix的开发和实现遵守设计理念:

  • 防止由于单个服务的故障,而耗尽整个系统容器(Tomcat,Jetty)的线程资源
  • 快速失败,而不是在队列中挤压服务请求
  • 提供服务降级(ballback)处理机制
  • 使用隔离技术(如舱壁隔离、泳道和断路器模式)来隔离服务依赖之间的影响
  • 通过实时的监控和告警,及时发现系统中的潜在问题
  • 通过配置更改可以优化低延迟传播的恢复时间,并且Hystrix支持大多数属性的动态更改,从而允许开发者可以实时对低延迟反馈循序进行修改和优化
  • 提供对整个所依赖客户端在执行过程中的故障保护与隔离,而不仅仅是网络流量

快速启动Hystrix

继续对之前的项目对修改

1、引入Hystrix

引入spring-cloud-starter-netflix-hystrix依赖包。


微服务熔断后怎么回滚 微服务熔断原理_断路器_02


2、开启Hystrix支持

在引导类中,增加@EnableCirCuitBreaker注解,开启对服务的荣作保护。


微服务熔断后怎么回滚 微服务熔断原理_springcloud 熔断_03


3、修改UserController实现

使用@HystrixCommand注解,该注解告诉服务调用者在调用失败时可以通过fallbackMethod参数指定的方法来实现服务降级处理。


微服务熔断后怎么回滚 微服务熔断原理_微服务熔断后怎么回滚_04


4、容错测试

当两个微服务正常注册时,请求返回正常


微服务熔断后怎么回滚 微服务熔断原理_微服务_05


微服务熔断后怎么回滚 微服务熔断原理_微服务熔断后怎么回滚_06


现在把USER-SERVICE服务下掉,继续调用,返回的结果getUserNameFallback的内容。


微服务熔断后怎么回滚 微服务熔断原理_微服务熔断后怎么回滚_07


微服务熔断后怎么回滚 微服务熔断原理_线程池_08


5、服务降级的两种实现方式

1.使用注解完成服务降级实现

使用注解可以最小程度地侵入代码,可以快速让原来的功能支持服务降级。使用时仅需在要需要服务降级处理的方法上增加@HystrixCommand注解即可,并通过fallbackMethod属性设置该方法在降级处理时所使用的方法,然后在降级方法中实现服务降级处理逻辑。

@HystrixCommand注解属性说明:

  • groupKey:设定HystrixCommand分组的名称。
  • commandKey:设定HystrixCommand的名称。
  • threadPoolKey:设定HystrixCommand执行线程池的名称。
  • fallbackMethod:设定HystrixCommand服务降级所使用的方法名称,注意该方法需要与主方法定义在同一个类中,并且方法签名也要一致。
  • commandProperties:设定HystrixComand属性,比如,断路器失败百分比、断路器时间窗口大小等。
  • threadPoilProperties:设定HystrixCommand所执行线程池的属性,比如,线程池的大小,线程池等待队列长度等。
  • ingoreExceptions:设定HystrixCommand执行服务降级处理时需要忽略的异常,当这些异常出现时不会执行服务降级处理。
  • observableExecutionMode:设置HystrixCommand执行的方式。
  • defaultFallback:设置HystrixCommand默认的服务降级处理方法,如同时设定了fallbackMethod,会优先使用fallbackMethod。

2.继承HystrixCommand完成服务降级实现

继承HystrixCommand的降级代码示例


微服务熔断后怎么回滚 微服务熔断原理_断路器_09


微服务熔断后怎么回滚 微服务熔断原理_springcloud 熔断_10


继承HystrixObservableCommand的降级代码实例


微服务熔断后怎么回滚 微服务熔断原理_微服务_11


微服务熔断后怎么回滚 微服务熔断原理_断路器_12


6、在Feign中使用Hystrix回退

@FeignClient增加fallback属性


微服务熔断后怎么回滚 微服务熔断原理_断路器_13


创建UserServiceFallback继承UserService


微服务熔断后怎么回滚 微服务熔断原理_springcloud 熔断_14


增加yml文件配置,开启feign中的hystrix功能


微服务熔断后怎么回滚 微服务熔断原理_断路器_15