hystrix的配置说明
在我们的日常开发中,有些时候需要和第三方系统进行对接操作,或者调用其他系统的 api 接口,但是我们不能保证这些第三方系统的接口一定是稳定的,当系统中产生大量的流量来访问这些第三方接口,这些第三方系统的接口响应慢时,如何保证我们自己的系统不被这些第三方系统的接口耗费完系统的资源,导致我们自己的系统崩溃。为了避免这种情况的发生,我们应该将这些第三方系统的接口进行隔离访问,将他们分配到一个单独的线程池中进行处理,或给他们固定的资源,并且当出现失败时,做好相应的回退处理。 此时我们就可以借助 hystrix 来完成这个需求,当然 hystrix 能完成的功能远不止如此。 hystrix的Wiki地址
此文简单记录一下 hystrix 的各种配置,并在文末给出一个可以运行的 例子
一、hystrix的各种配置
public class SelectProductCommand extends HystrixCommand<Product> {
private ProductService productService;
private String productId;
public SelectProductCommand(ProductService productService, String productId) {
super(
Setter
// 配置全局唯一标识服务分组的名称 当我们进行监控时,相同分组的服务会聚合在一起,必填项
.withGroupKey(HystrixCommandGroupKey.Factory.asKey("group-product"))
// command key ,如果不进行配置,默认为类的 SimpleName,最好唯一
.andCommandKey(HystrixCommandKey.Factory.asKey("command-selectOne(String)"))
// 配置命令的一些参数
.andCommandPropertiesDefaults(
HystrixCommandProperties.Setter()
// 是否启动超时处理 默认为 true
.withExecutionTimeoutEnabled(true)
// 超时时间为 10s
.withExecutionTimeoutInMilliseconds(10000)
// 使用线程池进行隔离
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.THREAD)
// 隔离测试为 THREAD 时,执行线程执行超时时,是否进行中断处理 默认为 true
.withExecutionIsolationThreadInterruptOnTimeout(true)
// 当 Future#cancel(true) 是否进行中断处理 默认为 false
.withExecutionIsolationThreadInterruptOnFutureCancel(true)
// 打开短路器
.withCircuitBreakerEnabled(true)
// 如果在一个采样时间窗口内,失败率超过该配置,则自动打开熔断开关实现降级处理,即快速失败。默认配置下采样周期为10s,失败率为50%
.withCircuitBreakerErrorThresholdPercentage(50)
// 在短路器闭合情况下,在进行失败率判断之前,一个采样周期内必须进行至少N个请求才能进行采样统计,目的是有足够的采样使得失败率计算正确,默认为20
.withCircuitBreakerRequestVolumeThreshold(60)
// 短路器闭合的重试时间窗口,且在该时间窗口内只允许一次重试。即在熔断开关打开后,在该时间窗口允许有一次重试,如果重试成功,则将重置Health采样统计并闭合断路器开关实现快速恢复,否则断路器开关还是打开状态,执行快速失败。
.withCircuitBreakerSleepWindowInMilliseconds(10000)
// 是否强制关闭断路器,如果强制关闭则请求不会进行 fallback 处理
.withCircuitBreakerForceClosed(false)
// 是否强制打开短路器,如果打开了那么将会直接进行降级处理
.withCircuitBreakerForceOpen(false)
// 是否启用降级处理 默认是 true
.withFallbackEnabled(true)
// fallback方法的信号量配置,配置getFallback方法并发请求的信号量,如果请求超过了并发信号量限制,则不再尝试调用getFallback方法,而是快速失败,默认信号量为10
.withFallbackIsolationSemaphoreMaxConcurrentRequests(100)
)
// 配置全局唯一标识线程池的名称 相同名称的线程池是同一个 如果不进行配置, 默认是 分组的名称
.andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("select-product-thread-pool"))
// 线程池属性配置
.andThreadPoolPropertiesDefaults(
HystrixThreadPoolProperties.Setter()
// 配置核心线程数的大小
.withCoreSize(5)
// 配置最大的线程数大小
.withMaximumSize(10)
// 允许最大线程数超过核心线程数,默认是 false ,如果这个值不为 true ,则上方配置的 withMaximumSize(10) 不会生效
.withAllowMaximumSizeToDivergeFromCoreSize(true)
// 线程池中空闲线程的生存时间
.withKeepAliveTimeMinutes(5)
// 配置线程池队列的最大大小
.withMaxQueueSize(500)
// 限制当前队列的大小,通过改变这个参数,可以实现动态改变队列的大小 当队列的大小超过 这个值 时会fallback
.withQueueSizeRejectionThreshold(490)
)
);
this.productService = productService;
this.productId = productId;
}
@Override
protected Product run() throws Exception {
log.info("----> Run Thread Name:{}", Thread.currentThread().getName());
return productService.selectOne(productId);
}
/**
* 1、最大并发数受 FallbackIsolationSemaphoreMaxConcurrentRequests 限制,当超过这个值时,不会进行 fallback 处理,直接失败
* 2、该方法最好不要进行网络访问,应该返回降级数据
* 3、如果必须要走网络请求,那么最好调用另外一个 Command 命令
*
* @return
*/
@Override
protected Product getFallback() {
log.info("----> FallBack Thread Name:{}", Thread.currentThread().getName());
Optional.ofNullable(getFailedExecutionException()).ifPresent(exception -> log.error(exception.getMessage(), exception));
return Product.builder().productName("服务降级").build();
}
}
hystrix使用线程池隔离时,线程池大小线程的配置:
每秒的访问峰值 * 99%的响应时间(s) + 预留线程数
二、使用 @HystrixCommand 的方式和注意事项
@HystrixCommand配置参考代码:https://gitee.com/huan1993/hystrix/tree/master/order-consumer-annotation-hystrix
三、进入 fallback 的时机
1、执行方法抛出了异常,非 HystrixBadRequestException 异常
2、方法执行超时了
3、断路器打开了
4、hystrix线程池拒绝了
四、隔离机制
hystrix中存在2中隔离机制,THREAD 隔离和 SEMAPHORE(信号量) 隔离。
1、THREAD 隔离,它在一个单独的线程上执行,和调用线程不是在同一个线程上
2、SEMAPHORE 隔离,它和调用线程在同一个线程上
3、当我们继承 HystrixCommand 类时,建议使用 THREAD 隔离
4、当我们继承 HystrixObservableCommand 类时,建议使用 SEMAPHORE 隔离
5、一般情况下,我们使用线程隔离即可,SEMAPHORE隔离一般只适用非网络调用。
五、代码
代码如下:https://gitee.com/huan1993/hystrix
hystrix的配置说明的更多相关文章
- SpringCloud学习系列之三----- 断路器(Hystrix)和断路器监控(Dashboard)
前言 本篇主要介绍的是SpringCloud中的断路器(Hystrix)和断路器指标看板(Dashboard)的相关使用知识. SpringCloud Hystrix Hystrix 介绍 Netfl ...
- 玩转Spring Cloud之熔断降级(Hystrix)与监控
本文内容导航目录: 前言:解释熔断降级一.搭建服务消费者项目,并集成 Hystrix环境 1.1.在POM XML中添加Hystrix依赖(spring-cloud-starter-netflix-h ...
- Spring Cloud(Dalston.SR5)--Feign 与 Hystrix 断路器整合
创建项目 要使 Feign 与 Hystrix 进行整合,我们需要增加 Feign 和 Hystrix 的依赖,修改 POM.xml 中增加以下依赖项如下: <?xmlversion=" ...
- Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?
导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...
- Feign Ribbon Hystrix 三者关系 | 史上最全, 深度解析
史上最全: Feign Ribbon Hystrix 三者关系 | 深度解析 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之 -25[ 博客园 总入口 ] 前言 疯狂创客圈(笔者尼恩创建的 ...
- 使用Hystrix提高系统可用性
今天稍微复杂点的互联网应用,服务端基本都是分布式的,大量的服务支撑起整个系统,服务之间也难免有大量的依赖关系,依赖都是通过网络连接起来. (图片来源:https://github.com/Netfli ...
- NHibernate之映射文件配置说明
NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...
- Hystrix框架5--请求缓存和collapser
简介 在Hystrix中有个Request的概念,有一些操作需要在request中进行 缓存 在Hystrix调用服务时,如果只是查询接口,可以使用缓存进行优化,从而跳过真实访问请求. 应用 需要启用 ...
- Hystrix框架4--circuit
circuit 在Hystrix调用服务时,难免会遇到异常,如对方服务不可用,在这种情况下如果仍然不停地调用就是不必要的,在Hystrix中可以配置使用circuit,当达到一定程度错误,就会自动调用 ...
随机推荐
- c# List集合类常用操作:二、增加
所有操作基于以下类 class Employees { public int Id { get; set; } public string Name { get; set; } public stri ...
- python库--jieba(中文分词)
import jieba 精确模式,试图将句子最精确地切开,适合文本分析:全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义:搜索引擎模式,在精确模式的基础上,对长词再次切 ...
- HCNP Routing&Switching之路由控制、路由策略和IP-Prefix List
前文我们了解了IS-IS路由聚合和认证相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15306645.html:今天我们来聊一聊路由控制技术中的路由策 ...
- Django学习day07随堂笔记
今日考题 """ 今日考题 1.必知必会N条都有哪些,每个都是干啥使的 2.简述神奇的双下划线查询都有哪些方法,作用是什么 3.针对多对多外键字段的增删改查方法有哪些,各 ...
- linux设置防火墙规则-指定ip的访问权限
vim /etc/sysconfig/iptables 可以把你当前的iptables规则放到/etc/sysconfig/iptables中,系统重启iptables时自动执行 1.查看 iptab ...
- chrome 的手机调试工具 toggle device toolbar
chrome 的手机调试工具 toggle device toolbar 是否可以模拟到不同系统,如苹果系统和安卓系统.
- Laravel [1045] Access denied for user 'homestead'@'localhost' .env没有配置
laravel 连接数据库出现错误 PDOException in Connector.php line 55:SQLSTATE[HY000] [1045] Access denied for use ...
- flask_sqlalchemy 查询结果转dict 终极解决方案
之前为了学习Python,试着拿Flask作框架搞小网站,感觉还不错,基本就抛弃了PHP.前段时间做了一个微信小程序,想着yii框架拿来写几十个小接口是不是浪费了,就继续用flask写api了,哪想到 ...
- fliebeat配置手册
1. 关于Filebeat 当你要面对成百上千.甚至成千上万的服务器.虚拟机和容器生成的日志时,请告别 SSH 吧!Filebeat 将为你提供一种轻量型方法,用于转发和汇总日志与文件,让简单的事情 ...
- Windows下nginx报错解决:CreateFile() "xxx/logs/nginx.pid" failed
写在前面 本文给出Windows下nginx报错:CreateFile() "xxx/logs/nginx.pid" failed 的解决方法并分析了出错原因,其中 xxx 表示n ...