断路器 Hystrix

Spring Cloud Netflix Hystrix是分布式系统处理超时和错误的机制。
当某个微服务发生故障时,通过断路器的故障监控,向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。

断路器 Hystrix

断路器模式 (云计算设计模式)

断路器模式源于Martin Fowler的Circuit Breaker一文。
在分布式环境中,其中的应用程序执行访问远程资源和服务的操作,有可能对这些操作的失败是由于瞬时故障,如慢的网络连接,超时,或者被过度使用的资源或暂时不可用。这些故障一般之后的短时间内纠正自己。
所谓的断路器模式,就是当某个微服务发生故障时,通过断路器的故障监控,向调用方返回一个错误响应,而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。(来源于网上资料)

什么是 Hystrix?

Spring Cloud Netflix Hystrix是分布式系统处理超时和错误的机制。其服务失效判断阈值为 : 在Hystrix里默认是5秒内20个失败。

正常的分布式系统架构图(来源于Hystri官方文档)如下 :

若其中一个服务挂掉之后可能会导致其他调用业务服务的线程大量堵塞,最终导致整个系统瘫痪。Hystrix 允许开发人员提供错误提示信息并开启一个路由回调。如图(来源于Hystri官方文档) :

通过 Feign 使用 Hystri

Feign中已经依赖了Hystrix,所以我们直接调用即可,不必加入 Hystri 依赖。在上一次的 Fegin 工程中使用 Hystri。

  • 创建回调类并实现调用接口类

    1
    2
    3
    4
    5
    6
    7
    8
    @Component
    public class ServiceClientHystrix implements ServiceClient {
    @Override
    public String printf() {
    return "断路器 : 回调函数";
    }
    }
  • 使用@FeignClient注解中的fallback属性指定回调类

    1
    2
    3
    4
    5
    6
    7
    @Component
    @FeignClient(value = "my-service", fallback = ServiceClientHystrix.class)
    public interface ServiceClient {
    @RequestMapping("/service")
    String printf();
    }
  • 为了能够看到回调效果,我们设置 Hystri 的超时时间为1毫秒。在 application.properties添加属性:

    1
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=1
  • 依次启动”服务注册中心”、”服务提供者”、”服务消费者(Feign版)”,连续多次访问 http://localhost:2222/test

添加 Hystrix Dashboard 监控

  • 添加依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!-- Hystrix Dashboard 监控 -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
    </dependency>
  • 在启动类添加启动注解@EnableHystrixDashboard

  • 再次启动”服务消费者”,访问 http://localhost:2222/hystrix

  • 在URL中输入监控URL : http://localhost:2222/hystrix.stream 同时多次访问 http://localhost:2222/test 并观察监控仪表板的变化。

发现的问题

  • 问题描述:Fegin第一次启动请求失败?
  • 问题原因:首次请求往往会比较慢(Spring的懒加载机制,需要实例化一些类),因此请求时间往往大于 Hystrix 的默认超时时间(1秒)。
  • 解决方法:延长 Hystrix 的超时时间
    1
    2
    3
    4
    /**
    * default 是默认所有请求;具体某个请求则修改 default 为相应的访问即可
    */
    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000

参考资料

个人参考项目

个人参考项目 : https://github.com/FunriLy/springcloud-study/tree/master/%E6%A1%88%E4%BE%8B4

评论