相关推荐recommended
云原生微服务 Spring Cloud Hystrix 降级、熔断实战应用
作者:mmseoamin日期:2023-12-05

系列文章目录

第一章 Java线程池技术应用

第二章 CountDownLatch和Semaphone的应用

第三章 Spring Cloud 简介

第四章 Spring Cloud Netflix 之 Eureka

第五章 Spring Cloud Netflix 之 Ribbon

第六章 Spring Cloud 之 OpenFeign

第七章 Spring Cloud 之 GateWay

第八章 Spring Cloud Netflix 之 Hystrix


文章目录

  • 系列文章目录
  • 前言
  • 1、Hystrix概念
  • 2、Hystrix作用
    • 2.1、服务降级
    • 2.2、服务熔断
    • 3、案例
      • 3.1、服务提供端降级
        • 3.1.1、修改pom.xml配置依赖
        • 3.1.2、在微服务方法上添加降级注解代码
        • 3.1.3、在启动类加上注解
        • 3.2、消费端降级
          • 3.2.1、修改pom.xml配置依赖
          • 3.2.2、修改application.yml配置
          • 3.2.3、在消费端方法上添加代码
          • 3.2.4、在消费端启动类上加上注解
          • 3.3、全局降级
          • 3.4、解耦降级
            • 3.4.1、修改application.yml
            • 3.4.2、在方法上修改
            • 3.5、服务熔断
              • 3.5.1、Hystrix 实现服务熔断的步骤
              • 3.5.2、实例
              • 总结

                前言

                云原生微服务 Spring Cloud Hystrix 降级、熔断实战应用,在这里插入图片描述,第1张

                多个微服务之间调用的时候,假如微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的"扇出"。


                如果扇出的链路上某个微服务的调用响应的时间过长或者不可用,对微服A的调用就会占用越来越多的系统资源,进而引起系统崩溃,即"雪崩效应"。


                这时就需要一个组件(hytrix),来保证微服务出现故障时,不会导致整个系统出现雪崩效应,以提高分布式系统弹性。

                云原生微服务 Spring Cloud Hystrix 降级、熔断实战应用,在这里插入图片描述,第2张

                1、Hystrix概念

                • Hystrix是一个用于处理分布式系统的延迟和容错的开源库,可以保证一个服务出现故障时,不会导致整个系统出现雪崩效应,以提高分布式系统弹性;
                • 作为“断路器”,在一个服务出现故障时,可以通过短路器监控,返回一个可以处理的响应结果,保证服务调用线程不会长时间被占用,避免故障蔓延

                  2、Hystrix作用

                  2.1、服务降级

                  当某个服务单元发生故障后,通过断路器的故障监控,向调用方法返回一个服务预期的、可处理的备选响应,而不是长时间的等待或者抛出调用方法无法处理的异常,避免了故障在分布式系统中的蔓延。

                  云原生微服务 Spring Cloud Hystrix 降级、熔断实战应用,在这里插入图片描述,第3张

                  2.2、服务熔断

                  当某个服务单元发生故障后,通过断路器的故障监控,直接返回一个预设的失败响应,而不是长时间的等待或者抛出调用方法无法处理的异常,避免了故障在分布式系统中的蔓延。

                  云原生微服务 Spring Cloud Hystrix 降级、熔断实战应用,在这里插入图片描述,第4张

                  3、案例

                  3.1、服务提供端降级

                  3.1.1、修改pom.xml配置依赖

                  
                      org.springframework.cloud
                      spring-cloud-starter-netflix-hystrix
                      2.2.10.RELEASE
                  
                  

                  3.1.2、在微服务方法上添加降级注解代码

                  //超过3秒钟降级到userInfoListFallBack
                  @HystrixCommand(fallbackMethod = "userInfoListFallBack",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds"
                          ,value = "3000")})
                  
                  • 参数 fallbackMethod 属性用于指定降级方法。
                  • 参数 execution.isolation.thread.timeoutInMilliseconds 用于设置自身调用超时时间的峰值,峰值内可以正常运行,否则执行降级方法

                    3.1.3、在启动类加上注解

                    @EnableHystrix
                    

                    3.2、消费端降级

                    3.2.1、修改pom.xml配置依赖

                    
                        org.springframework.cloud
                        spring-cloud-starter-netflix-hystrix
                        2.2.10.RELEASE
                    
                    

                    3.2.2、修改application.yml配置

                    hystrix:
                      command:
                        default:
                          execution:
                            isolation:
                              thread:
                                timeoutInMilliseconds: 3000
                    

                    3.2.3、在消费端方法上添加代码

                    @HystrixCommand(fallbackMethod = "fallbackMethod")
                    

                    3.2.4、在消费端启动类上加上注解

                    @EnableHystrix
                    

                    3.3、全局降级

                    @RestController
                    @RequestMapping("/user")
                    @DefaultProperties(defaultFallback = "globalFallback")
                    @Slf4j
                    public class UserConsumer {
                    	@GetMapping("/userInfoList")
                    	@HystrixCommand
                    	public List userInfoList(){
                    	}
                    }
                    

                    3.4、解耦降级

                    不管是业务方法指定的降级方法还是全局降级方法,它们都必须和业务方法在同一个类中才能生效,业务逻辑与降级逻辑耦合度极高。

                    3.4.1、修改application.yml

                    feign:
                    #  hystrix:
                    #    enabled: true
                      circuitbreaker:
                        enabled: true
                    

                    3.4.2、在方法上修改

                    @FeignClient(value = "USER-SERVICE",fallback = UserServiceFallBack.class)
                    
                    public class UserServiceFallBack implements UserService{
                    

                    3.5、服务熔断

                    熔断机制是为了应对雪崩效应而出现的一种微服务链路保护机制。

                    在熔断机制中涉及了三种熔断状态

                    • 熔断关闭状态(Closed):当服务访问正常时,熔断器处于关闭状态,服务调用方可以正常地对服务进行调用。
                    • 熔断开启状态(Open):默认情况下,在固定时间内接口调用出错比率达到一个阈值(例如 50%),熔断器会进入熔断开启状态。进入熔断状态后,后续对该服务的调用都会被切断,熔断器会执行本地的降级(FallBack)方法。
                    • 半熔断状态(Half-Open): 在熔断开启一段时间之后,熔断器会进入半熔断状态。在半熔断状态下,熔断器会尝试恢复服务调用方对服务的调用,允许部分请求调用该服务,并监控其调用成功率。如果成功率达到预期,则说明服务已恢复正常,熔断器进入关闭状态;如果成功率仍旧很低,则重新进入熔断开启状态。

                      云原生微服务 Spring Cloud Hystrix 降级、熔断实战应用,在这里插入图片描述,第5张

                      3.5.1、Hystrix 实现服务熔断的步骤

                      • 当服务的调用出错率达到或超过 Hystix 规定的比率(默认为 50%)后,熔断器进入熔断开启状态。
                      • 熔断器进入熔断开启状态后,Hystrix 会启动一个休眠时间窗,在这个时间窗内,该服务的降级逻辑会临时充当业务主逻辑,而原来的业务主逻辑不可用。
                      • 当有请求再次调用该服务时,会直接调用降级逻辑快速地返回失败响应,以避免系统雪崩。
                      • 当休眠时间窗到期后,Hystrix 会进入半熔断转态,允许部分请求对服务原来的主业务逻辑进行调用,并监控其调用成功率。
                      • 如果调用成功率达到预期,则说明服务已恢复正常,Hystrix 进入熔断关闭状态,服务原来的主业务逻辑恢复;否则 Hystrix 重新进入熔断开启状态,休眠时间窗口重新计时,继续重复第 2 到第 5 步。
                        参数描述
                        metrics.rollingStats.timeInMilliseconds统计时间窗。
                        circuitBreaker.sleepWindowInMilliseconds休眠时间窗,熔断开启状态持续一段时间后,熔断器会自动进入半熔断状态,这段时间就被称为休眠窗口期。
                        circuitBreaker.requestVolumeThreshold请求总数阀值。

                        在统计时间窗内,请求总数必须到达一定的数量级,Hystrix 才可能会将熔断器打开进入熔断开启转态,而这个请求数量级就是 请求总数阀值。Hystrix 请求总数阈值默认为 20,这就意味着在统计时间窗内,如果服务调用次数不足 20 次,即使所有的请求都调用出错,熔断器也不会打开。
                        circuitBreaker.errorThresholdPercentage错误百分比阈值。

                        当请求总数在统计时间窗内超过了请求总数阀值,且请求调用出错率超过一定的比例,熔断器才会打开进入熔断开启转态,而这个比例就是错误百分比阈值。错误百分比阈值设置为 50,就表示错误百分比为 50%,如果服务发生了 30 次调用,其中有 15 次发生了错误,即超过了 50% 的错误百分比,这时候将熔断器就会打开。

                        3.5.2、实例

                        @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
                                @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器
                                @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value = "10000")//时间窗口10秒
                                @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数
                                @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "30000"), // 时间窗口期
                                @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸
                        })
                        
                        public interface UserService {
                            public String paymentCircuitBreaker(@PathVariable("id") Integer id);
                        }
                        
                        @Service
                        public class UserServiceImpl implements UserService {
                            @Override
                            @HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback",commandProperties = {
                                    @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器
                                    @HystrixProperty(name = HystrixPropertiesManager.METRICS_ROLLING_STATS_TIME_IN_MILLISECONDS,value = "10000"),
                                    @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),// 请求次数
                                    @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "30000"), // 时间窗口期
                                    @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸
                            })
                            public String paymentCircuitBreaker(Integer id) {
                                if(id < 0)        {
                                    throw new RuntimeException("******id 不能负数");
                                }
                                String serialNumber = UUID.randomUUID().toString();
                                return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
                            }
                            
                            public String paymentCircuitBreakerFallback(@PathVariable("id") Integer id) {
                                return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~   id: " +id;
                            }
                        }
                        

                        总结

                        Hystrix是Netflix开源的一个用于处理分布式系统的延迟和容错的库,通过资源隔离、服务降级和熔断等方法,提高分布式系统的可用性和稳定性。在本章节中, 介绍了Hystrix具体方法上熔断、全局熔断案例,通过实战演练让大家更容易理解Hystrix断路器的作用。