zoukankan      html  css  js  c++  java
  • 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()+"	"+"调用成功,流水号:"+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
                  在这里插入图片描述
  • 相关阅读:
    四月书籍
    iOS 第三方登录之 QQ登录
    百度面试经验之谈 ----------转
    OC浅析一
    书目列表
    UIStroryboard分类
    ios基础笔记(一)
    IOS笔记-代码块(微博项目)-1.0
    IOS控件内容 对齐方式
    android同一个TextView设置不同颜色字体
  • 原文地址:https://www.cnblogs.com/qingmuchuanqi48/p/13833361.html
Copyright © 2011-2022 走看看