首页 > 技术文章 > SpringCloud 整合Hystrix/Sentinel限流与熔断器

ruhuanxingyun 2020-08-23 21:49 原文

一、Hystrix

  简介:Hystrix是Netflix开源的一个延迟和容错库,旨在隔离远程系统、服务和第三方库,阻止级联故障,在复杂系统中实现恢复能力,负责监控服务之间的调用情况,连续多次失败的通过Feign的Fallback方法进行熔断保护。

  1. 来源

    A. 服务雪崩效应:在微服务中,服务间调用关系错综复杂,一个请求,可能需要调用多个微服务接口才能实现,会形成非常复杂的调用链路,服务器支持的线程和并发有限,请求一直阻塞,会导致服务资源耗尽,从而导致所有其他服务不可用,形成雪崩效应;

    B. 服务雪崩效应应对措施

      线程隔离:用一个线程池管理所有的服务请求和分发,Hystrix为每个服务依赖调用分配了一个小的线程池,如果线程池已满,调用将立即被拒绝,默认采用排队,加速失败判定时间,用户的请求不再直接访问服务,而是通过线程池中空闲线程访问服务,如果线程池已满或者请求超时,则会进行降级处理;

      服务降级:优先保证核心服务,而非核心服务不可用或弱可用,用户的请求故障时,不会被阻塞,更不会无休止的等待或者系统崩溃,至少可以看到友好的提示返回结果;

      服务熔断:见Hystrix工作原理;

  2. Hystrix工作原理

    A. 服务熔断器原理与电路熔断原理类似;

    B. 在分布式系统中,服务调用方需要判断哪些服务处理耗时,反应慢而超时或异常等,可以针对这些服务进行主动熔断,防止拖垮整个系统;

    C. Hystrix的服务熔断机制,可以实现弹性容错,当服务请求状况好转之后,可以自动重连;

    D. 通过断路的方式,将后续请求直接拒绝,默认5秒后允许部分请求通过,如果调用成功则回到熔断器关闭状态,否则继续打开,接着拒绝请求的服务。

  3. Hystrix的熔断状态机模型

    A. closed(关闭状态):所有请求都可以正常访问服务;

    B. open(打开状态):所有请求都会被降级,Hystrix会对请求进行计数,当一定时间内失败请求百分比达到阈值,则触发熔断,熔断器会完全打开。默认失败比例值为50%,请求次数不低于20次;

    C. half open(半开状态):熔断器若打开后进入休眠时间,默认5s,随后熔断器会自动进入半开状态,此时请求过来则会释放部分请求通过,若这些请求都是健康的,则会关闭熔断器,否则继续保持打开,再次进行休眠计时。

  4. pom.xml Maven依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

  5. application.yml 文件配置

hystrix:
    command:
        default:
            execution:
                timeout:
                    # 是否开启超时熔断
                    enabled: true
                isolation:
                    thread:
                        # 全局熔断超时时长,默认1秒
                        timeoutInMilliseconds: 5000 
            circuitBreaker:
                # 熔断触发最小请求次数
                requestVolumeThreshold: 20
                # 熔断后休眠时长,默认5s
                sleepWindowInMilliseconds: 5000
                # 触发熔断错误比例阈值,默认50%
                errorThresholdPercentage: 50

  6. Hystrix注解

    A. @EnableCircuitBreaker:开启熔断降级的配置;

    B. @HystrixCommand(fallbackMethod = "methodName"):声明一个降级逻辑的方法需注意熔断的降级逻辑方法必须跟正常逻辑的方法保持相同的参数列表和返回值声明;

    C. @DefaultProperties(defaultFallback = "defaultFallback"):在类上指明统一的失败降级方法,需注意该类中所有方法的返回值类型要与处理失败的方法返回类型一致,其中处理失败的方法没有参数。

可参考:Hystrix官方文档

 

二、Sentinel

  简介:Sentinel是面向分布式服务架构的轻量级流量控制组件,提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能,支持动态规则配置,并提供一个开源控制台。

  1. Sentinel了解

    A. 特点

      丰富的应用场景:秒杀、消息削峰填谷、集群流量控制、实时熔断下游不可用服务等;

      完备的实时监控:提供实时的监控功能,查看运行状态数据;

      广泛的开源生态:开箱即用,与其他框架进行整合;

      完善的SPI扩展点:通过扩展接口可以定制逻辑。

    B. Sentinel与Hystrix区别

      Hystrix关注点在于隔离和熔断为主的容错机制,超时或被熔断的调用将会快速失败,并提供了fallback机制;

      Sentinel关注点在于多样化的流量控制、熔断降级、系统负载保护、实时监控和控制台。

  2. pom.xml Maven依赖

<!-- Sentinel熔断降级限流 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- Feign服务调用 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- Feign fallback支持 -->
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-hystrix</artifactId>
    <version>11.0</version>
</dependency>

  3. application.yml 文件配置

spring:
  cloud:
    sentinel:
      enabled: true
      transport:
        dashboard: 192.168.103.10:8858
        port: 8719
        heartbeat-interval-ms: 3000
      # 服务启动直接建立心跳连接
      eager: true

# feign开启sentinel支持 feign: sentinel: enabled: true

  4. 注解

    A. @SentinelResource:

      value:资源名称,必须指明;

      blockHandler:异常处理函数,注意处理函数的传参必须与资源点的传参一样,并且最后加上BlockException参数,而且返回类型也一样;

      fallback:熔断降级处理函数,传参和返回值也必须保持一致;

      defaultFallback:默认熔断降级处理函数,函数默认需要和原方法在同一个类中;

      exceptionsToIgnore:忽略指定的异常处理。

    B. @SentinelRestTemplate:restTemplate服务调用注解。

  5. Sentinel Dashboard搭建

    A. Sentinel Docker部署

    B. 访问地址:http://localhost:8858;

    C. 控制台没有应用处理措施:客户端要接入控制台,除了添加依赖和文件配置外,还需要初始化客户端(即访问一次客户端接口,sentinel就会初始化完成并持续向控制台发送心跳包),或者禁用Sentinel的懒加载spring.cloud.sentinel.eager=true。

  6. 规则定义

    A. 流量控制规则

      resource(资源名):限流规则的作用对象,对于Java服务端开发而言就是执行的方法;

      limitApp(针对来源):流控限制的指定应用来源,default表示不区分调用来源;

      grade(阈值类型):限流阈值类型,分QPS或并发线程数;

      count:(单机阈值):限流阈值,单位时间内能按照规则通过的请求量;

      strategy(流控模式):调用关系限流策略,分直接、关联和链;

      controlBehavior(流控效果):流量控制效果,分快速失败、Warm Up和排队等待;

      clusterMode:true/flase是否集群;

  B. 熔断降级规则

    resource:资源名称;

    grade:降级策略 0 RT 1 异常⽐例 2 异常数;

    count:阈值;

    timeWindow:时间窗。

    C. 动态规则扩展:分文件配置规则、Nacos配置规则、Zookeeper配置规则、Apollo配置规则、Redis配置规则。

  7. 与Nacos集成(防止服务重启流控或降级数据丢失)

    A. 流控规则配置

  

    B. 降级规则配置

    C. 注意点

      如若一个资源同时有多个限流和降级规则,需要配置在一个json数组中;

      Nacos控制台修改规则,Sentinel不仅在内存中生效,Naocs持久化规则也生效,Sentinel重启后规则依然保持;

  8. 与OpenFeign集成:无论是Hystrix还是Sentinel,核心代码基本上是一致的,只需要修改依赖和配置文件即可。

可参考:Sentinel官网文档

 

推荐阅读