Hystrix 重要概念和使用

分布式系统下,处理某个业务功能时,通常是存在服务调用链路的,即可能存在服务 A 调用服务 B,服务B调用服务C,从而完成一个服务。

如果只是调用链路中的某个微小服务不可用了,都可能导致整个业务功能无法提供服务。

Hystrix 能做什么?

而 Hystrix 框架能做服务降级、服务熔断和进行实时监控。

Hystrix 是什么?

Hystrix 是一个用于处理分布式系统的延迟和容错的开源库, 在分布式系统里,许多服务不可避免的会调用失败,比如超时、异常等,Hystrix 能够保证在一个服务出问题的情况下, 不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),**向调用方返回-个符合预期的、可处理的备选响应(FallBack) ,而不是长时间的等待或者抛出调用方无法处理的异常,**这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

服务降级(fallback)

服务降级是指给出现不可用的服务一条退路,不会因为该服务的不可用而导致服务调用链一直停留在此地。(假设某个服务不可用了,此时客户端可以自己准备一个本地的 fallback 回掉,返回一个缺省值,这样做,虽然服务水平下降,但好歹,比直接挂掉要强。

服务降级处理是在客户端实现完成的,与服务端没有关系。)

如我们常见的退路(fallback)是:服务器忙,请稍候再试,不让客户端长时间等待并立刻返回一个友好提示。

哪些情况下会触发降级?

  • 服务运行异常
  • 服务响应超时
  • 服务熔断触发服务降级
  • 线程池/信号量打满导致服务降级

服务熔断(break)

服务熔断是类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,之后的所有访问请求都会调用服务降级的方法并返回友好提示。

服务不能用 -> 服务降级 -> 进而熔断 -> 恢复调用链路

服务限流(flowlimit)

服务限流是指在秒杀高并发等场景中,把所有的访问请求排序,每秒钟只允许N个访问请求进入,有序的处理请求。

Hystrix 的服务降级功能怎么用(在服务客户端配置)

1、给每一个方法添加自己的降级方法

  1. 在主启动类上添加 @EnableCircuitBreaker 注解
  2. 在需要做服务降级的方法上添加 @HystrixCommand 注解(被服务降级的方法是 Controller 层的方法)
    在这里插入图片描述
  3. 然后创建 fallbackMethod 属性所规定的降级方法,在降级方法内做友好提示等。步骤二的代码表示只要该指定方法耗时超过 3 秒,则会立刻执行降级方法。(程序出异常等,也可以直接使用上述代码做服务降级,而不用修改 @HystrixProperty 注解指定的类。)

2、给所有方法统一添加全局的降级方法(防止代码膨胀)

    1. 给 service 层的接口新建一个 fallback 实现类,然后给 service 层接口添加如下类注解:
      在这里插入图片描述
    2. 编写 fallback 实现类代码:(这样每一个 service 层都有了自己的兜底方法。)
    3. @Component
      public class PaymentFallbackService implements PaymentHystrixService {
          @Override
          public String paymentInfo_OK(Integer id) {
              return "客户端 global-fallback 执行";
          }
      
          @Override
          public String paymentInfo_TimeOut(Integer id) {
              return "客户端 global-fallback 执行";
          }
      }

      Hystrix 的服务熔断功能怎么用(在服务提供方配置)

      1. 在服务提供方的 service 层方法,添加如下注解即可对该方法做服务熔断。
      2. //服务熔断
        @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
                @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),  //是否开启断路器
                @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),   //请求次数
                @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),  //时间范围
                @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失败率达到多少后跳闸
        })
        public String paymentCircuitBreaker(@PathVariable("id") Integer id){
            if (id < 0){
                throw new RuntimeException("*****id 不能负数");
            }
            String serialNumber = IdUtil.simpleUUID();
        
            return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
        }
        public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){
            return "id 不能负数,请稍候再试,(┬_┬)/~~     id: " +id;
        }

        当导致如上方法抛出异常的请求达到熔断点时,就会短期内所有请求都走服务降级的方法,然后再慢慢的恢复正常。

        断路器开启或者关闭的条件:

        1. 当满足一定阀值的时候(默认10 秒内超过 20 个请求次数)
        2. 当失败率达到一定的时候(默认10 秒内超过 50% 请求失败)
        3. 到达以上阀值,断路器将会开启
        4. 当开启的时候,所有请求都不会进行转发
        5. 一段时间之后(默认是 5 秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。重复4和5

        Hystrix 开启仪表盘进行系统实时监控(新建一个微服务,作为 Hystrix 的仪表盘)

        除了提供服务熔断、降级、限流功能以外,Hystrix 还提供 了准实时的调用监控 (Hystrix Dashboard),Hystrix 会持续地记录所有通过 Hystrix 发起的请求的执行信息,拟统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。Netflix 通过 hystrix-metrics-event-stream 项目实现了对以上指标的监控。Spring Cloud 也提供了 Hystrix Dashboard 的整合,对监控内容转化成可视化界面。

        1. 新建一个微服务,假设端口为 901, pom 文件如下:
        2. <dependencies>
                  <!--新增hystrix dashboard-->
                  <dependency>
                      <groupId>org.springframework.cloud</groupId>
                      <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-actuator</artifactId>
                  </dependency>
          
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-devtools</artifactId>
                      <scope>runtime</scope>
                      <optional>true</optional>
                  </dependency>
          
                  <dependency>
                      <groupId>org.projectlombok</groupId>
                      <artifactId>lombok</artifactId>
                      <optional>true</optional>
                  </dependency>
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-test</artifactId>
                      <scope>test</scope>
                  </dependency>
              </dependencies>
          
          </project>
          1. 给所有需要被监控的服务提供方导入监控依赖配置
          2. <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
          3. 新版本 hystrix 需要在被监控微服务的主启动类上添加新的代理类如下:(否则会出现连接不上的提示)
          4. @Bean
                public ServletRegistrationBean getServlet(){
                    HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
                    ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
                    registrationBean.setLoadOnStartup(1);
                    registrationBean.addUrlMappings("/hystrix.stream");
                    registrationBean.setName("HystrixMetricsStreamServlet");
                    return registrationBean;
                }
            1. 启动 hystrix 仪表盘微服务,启动路径为:http://localhost:901/hystrix,填写监控地址:http://ip地址:端口号/hystrix.stream。
            2. 开始调用被监控系统的服务。就会看到 hystrix 仪表盘进行变动。

            Hystrix 仪表盘查看说明

              1. 7 色
                在这里插入图片描述
                在这里插入图片描述
              2. 实心圆
                实心圆:共有两种含义。它通过颜色的变化代表了实例的健康程度,它的健康度从绿色<黄色<橙色<红色递减。该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过该实心圆的展示,就
                可以在大量的实例中快速的发现故障实例和高压力实例。
              3. 一线
                曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势。
              4. 整图说明
                在这里插入图片描述
                在这里插入图片描述
              5. 整图说明2
                在这里插入图片描述
posted @ 2020-10-18 03:54  King-DA  阅读(213)  评论(0编辑  收藏  举报