Spring Cloud Hystrix【应用篇】

参考资料:
Hystrix GitHub 官方文档 https://github.com/Netflix/hystrix


Hystrix Wiki 文档 https://github.com/Netflix/Hystrix/wiki


Spring Cloud 文档 https://cloud.spring.io/spring-cloud-static/Greenwich.SR1/single/spring-cloud.html#spring-cloud-feign-hystrix

Hystrix 封装对象回顾

在上一篇Spring Cloud Hystrix【理论篇】 中,提到 Hystrix 提供了两种封装对象 HystrixCommandHystrixObservableCommand

他们分别提供了四种执行方式:

  • execute()

  • queue()

  • observe()

  • toObservable()

官方针对这四种执行方式给定了说明:

the first two are only applicable to simple HystrixCommand objects and are not available for the HystrixObservableCommand

通过查看源码也能够知道 execute() 和 queue() 只在 HystrixCommand 中有定义,是 HystrixCommand 的专属方法。而 HystrixObservalbeCommand 没有定义。

但是通过查看源码,我们能够得知:HystrixCommand 和 HystrixObservableCommand 都继承了抽象类 AbstractCommand。而 HystrixCommand 中的 execute() 和 queue() 最终调用的是 AbstractCommand 中的 toObservable().toBlocking().toFuture() 。

HystrixCommand 和 HystrixObservableCommand 都有各自的实现方式,但是最终都是调用的 AbstractCommand 中的方法实现。

测试前提

版本:spring boot 2.1.5、Hystrix 1.5.18 、spring cloud Greenwich.SR1

提供一个简单的 web 业务处理接口 http://localhost:9527/hello-world/{name}

@RequestMapping("/hello-world/{name}")public String helloWrold(@PathVariable String name){ System.err.println("---->Hello world " + name); return "Hello World " + name;}

编码方式使用 HystrixCommand 和 HystrixObservableCommand

HystrixCommand 包裹业务执行方法 “ 调用 hello-world 接口”

进行单元测试

Spring Cloud Hystrix【应用篇】

HystrixObservableCommand 包裹业务执行方法 “ 调用 hello-world 接口”

Spring Cloud Hystrix【应用篇】

执行单元测试

Spring Cloud Hystrix【应用篇】

在 web 开发中(spring mvc),我们来对比一下普通的业务调用和使用编码方式之后的业务调用。

Spring Cloud Hystrix【应用篇】

使用 Hystrix 编码方式进行web开发带来的问题:

  • 1、耦合高。业务方法需要耦合到 HystrixCommand 对象中

  • 2、代码量大。每一个使用 HystrixCommand 对象封装的 API 接口都需要定义一个新的 HystrixCommand封装类

注解方式使用 HystrixCommand 和 HystrixObservableCommand

注解方式使用 HystrixCommand 封装业务接口

同步调用

Spring Cloud Hystrix【应用篇】

异步调用

Spring Cloud Hystrix【应用篇】

注解方式使用 HystrixObservableCommand

observe()

Spring Cloud Hystrix【应用篇】

toObservalbe()

Spring Cloud Hystrix【应用篇】

Hystrix 集成 Feign

Feign 整合 hystrix

  • step1、开启 feign 对于 hystrix 的支持

    feign 手动开启 hystrix
    feign.hystrix.enabled=true

  • step2、注解开启 feign 和 hystrix

    @EnableFeignClients
    @EnableCircuitBreaker

Feign 中使用 hystrix 功能

1、声明方法调用熔断 fallback 方法

Spring Cloud Hystrix【应用篇】

2、feign client 使用 hystrix fallback 方法

Spring Cloud Hystrix【应用篇】

通过全局配置 hystrix  策略

如:(更多配置参考 Hystrix 官方配置()

hystrix 全局配置超时时间:1000ms
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 1000

特定接口进行细粒度控制

Feign 整合 hystrix 过程 只需通过引入 feign 依赖和 hystrix 依赖,开启 feign 熔断之后,spring boot 会自动进行配置。

之后我们可以通过在 application.properties 或者 Bean 的方式进行 hystrix 的全局策略配置。

在开发过程中,大部分接口的配置使用相同的 hystrix 配置策略即可,但是在特定的场合中,如:某个接口的运行时间相对较长,默认全局超时时间1000ms 不够,这时候可以通过在接口上添加的自定义 HystrixCommand 来配置。

Spring Cloud Hystrix【应用篇】

在全局配置 和 接口自定义 hystrix 配置策略共存,优先使用接口自定义的 hystrix 策略。

Hystrix 常用的配置策略

参考官方链接:
Hystrix 配置   https://github.com/Netflix/Hystrix/wiki/Configuration

Execution 【HystrixCommand.run() 执行相关参数】

  • hystrix.command.default.execution.isolation.strategy = Thread
    配置线程隔离。两种:THREAD(线程池) 和 Semaphore (信号量)。默认:THREAD 线程池

  • hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 1000
    hystrixcommand 命令执行超时时间。默认:1000 ms。

  • hystrix.command.default.execution.timeout.enabled = true
    hystrixcommand 命令执行是否开启超时。默认:true

  • hystrix.command.default.execution.isolation.thread.interruptOnTimeout = true
    hystrixcommand 命令执行发生超时时是否中断执行操作。默认:true

  • hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests = 10
    线程隔离为Semaphore 。允许的最大请求数。默认:10。

Fallback 【Fallback 相关参数】

  • hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests = 10
    线程隔离为Semaphore。fallback 信息允许的最大并发数。超过不会再走 fallback,直接抛出异常。默认:10。

  • hystrix.command.default.fallback.enabled = true
    是否开启异常自定义信息 fallback,不开启时异常直接抛出。默认:true。

Circuit Breaker 【Hystrix 熔断相关参数】

  • hystrix.command.default.circuitBreaker.enabled = true
    是否开启熔断机制。默认:true。

  • hystrix.command.default.circuitBreaker.errorThresholdPercentage = 50
    fallback 逻辑错误比率阈值,达到阈值会触发 fallback。默认:50。

  • hystrix.command.default.circuitBreaker.forceOpen = false
    强制开启熔断机制,相当于拒绝所有请求。默认:false。

Thread Pool Properties 【Hystrix 线程池相关参数】

  • hystrix.threadpool.default.coreSize = 10
    线程隔离为THREAD时,线程核心大小。默认:10.

  • hystrix.threadpool.default.maximumSize = 10
    线程隔离为THREAD时,最大线程数据。默认:10。
    注意:Hystrix 1.5.9 之前,coreSize == maximumSize 。Hystrix 1.5.9 后 hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize = true 时,可以分别设置  coreSize  和 maximumSize 为不同的值。

线程池相关配置策略选择

针对线程池相关的配置设置,Hystrix 官方给出了如下的计算公式:

requests per second at peak when healthy × 99th percentile latency in seconds + some breathing room

每秒正常的请求峰值 * 99%的请求延迟(也就是请求响应延迟) + 预留的缓冲

下图是 Hystrix 官方给出的一个例子。

Spring Cloud Hystrix【应用篇】

图中定义:每秒有30个峰值请求,每个请求的响应延迟为200ms(0.2s),预留 4 个线程。
所以 Hystrix 线程池配置 为 30 * 0.2 + 4 = 10

在不同的应用场景,可以根据该公式,进行计算得出最佳 Hystrix 线程配置。

相关案例代码公众号回复【实战代码】获取下载地址

— END —

Spring Cloud Hystrix【应用篇】

       长按二维码      

关注 [ WTF名字好难取 ] 公众号


往期回顾


Spring Cloud Hystrix【理论篇】

Nginx【应用篇】记一次Nginx问题 SSL_SHUTDOWN

来源:花好夜猿,本文观点不代表自营销立场,网址:https://www.zyxiao.com/p/70526

发表评论

电子邮件地址不会被公开。 必填项已用*标注

侵权联系
分享本页
返回顶部