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 层都有了自己的兜底方法。)
@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 层方法,添加如下注解即可对该方法做服务熔断。
//服务熔断
@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 文件如下:

    <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. 给所有需要被监控的服务提供方导入监控依赖配置
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. 新版本 hystrix 需要在被监控微服务的主启动类上添加新的代理类如下:(否则会出现连接不上的提示)
@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
    在这里插入图片描述
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页