Hystrix熔断,其实就是打开了断路器(Circuit Breaker)。Hystrix在运行过程中会向每个commandKey
对应的断路器报告 成功、失败、超时 和 拒绝 的状态,断路器会统计并维护这些数据,根据这些统计信息来确定断路器的状态: 打开(open) 、 半开(half-open) 、 关闭(close) 。
- 打开状态:后续的请求都会被截断,直接走fallback降级;
- 半开状态:默认每隔5s,尝试半开,放入一部分流量进来,相当于对依赖服务进行一次健康检查,如果服务恢复了,则断路器关闭,随后完全恢复调用;
- 关闭状态:断路器完全关闭,走正常的请求调用流程。
一、工作原理
我们先来看下断路器的基本工作流程,还是下面这张老图,可以看到只要执行command,请求就一定会经过断路器:
1.1 关闭->打开
如果配置了circuitBreaker.enabled = true
,即允许断路器工作,那么初始时断路器的状态为 关闭 。当在一个时间窗口内(默认10s),请求流量超过了一定的阈值(默认20次),Hristrix就会去判断要不要断路,断路的依据是: 异常请求数量占总请求量的比值是否超过某个阈值,此时断路器就会打开 。
举个例子,假设时间窗口为10s,请求阈值为20次,如果10s内经过短路器的请求共10次,那么根本不会去判断要不要断路,即使这10次请求全部是异常的。如果10s内经过短路器的请求超过20次,同时其中异常的请求数量,占到了一定的比例,就会开启断路,断路器从close状态转换到open状态。此时,再有请求过来,都不会走后端服务,而是全部走fallback降级。
circuitBreaker.requestVolumeThreshold:请求总量阈值,默认20
circuitBreaker.errorThresholdPercentage:异常请求百分比,默认50,即50%
1.2 打开->半开
当断路器开启一段时间之后(默认5s),会尝试放过去一部分流量进行试探,确定依赖服务是否恢复了。此时断路器的状态为变成半开(half-open), 如果服务完全恢复了,则断路器状态会转换成关闭,随后完全恢复调用。
circuitBreaker.sleepWindowInMilliseconds:半开试探休眠时间,默认值5000ms。
二、示例
接下来,我们通过示例来看下如何使用Hystrix的熔断功能。
2.1 command改写
/**
* 封装获取商品信息的请求,采用线程池隔离。
* HystrixCommand中的泛型是请求返回的类型,此处是商品信息ProductInfo
*/
public class GetProductInfoCommand extends HystrixCommand<ProductInfo> {
private final Long productId;
public GetProductInfoCommand(Long productId) {
// 将command与线程池关联
super(HystrixCommandGroupKey.Factory.asKey("GetProductInfoCommandGroup")
.andCommandPropertiesDefaults(
HystrixCommandProperties.Setter()
.withCircuitBreakerRequestVolumeThreshold(30)
.withCircuitBreakerErrorThresholdPercentage(40))
.withCircuitBreakerSleepWindowInMilliseconds(6000));
this.productId = productId;
}
/**
* run方法里执行的是真正请求处理逻辑
*/
@Override
protected ProductInfo run() {
// 拿到一个商品id
// 调用商品服务的接口,获取商品id对应的商品的最新数据
// 用HttpClient去调用商品服务的http接口
String url = "http://127.0.0.1:8082/getProductInfo?productId=" + productId;
String response = HttpClientUtils.sendGetRequest(url);
return JSONObject.parseObject(response, ProductInfo.class);
}
}
上述构造函数中,设置了请求总量阈值为30,异常请求百分比为40%,半开试探休眠时间6s。
这样,如果10s内总请求数超过30次,且异常请求占40%,就会打开断路器,后续的所有请求都会走fallback降级。
三、总结
本章,我介绍了Hystrix的熔断功能,读者要特别注意断路器的三种状态之间的转换关系,Hystrix对所有command请求进行监控统计,当异常请求达到一定比例时,就会触发熔断机制。
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。