SpringCloud-Hystrix-创新互联

一.什么是Hystrix?

成都创新互联总部坐落于成都市区,致力网站建设服务有成都网站设计、做网站、网络营销策划、网页设计、网站维护、公众号搭建、小程序设计、软件开发等为企业提供一整套的信息化建设解决方案。创造真正意义上的网站建设,为互联网品牌在互动行销领域创造价值而不懈努力!

Hystrix,英文直译为豪猪。

在这里,指由Netflix(网飞)公司研发的断路器和降级的技术方案。

从2011年开始研发,至2018年底正式宣布进入维护模式,已经成熟完整且地提供了熔断、隔离、降级、请求合并、缓存、监控等功能。

二.Hystrix有哪些功能?

常用:

1.熔断(Circuit Break)

源自于股市的一种概念,达到一定条件,限制请求,限制一段时间后,开始恢复,恢复是逐步进行的;

2.隔离(IsoLation)

包装指定指令;上下文无关;可替换;线程或信号量

3.降级(FallBack)

当请求失败时能响应;快速;不会/不应报错;保证服务在一定程度上可用

不常用:

1.请求合并(Collapsing)

降低系统开销;总体平均性能提升;单次请求性能可能下降;须结合实际情况选择使用

2.缓存

相同参数直接返回;降低调用响应时间;降低开销;需要精细控制

3.监控(Monitor)

监控请求状态;定位问题所在;限制一段时间后,开始恢复,恢复是逐步进行的

三.为什么选择Hystrix

功能足够,性能足够,文档足够,支持足够

除了Hystrix外的选择

四.如何使用Hystrix?

  1. 开启Feign的Hystrix的支持(openFeign默认支持)

  1. 添加POM的依赖

  1. 开启Hystrix

五、Hystrix的一些概念

1.Commands

Command是Hystrix中的被隔离的一个最小指令。Hystrix的所有隔离、熔断、降级、缓存、合并、监控都是基于某个最小指令。每个Command都有其唯一的名字,可以用这个名字调整每个指令的对应属性。

绝大多数的配置,是针对于一个指令(Command)的,具体可以参阅Hystrix的官方文档说明。如果知道了一个指令(Command)的名字,那么可以针对于这个指令,调整它的配置。

如果Feign启用了Hystrix支持,那么产生的Command名字默认由feign.Feign#configKey(java.lang.Class, java.lang.reflect.Method)产生。

如果直接使用@HystrixCommand注解,那么Command的名字是被直接定义出来的。

2.ThreadPool

ThreadPool是Hystrix中的默认指令隔离方式。除此之外,还有信号量机制。

Hystrix中的线程池与Java的线程池概念类似。可以设定其最小值,大值,队列,回收速度。

当线程池达到大值后,再继续添加请求,会触发fallback,此fallback会被记录为请求错误。

线程池并非只有一个,对于Feign,每一组相同name的client属于同一个组,默认情况下,同一个组共享同一个线程池,也可以修改指定的指令(Commond)使用指定的线程池。

3.Circuit Breaker

Circuit Breaker(断路器)是Hystrix中的核心功能。断路器有开启、关闭、半开状态。

断路器(Circuit Breaker)的开启条件:在关闭状态下,首先要达到最小请求数,其次,这些请求中,请求错误的比例达到设定值,那么才会开启。

断路器开启后,所有请求都会直接降级(fallback)。

断路器开启后,经过一段时间的“休眠”,进入半开状态,会有一个指令进行实际请求,如果这个请求成功,那么断路器会关闭。否则,断路器继续打开。

如果需要,断路器可以禁用,也可以强行打开或关闭。

六.Hystrix如何工作?

例子:

设定总请求时间窗口为10秒,分为10个bucket,即,每个计数时间段为1秒。

设定请求计数门槛为20,断路器开启百分比为60%,断路器“休眠”时间5秒。

线程池容量40。

七.Hystrix有哪些坑?

1.如何精确设定Hystrix的参数?

通过设定对应指令(Command)的参数,可以覆盖默认的default参数。具体的参数配置可以参考官网。

2.指令使用哪个线程池,由什么决定?

每个Hystrix指令,都有一个对应的group,group在监控中是一个最小单元,默认情况下,此指令的线程池与group对应,每个group有唯一对应的线程池。也可以通过配置threadPoolKeyOverride,进行单独设定。

3.那么,指令使用哪个group呢?

对于Feign,group的名字默认是FeignClient注解的name值,可以通过调整feign.hystrix.SetterFactory来调整。

对于HystrixCommand注解,group的名字可以直接指定。

4.线程池方式下,hystrix如何计算是否开启断路器?

在单位时间内,如果请求达到一定数量,且失败比例高于设定值,则开启断路器。

单位时间由

参数: metrics.rollingStats.timeInMilliseconds

参数: metrics.rollingStats.numBuckets

共同指定,两者能整除时,单位时间为两者的商。

最低计算数由circuitBreaker.requestVolumeThreshold决定

最低失败比例由circuitBreaker.errorThresholdPercentage决定

5.hystrix线程池如何调优?

按官方文档,线程池中coreSize的建议值为

请求的qps*99线执行时间+预留空间

例如,某请求预估每秒请求300次,执行时间为200ms,

则coreSize应为300*0.2+10=70, 默认的coreSize为10

对于Feign,每个name对应相同的group,相同group默认使用同一个线程池,如果有多个调用量较小的微服务被调用端,可以考虑让他们共享同一个线程池。同理,反则反之,如果FeignClient的某个方法(对应一个指令Command)调用量较大,也可以给这个指令设置独享的线程池。

于Feign,每次请求,只要对应的http请求没有结束,线程是一直被占用的,请尽量保证快速释放线程资源。

此外,通过调整maxQueueSize,在一定程度上,可以达到“削峰填谷”作用。但需注意的是,等待执行也会被timeout处理。

6.FeignClient创建的Hystrix请求是如何包装的?

大部分情况下:

1.Sleuth层(如果有)

2.Hystrix层(如果有)

3.Ribbon层(如果有)

4.client层(必有,n选1)

因为Hystrix是包装在Ribbon层和client之上,所以超时和线程池会有一些微妙的关系

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


分享文章:SpringCloud-Hystrix-创新互联
文章网址:http://scyanting.com/article/djpedg.html