Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式

Spring Cloud 微服务实战(八):Hystrix熔断降级------从服务雪崩到断路器模式


个人主页:夏天拐跑了西瓜

专栏传送门:《大模型应用开发》《Spring 生态全家桶体系化实战》

学习方向:Java 后端|AI‑Agent 大模型应用开发爱好者

⭐人生格言:路虽远,行则将至


🔔 本文是《Spring Cloud 微服务实战》系列第八篇。

上一篇:Feign高级配置与生产实践

前面我们学会了用Eureka做注册发现、用Ribbon做负载均衡、用Feign做声明式调用。但微服务之间相互依赖,一个服务挂掉可能引发连锁反应导致整个系统崩溃,这就是"服务雪崩"。这篇我们讲Hystrix,它是Spring Cloud Netflix里负责熔断降级的组件。


📌 摘要:微服务之间相互依赖,一个下游服务故障可能沿调用链向上蔓延,导致整个系统崩溃------这就是"服务雪崩"。本文从雪崩现象讲起,拆解断路器模式三种状态的切换原理,并带你快速上手 Hystrix 熔断降级:fallback 降级方法、Hystrix 命令执行全流程、线程池/信号量两种资源隔离、超时与熔断阈值配置、Feign 整合降级、实操验证降级与熔断、Dashboard 实时监控,最后给出 Hystrix 停更后的选型建议与 8 道高频面试题。适合已掌握 Eureka、Ribbon、Feign 的微服务初学者。
本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。


Hystrix熔断降级全链路架构图:
#mermaid-svg-1o4UP1edp9eH3tpN{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1o4UP1edp9eH3tpN .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1o4UP1edp9eH3tpN .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1o4UP1edp9eH3tpN .error-icon{fill:#552222;}#mermaid-svg-1o4UP1edp9eH3tpN .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1o4UP1edp9eH3tpN .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1o4UP1edp9eH3tpN .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1o4UP1edp9eH3tpN .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1o4UP1edp9eH3tpN .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1o4UP1edp9eH3tpN .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1o4UP1edp9eH3tpN .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1o4UP1edp9eH3tpN .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1o4UP1edp9eH3tpN .marker.cross{stroke:#333333;}#mermaid-svg-1o4UP1edp9eH3tpN svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1o4UP1edp9eH3tpN p{margin:0;}#mermaid-svg-1o4UP1edp9eH3tpN .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-1o4UP1edp9eH3tpN .cluster-label text{fill:#333;}#mermaid-svg-1o4UP1edp9eH3tpN .cluster-label span{color:#333;}#mermaid-svg-1o4UP1edp9eH3tpN .cluster-label span p{background-color:transparent;}#mermaid-svg-1o4UP1edp9eH3tpN .label text,#mermaid-svg-1o4UP1edp9eH3tpN span{fill:#333;color:#333;}#mermaid-svg-1o4UP1edp9eH3tpN .node rect,#mermaid-svg-1o4UP1edp9eH3tpN .node circle,#mermaid-svg-1o4UP1edp9eH3tpN .node ellipse,#mermaid-svg-1o4UP1edp9eH3tpN .node polygon,#mermaid-svg-1o4UP1edp9eH3tpN .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1o4UP1edp9eH3tpN .rough-node .label text,#mermaid-svg-1o4UP1edp9eH3tpN .node .label text,#mermaid-svg-1o4UP1edp9eH3tpN .image-shape .label,#mermaid-svg-1o4UP1edp9eH3tpN .icon-shape .label{text-anchor:middle;}#mermaid-svg-1o4UP1edp9eH3tpN .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1o4UP1edp9eH3tpN .rough-node .label,#mermaid-svg-1o4UP1edp9eH3tpN .node .label,#mermaid-svg-1o4UP1edp9eH3tpN .image-shape .label,#mermaid-svg-1o4UP1edp9eH3tpN .icon-shape .label{text-align:center;}#mermaid-svg-1o4UP1edp9eH3tpN .node.clickable{cursor:pointer;}#mermaid-svg-1o4UP1edp9eH3tpN .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1o4UP1edp9eH3tpN .arrowheadPath{fill:#333333;}#mermaid-svg-1o4UP1edp9eH3tpN .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1o4UP1edp9eH3tpN .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1o4UP1edp9eH3tpN .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1o4UP1edp9eH3tpN .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1o4UP1edp9eH3tpN .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1o4UP1edp9eH3tpN .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1o4UP1edp9eH3tpN .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1o4UP1edp9eH3tpN .cluster text{fill:#333;}#mermaid-svg-1o4UP1edp9eH3tpN .cluster span{color:#333;}#mermaid-svg-1o4UP1edp9eH3tpN div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1o4UP1edp9eH3tpN .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1o4UP1edp9eH3tpN rect.text{fill:none;stroke-width:0;}#mermaid-svg-1o4UP1edp9eH3tpN .icon-shape,#mermaid-svg-1o4UP1edp9eH3tpN .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1o4UP1edp9eH3tpN .icon-shape p,#mermaid-svg-1o4UP1edp9eH3tpN .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1o4UP1edp9eH3tpN .icon-shape .label rect,#mermaid-svg-1o4UP1edp9eH3tpN .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1o4UP1edp9eH3tpN .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1o4UP1edp9eH3tpN .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1o4UP1edp9eH3tpN :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Eureka Server
服务提供者 user-provider
服务消费者 user-consumer
客户端 浏览器 / App
否,正常放行
是,熔断

失败 / 超时 / 线程池拒绝
成功/失败/超时/拒绝

统计数据上报
HTTP 请求
HTTP 响应
注册服务
拉取服务列表
Hystrix Dashboard 监控
用户请求
Controller 业务方法

@HystrixCommand 标记
Hystrix 命令执行

资源隔离:线程池 / 信号量
断路器是否打开?

CircuitBreaker OPEN?
Feign 客户端

UserFeignClient
Fallback 降级方法

返回兜底数据
Ribbon 负载均衡

选择实例
HTTP 调用 user-provider
调用成功?
返回真实数据
响应客户端
实时监控看板

熔断状态 / 错误率 / 线程池
Provider Controller

业务处理
服务注册与发现

这张图串起了本文的核心链路:请求进入 consumer 后被 @HystrixCommand 包裹,Hystrix 先做资源隔离 (线程池/信号量),再检查断路器状态------OPEN 则直接走 Fallback 降级;正常放行则经 Feign + Ribbon 调用 provider,一旦失败/超时/线程池拒绝,同样落入降级方法返回兜底数据。所有调用指标实时上报给 Hystrix Dashboard 监控。下面逐节展开。


### 文章目录

  • [Spring Cloud 微服务实战(八):Hystrix熔断降级------从服务雪崩到断路器模式](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [@toc](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [一、服务雪崩与断路器](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [1.1 什么是服务雪崩](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [1.2 断路器模式](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [二、Hystrix快速上手](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [2.1 引入依赖](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [2.2 开启Hystrix](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [2.3 编写降级方法](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [2.4 Hystrix命令执行全流程](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [三、资源隔离:线程池与信号量](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [3.1 为什么需要资源隔离](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [3.2 线程池隔离(默认推荐)](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [3.3 信号量隔离](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [3.4 两种隔离怎么选](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [四、Hystrix核心配置](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [4.1 超时配置](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [4.2 断路器配置](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [4.3 线程池配置](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [4.4 全局配置(yaml)](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [五、Feign整合Hystrix](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [5.1 开启Feign对Hystrix的支持](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [5.2 Feign接口降级](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [5.3 Feign + Hystrix 调用流程图](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [5.4 获取降级原因(fallbackFactory)](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [六、实操验证:停掉Provider,实测降级与熔断恢复](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [6.1 第一步:正常调用](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [6.2 第二步:停掉Provider,观察降级](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [6.3 第三步:连续访问,触发熔断](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [6.4 第四步:恢复Provider,观察熔断自动关闭](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [七、异常传递与忽略](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [7.1 默认异常处理](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [7.2 忽略指定异常](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [7.3 降级方法中获取异常](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [八、Hystrix Dashboard监控仪表盘](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [8.1 监控架构](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [8.2 搭建Dashboard](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [8.3 使用Dashboard](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [九、Hystrix停止维护与替代方案](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [9.1 Hystrix现状](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [9.2 替代方案对比](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [9.3 选型建议](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [十、常见问题](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [1. fallback方法不生效](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [2. Hystrix超时时间设多少](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [3. 断路器不打开](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [4. Feign降级不生效](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [十一、高频面试题](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [参考资料](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)
  • [总结](#文章目录 Spring Cloud 微服务实战(八):Hystrix熔断降级——从服务雪崩到断路器模式 @[toc] 一、服务雪崩与断路器 1.1 什么是服务雪崩 1.2 断路器模式 二、Hystrix快速上手 2.1 引入依赖 2.2 开启Hystrix 2.3 编写降级方法 2.4 Hystrix命令执行全流程 三、资源隔离:线程池与信号量 3.1 为什么需要资源隔离 3.2 线程池隔离(默认推荐) 3.3 信号量隔离 3.4 两种隔离怎么选 四、Hystrix核心配置 4.1 超时配置 4.2 断路器配置 4.3 线程池配置 4.4 全局配置(yaml) 五、Feign整合Hystrix 5.1 开启Feign对Hystrix的支持 5.2 Feign接口降级 5.3 Feign + Hystrix 调用流程图 5.4 获取降级原因(fallbackFactory) 六、实操验证:停掉Provider,实测降级与熔断恢复 6.1 第一步:正常调用 6.2 第二步:停掉Provider,观察降级 6.3 第三步:连续访问,触发熔断 6.4 第四步:恢复Provider,观察熔断自动关闭 七、异常传递与忽略 7.1 默认异常处理 7.2 忽略指定异常 7.3 降级方法中获取异常 八、Hystrix Dashboard监控仪表盘 8.1 监控架构 8.2 搭建Dashboard 8.3 使用Dashboard 九、Hystrix停止维护与替代方案 9.1 Hystrix现状 9.2 替代方案对比 9.3 选型建议 十、常见问题 1. fallback方法不生效 2. Hystrix超时时间设多少 3. 断路器不打开 4. Feign降级不生效 十一、高频面试题 参考资料 总结)

🎉 阅读本文你将收获:

  • ✅ 什么是服务雪崩,为什么需要熔断降级
  • ✅ 断路器模式的三个状态切换原理
  • ✅ Hystrix快速上手:降级方法fallback
  • ✅ Hystrix命令执行全流程拆解
  • ✅ 资源隔离:线程池隔离 vs 信号量隔离
  • ✅ Hystrix常用配置:超时、窗口、阈值
  • ✅ Feign整合Hystrix实现降级
  • ✅ 实操验证:停掉服务实测降级与熔断恢复
  • ✅ 全局降级与异常兜底
  • ✅ Hystrix Dashboard监控仪表盘
  • ✅ Hystrix停止维护后的替代方案
  • ✅ Hystrix与Sentinel对比
  • ✅ 8道高频面试题

一、服务雪崩与断路器

1.1 什么是服务雪崩

在微服务系统里,服务之间形成调用链。假设电商系统有这样的调用关系:
#mermaid-svg-NCZZ6U2ALKUw6KFP{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NCZZ6U2ALKUw6KFP .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NCZZ6U2ALKUw6KFP .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NCZZ6U2ALKUw6KFP .error-icon{fill:#552222;}#mermaid-svg-NCZZ6U2ALKUw6KFP .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NCZZ6U2ALKUw6KFP .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NCZZ6U2ALKUw6KFP .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NCZZ6U2ALKUw6KFP .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NCZZ6U2ALKUw6KFP .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NCZZ6U2ALKUw6KFP .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NCZZ6U2ALKUw6KFP .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NCZZ6U2ALKUw6KFP .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NCZZ6U2ALKUw6KFP .marker.cross{stroke:#333333;}#mermaid-svg-NCZZ6U2ALKUw6KFP svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NCZZ6U2ALKUw6KFP p{margin:0;}#mermaid-svg-NCZZ6U2ALKUw6KFP .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-NCZZ6U2ALKUw6KFP .cluster-label text{fill:#333;}#mermaid-svg-NCZZ6U2ALKUw6KFP .cluster-label span{color:#333;}#mermaid-svg-NCZZ6U2ALKUw6KFP .cluster-label span p{background-color:transparent;}#mermaid-svg-NCZZ6U2ALKUw6KFP .label text,#mermaid-svg-NCZZ6U2ALKUw6KFP span{fill:#333;color:#333;}#mermaid-svg-NCZZ6U2ALKUw6KFP .node rect,#mermaid-svg-NCZZ6U2ALKUw6KFP .node circle,#mermaid-svg-NCZZ6U2ALKUw6KFP .node ellipse,#mermaid-svg-NCZZ6U2ALKUw6KFP .node polygon,#mermaid-svg-NCZZ6U2ALKUw6KFP .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NCZZ6U2ALKUw6KFP .rough-node .label text,#mermaid-svg-NCZZ6U2ALKUw6KFP .node .label text,#mermaid-svg-NCZZ6U2ALKUw6KFP .image-shape .label,#mermaid-svg-NCZZ6U2ALKUw6KFP .icon-shape .label{text-anchor:middle;}#mermaid-svg-NCZZ6U2ALKUw6KFP .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-NCZZ6U2ALKUw6KFP .rough-node .label,#mermaid-svg-NCZZ6U2ALKUw6KFP .node .label,#mermaid-svg-NCZZ6U2ALKUw6KFP .image-shape .label,#mermaid-svg-NCZZ6U2ALKUw6KFP .icon-shape .label{text-align:center;}#mermaid-svg-NCZZ6U2ALKUw6KFP .node.clickable{cursor:pointer;}#mermaid-svg-NCZZ6U2ALKUw6KFP .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-NCZZ6U2ALKUw6KFP .arrowheadPath{fill:#333333;}#mermaid-svg-NCZZ6U2ALKUw6KFP .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-NCZZ6U2ALKUw6KFP .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-NCZZ6U2ALKUw6KFP .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NCZZ6U2ALKUw6KFP .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-NCZZ6U2ALKUw6KFP .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NCZZ6U2ALKUw6KFP .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-NCZZ6U2ALKUw6KFP .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-NCZZ6U2ALKUw6KFP .cluster text{fill:#333;}#mermaid-svg-NCZZ6U2ALKUw6KFP .cluster span{color:#333;}#mermaid-svg-NCZZ6U2ALKUw6KFP div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-NCZZ6U2ALKUw6KFP .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-NCZZ6U2ALKUw6KFP rect.text{fill:none;stroke-width:0;}#mermaid-svg-NCZZ6U2ALKUw6KFP .icon-shape,#mermaid-svg-NCZZ6U2ALKUw6KFP .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-NCZZ6U2ALKUw6KFP .icon-shape p,#mermaid-svg-NCZZ6U2ALKUw6KFP .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-NCZZ6U2ALKUw6KFP .icon-shape .label rect,#mermaid-svg-NCZZ6U2ALKUw6KFP .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-NCZZ6U2ALKUw6KFP .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-NCZZ6U2ALKUw6KFP .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-NCZZ6U2ALKUw6KFP :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ① 调用
② 调用
③ 查询
④ 响应变慢
⑤ 线程阻塞耗尽

库存服务宕机
⑥ 超时堆积

商品服务宕机
⑦ 级联失败

订单服务宕机
订单服务
商品服务
库存服务
数据库

慢查询
整个系统

不可用

如果库存服务因为数据库慢查询导致响应很慢,那么商品服务调用库存服务的线程就会被阻塞,迟迟得不到释放。高并发下,商品服务的线程池很快被耗尽,商品服务也挂了。接着订单服务调用商品服务也超时,订单服务的线程池也被耗尽......

一个下游服务的故障,沿着调用链向上游蔓延,最终导致整个系统不可用,这就是服务雪崩效应

雪崩的根本原因是:同步等待造成的资源耗尽。调用方的线程在等待下游响应时什么也干不了,大量线程阻塞就会拖垮整个服务。

1.2 断路器模式

断路器(Circuit Breaker)这个词来源于电路里的空气开关:电路过载时开关自动跳闸,保护电器不被烧坏。软件里的断路器也是同样的思路:

  • 当某个下游服务的失败率达到阈值,断路器"打开",后续请求不再真正调用下游,而是直接返回降级结果(fallback)
  • 这样可以避免调用方线程被阻塞,防止故障扩散
  • 一段时间后半开断路器,放少量请求试探下游是否恢复,如果成功则关闭断路器,恢复正常调用

断路器有三种状态,状态切换流程如下:
#mermaid-svg-ggFbSpoLpJIyT20y{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ggFbSpoLpJIyT20y .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ggFbSpoLpJIyT20y .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ggFbSpoLpJIyT20y .error-icon{fill:#552222;}#mermaid-svg-ggFbSpoLpJIyT20y .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ggFbSpoLpJIyT20y .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ggFbSpoLpJIyT20y .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ggFbSpoLpJIyT20y .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ggFbSpoLpJIyT20y .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ggFbSpoLpJIyT20y .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ggFbSpoLpJIyT20y .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ggFbSpoLpJIyT20y .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ggFbSpoLpJIyT20y .marker.cross{stroke:#333333;}#mermaid-svg-ggFbSpoLpJIyT20y svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ggFbSpoLpJIyT20y p{margin:0;}#mermaid-svg-ggFbSpoLpJIyT20y defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-ggFbSpoLpJIyT20y g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-ggFbSpoLpJIyT20y g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-ggFbSpoLpJIyT20y g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-ggFbSpoLpJIyT20y g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-ggFbSpoLpJIyT20y g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-ggFbSpoLpJIyT20y .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-ggFbSpoLpJIyT20y .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-ggFbSpoLpJIyT20y .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-ggFbSpoLpJIyT20y .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-ggFbSpoLpJIyT20y .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-ggFbSpoLpJIyT20y .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-ggFbSpoLpJIyT20y .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-ggFbSpoLpJIyT20y .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ggFbSpoLpJIyT20y .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ggFbSpoLpJIyT20y .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ggFbSpoLpJIyT20y .edgeLabel .label text{fill:#333;}#mermaid-svg-ggFbSpoLpJIyT20y .label div .edgeLabel{color:#333;}#mermaid-svg-ggFbSpoLpJIyT20y .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-ggFbSpoLpJIyT20y .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-ggFbSpoLpJIyT20y .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-ggFbSpoLpJIyT20y .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-ggFbSpoLpJIyT20y .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-ggFbSpoLpJIyT20y .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ggFbSpoLpJIyT20y .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ggFbSpoLpJIyT20y #statediagram-barbEnd{fill:#333333;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ggFbSpoLpJIyT20y .cluster-label,#mermaid-svg-ggFbSpoLpJIyT20y .nodeLabel{color:#131300;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-ggFbSpoLpJIyT20y .note-edge{stroke-dasharray:5;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-note text{fill:black;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram-note .nodeLabel{color:black;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagram .edgeLabel{color:red;}#mermaid-svg-ggFbSpoLpJIyT20y #dependencyStart,#mermaid-svg-ggFbSpoLpJIyT20y #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-ggFbSpoLpJIyT20y .statediagramTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ggFbSpoLpJIyT20y :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 系统启动
滚动窗口内失败率 ≥ 阈值

(默认10s内失败率>50% 且请求数≥20)
等待 sleepWindow

(默认5s)
试探请求成功

服务已恢复
试探请求失败

服务仍未恢复
CLOSED
正常调用
统计失败率
OPEN
直接降级
不调用下游
HALF_OPEN
放少量请求试探
等待结果

  • CLOSED(关闭):正常状态,请求正常发往下游,Hystrix统计成功/失败比例
  • OPEN(打开):熔断状态,请求直接走降级逻辑,不调用下游
  • HALF_OPEN(半开):OPEN状态持续一段时间(默认5秒)后,允许少量请求试探,如果成功则切回CLOSED,失败则回到OPEN

Hystrix就是Netflix开源的、实现了断路器模式的组件。虽然Hystrix已经停止维护,但它的设计思想影响了后续的Resilience4j和Sentinel,理解Hystrix对学习这些新组件也很有帮助。


二、Hystrix快速上手

2.1 引入依赖

在consumer的pom.xml里加:

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2.2 开启Hystrix

在启动类上加@EnableCircuitBreaker(或@EnableHystrix):

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableCircuitBreaker
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

💡 @EnableCircuitBreaker 是 Spring Cloud 的通用注解,底层会启用 Hystrix;用 @EnableHystrix 效果等价。

2.3 编写降级方法

@HystrixCommand注解标记需要熔断的方法,并指定fallback降级方法:

java 复制代码
@RestController
public class UserController {

    @Autowired
    private UserFeignClient userFeignClient;

    @GetMapping("/user/{id}")
    @HystrixCommand(fallbackMethod = "getUserFallback")
    public User getUser(@PathVariable Long id) {
        // 正常调用下游服务
        return userFeignClient.getUserById(id);
    }

    // 降级方法:参数和返回值必须和原方法一致
    public User getUserFallback(Long id) {
        User user = new User();
        user.setId(id);
        user.setName("服务降级了,这是默认用户");
        user.setEmail("fallback@example.com");
        return user;
    }
}

当下游服务正常时,返回真实数据;当user-provider挂掉或者超时时,Hystrix会自动调用getUserFallback返回兜底数据,不会把异常抛给前端。

💡 fallback方法的签名(参数列表、返回值类型)必须和被@HystrixCommand标注的方法一致,否则Hystrix找不到降级方法。

2.4 Hystrix命令执行全流程

一个被@HystrixCommand标记的方法,从请求进入到最后返回,Hystrix内部会依次经历以下关卡:
#mermaid-svg-eJ1K6uDrtcyfHkOI{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-eJ1K6uDrtcyfHkOI .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-eJ1K6uDrtcyfHkOI .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-eJ1K6uDrtcyfHkOI .error-icon{fill:#552222;}#mermaid-svg-eJ1K6uDrtcyfHkOI .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-eJ1K6uDrtcyfHkOI .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-eJ1K6uDrtcyfHkOI .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-eJ1K6uDrtcyfHkOI .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-eJ1K6uDrtcyfHkOI .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-eJ1K6uDrtcyfHkOI .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-eJ1K6uDrtcyfHkOI .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-eJ1K6uDrtcyfHkOI .marker{fill:#333333;stroke:#333333;}#mermaid-svg-eJ1K6uDrtcyfHkOI .marker.cross{stroke:#333333;}#mermaid-svg-eJ1K6uDrtcyfHkOI svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-eJ1K6uDrtcyfHkOI p{margin:0;}#mermaid-svg-eJ1K6uDrtcyfHkOI .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-eJ1K6uDrtcyfHkOI .cluster-label text{fill:#333;}#mermaid-svg-eJ1K6uDrtcyfHkOI .cluster-label span{color:#333;}#mermaid-svg-eJ1K6uDrtcyfHkOI .cluster-label span p{background-color:transparent;}#mermaid-svg-eJ1K6uDrtcyfHkOI .label text,#mermaid-svg-eJ1K6uDrtcyfHkOI span{fill:#333;color:#333;}#mermaid-svg-eJ1K6uDrtcyfHkOI .node rect,#mermaid-svg-eJ1K6uDrtcyfHkOI .node circle,#mermaid-svg-eJ1K6uDrtcyfHkOI .node ellipse,#mermaid-svg-eJ1K6uDrtcyfHkOI .node polygon,#mermaid-svg-eJ1K6uDrtcyfHkOI .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-eJ1K6uDrtcyfHkOI .rough-node .label text,#mermaid-svg-eJ1K6uDrtcyfHkOI .node .label text,#mermaid-svg-eJ1K6uDrtcyfHkOI .image-shape .label,#mermaid-svg-eJ1K6uDrtcyfHkOI .icon-shape .label{text-anchor:middle;}#mermaid-svg-eJ1K6uDrtcyfHkOI .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-eJ1K6uDrtcyfHkOI .rough-node .label,#mermaid-svg-eJ1K6uDrtcyfHkOI .node .label,#mermaid-svg-eJ1K6uDrtcyfHkOI .image-shape .label,#mermaid-svg-eJ1K6uDrtcyfHkOI .icon-shape .label{text-align:center;}#mermaid-svg-eJ1K6uDrtcyfHkOI .node.clickable{cursor:pointer;}#mermaid-svg-eJ1K6uDrtcyfHkOI .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-eJ1K6uDrtcyfHkOI .arrowheadPath{fill:#333333;}#mermaid-svg-eJ1K6uDrtcyfHkOI .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-eJ1K6uDrtcyfHkOI .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-eJ1K6uDrtcyfHkOI .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eJ1K6uDrtcyfHkOI .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-eJ1K6uDrtcyfHkOI .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eJ1K6uDrtcyfHkOI .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-eJ1K6uDrtcyfHkOI .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-eJ1K6uDrtcyfHkOI .cluster text{fill:#333;}#mermaid-svg-eJ1K6uDrtcyfHkOI .cluster span{color:#333;}#mermaid-svg-eJ1K6uDrtcyfHkOI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-eJ1K6uDrtcyfHkOI .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-eJ1K6uDrtcyfHkOI rect.text{fill:none;stroke-width:0;}#mermaid-svg-eJ1K6uDrtcyfHkOI .icon-shape,#mermaid-svg-eJ1K6uDrtcyfHkOI .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-eJ1K6uDrtcyfHkOI .icon-shape p,#mermaid-svg-eJ1K6uDrtcyfHkOI .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-eJ1K6uDrtcyfHkOI .icon-shape .label rect,#mermaid-svg-eJ1K6uDrtcyfHkOI .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-eJ1K6uDrtcyfHkOI .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-eJ1K6uDrtcyfHkOI .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-eJ1K6uDrtcyfHkOI :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是 OPEN
否 CLOSED
否 线程池满被拒绝

成功
失败 / 超时 / 抛异常


请求进入

调用 @HystrixCommand 方法
① 断路器是否打开?
⑥ 直接执行降级逻辑

getFallback()
② 线程池 / 信号量

资源是否可用?
③ 线程池中执行真实调用

run() → Feign → provider
④ 调用是否成功?
⑤ 返回真实结果
⑦ 返回兜底数据

不向调用方抛异常
⑧ 统计并上报指标

成功 / 失败 / 超时 / 拒绝
⑨ 滚动窗口内失败率

≥ 阈值(默认50%)?
⑩ 断路器打开 OPEN

后续请求直接降级

这张图是理解 Hystrix 的钥匙:熔断 → 隔离 → 执行 → 降级 → 统计 → 再熔断,环环相扣。下面第三节详细讲"资源隔离",第四节讲各项阈值配置。


三、资源隔离:线程池与信号量

Hystrix实现熔断的核心手段是资源隔离,它提供了两种隔离策略。

3.1 为什么需要资源隔离

如果不做隔离,所有调用下游服务的请求都共用Tomcat的主线程池。一旦某个下游服务变慢,调用它的线程全部阻塞,Tomcat线程池被占满,连不依赖那个服务的接口也无法访问。

资源隔离就是给每个依赖(或每组依赖)分配独立的资源,一个依赖出问题不会影响其他依赖。

3.2 线程池隔离(默认推荐)

Hystrix默认使用线程池隔离。每个Command(被@HystrixCommand标注的方法)运行在独立的线程池中:
#mermaid-svg-bAmZe8dARuAKFcQn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bAmZe8dARuAKFcQn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bAmZe8dARuAKFcQn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bAmZe8dARuAKFcQn .error-icon{fill:#552222;}#mermaid-svg-bAmZe8dARuAKFcQn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bAmZe8dARuAKFcQn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bAmZe8dARuAKFcQn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bAmZe8dARuAKFcQn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bAmZe8dARuAKFcQn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bAmZe8dARuAKFcQn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bAmZe8dARuAKFcQn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bAmZe8dARuAKFcQn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bAmZe8dARuAKFcQn .marker.cross{stroke:#333333;}#mermaid-svg-bAmZe8dARuAKFcQn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bAmZe8dARuAKFcQn p{margin:0;}#mermaid-svg-bAmZe8dARuAKFcQn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bAmZe8dARuAKFcQn .cluster-label text{fill:#333;}#mermaid-svg-bAmZe8dARuAKFcQn .cluster-label span{color:#333;}#mermaid-svg-bAmZe8dARuAKFcQn .cluster-label span p{background-color:transparent;}#mermaid-svg-bAmZe8dARuAKFcQn .label text,#mermaid-svg-bAmZe8dARuAKFcQn span{fill:#333;color:#333;}#mermaid-svg-bAmZe8dARuAKFcQn .node rect,#mermaid-svg-bAmZe8dARuAKFcQn .node circle,#mermaid-svg-bAmZe8dARuAKFcQn .node ellipse,#mermaid-svg-bAmZe8dARuAKFcQn .node polygon,#mermaid-svg-bAmZe8dARuAKFcQn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bAmZe8dARuAKFcQn .rough-node .label text,#mermaid-svg-bAmZe8dARuAKFcQn .node .label text,#mermaid-svg-bAmZe8dARuAKFcQn .image-shape .label,#mermaid-svg-bAmZe8dARuAKFcQn .icon-shape .label{text-anchor:middle;}#mermaid-svg-bAmZe8dARuAKFcQn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bAmZe8dARuAKFcQn .rough-node .label,#mermaid-svg-bAmZe8dARuAKFcQn .node .label,#mermaid-svg-bAmZe8dARuAKFcQn .image-shape .label,#mermaid-svg-bAmZe8dARuAKFcQn .icon-shape .label{text-align:center;}#mermaid-svg-bAmZe8dARuAKFcQn .node.clickable{cursor:pointer;}#mermaid-svg-bAmZe8dARuAKFcQn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bAmZe8dARuAKFcQn .arrowheadPath{fill:#333333;}#mermaid-svg-bAmZe8dARuAKFcQn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bAmZe8dARuAKFcQn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bAmZe8dARuAKFcQn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bAmZe8dARuAKFcQn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bAmZe8dARuAKFcQn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bAmZe8dARuAKFcQn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bAmZe8dARuAKFcQn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bAmZe8dARuAKFcQn .cluster text{fill:#333;}#mermaid-svg-bAmZe8dARuAKFcQn .cluster span{color:#333;}#mermaid-svg-bAmZe8dARuAKFcQn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bAmZe8dARuAKFcQn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bAmZe8dARuAKFcQn rect.text{fill:none;stroke-width:0;}#mermaid-svg-bAmZe8dARuAKFcQn .icon-shape,#mermaid-svg-bAmZe8dARuAKFcQn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bAmZe8dARuAKFcQn .icon-shape p,#mermaid-svg-bAmZe8dARuAKFcQn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bAmZe8dARuAKFcQn .icon-shape .label rect,#mermaid-svg-bAmZe8dARuAKFcQn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bAmZe8dARuAKFcQn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bAmZe8dARuAKFcQn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bAmZe8dARuAKFcQn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Hystrix 独立线程池(按依赖隔离)
Tomcat 主线程池(处理HTTP请求)
① 委托给独立线程池执行
① 委托给独立线程池执行
① 委托给独立线程池执行
② 故障:占满自身 5 个线程

被拒请求走降级
③ 不影响其他依赖
业务线程 1
业务线程 2
业务线程 N
user-service 线程池

10 线程 + 队列
order-service 线程池

10 线程 + 队列
pay-service 线程池

5 线程 + 队列
调用 用户服务
调用 订单服务
调用 支付服务
Fallback 兜底

即使pay-service出问题把自己的5个线程全占满,也不会影响user和order的调用。

线程池隔离的优点:

  • 隔离性好,一个依赖的阻塞不影响其他依赖
  • 支持异步调用和超时控制(可以在独立线程里做中断)
  • 可以给不同依赖设置不同的线程池大小、队列长度

缺点:

  • 线程切换有一定开销(但这个开销通常可以接受)
  • 每个依赖一个线程池,线程数量增多

3.3 信号量隔离

信号量隔离不创建新线程,而是通过一个计数器(Semaphore)限制对某个依赖的并发访问数:

java 复制代码
@HystrixCommand(
    commandProperties = {
        @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE"),
        @HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests", value = "10")
    }
)
public User getUser(Long id) {
    return userFeignClient.getUserById(id);
}

信号量隔离在调用方线程(Tomcat线程)里直接执行,当并发数超过阈值时直接拒绝。

信号量隔离的优点:

  • 无线程切换开销,性能高
  • 适合内部调用、响应非常快的场景

缺点:

  • 不支持超时中断(请求发出去只能等下游返回,不能主动终止)
  • 不支持异步
  • 隔离性不如线程池,下游慢还是会阻塞Tomcat线程

3.4 两种隔离怎么选

对比项 线程池隔离 信号量隔离
执行线程 Hystrix独立线程池 调用方(Tomcat)线程
超时控制 支持(可中断) 不支持(只能等)
异步支持 支持 不支持
开销 有线程切换开销 几乎无开销
隔离性
适用场景 跨服务调用、响应慢的依赖 本地方法、非常快的内部调用

默认用线程池隔离即可。 只有在调用频率极高(每秒上万次)且响应极快(毫秒级)的场景才考虑信号量。


四、Hystrix核心配置

4.1 超时配置

java 复制代码
@HystrixCommand(
    commandProperties = {
        // 超时时间(毫秒),默认1000ms
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000"),
        // 是否开启超时,默认true
        @HystrixProperty(name = "execution.timeout.enabled", value = "true")
    }
)

⚠️ Hystrix超时要和Ribbon超时配合,必须大于 Ribbon 的总超时(含重试次数):

T h y s t r i x ≥ ( T c o n n e c t + T r e a d ) × ( N r e t r i e s + 1 ) × ( N n e x t S e r v e r + 1 ) T_{hystrix} \ge (T_{connect} + T_{read}) \times (N_{retries} + 1) \times (N_{nextServer} + 1) Thystrix≥(Tconnect+Tread)×(Nretries+1)×(NnextServer+1)

比如Ribbon ConnectTimeout=2秒,ReadTimeout=5秒,重试1次,则 T h y s t r i x > ( 2 + 5 ) × 2 = 14 T_{hystrix} > (2+5)\times2 = 14 Thystrix>(2+5)×2=14 秒。否则Hystrix先超时,重试还没结束就被降级了。

4.2 断路器配置

java 复制代码
@HystrixCommand(
    commandProperties = {
        // 是否开启断路器,默认true
        @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
        // 滚动时间窗口内至少有多少个请求才触发熔断判断,默认20
        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "20"),
        // 错误率阈值(百分比),默认50
        @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50"),
        // 断路器打开后多久进入半开状态(毫秒),默认5000
        @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000")
    }
)

这几个参数是什么意思?举个例子:

  • requestVolumeThreshold=20:10秒(默认窗口)内至少有20个请求,才会计算失败率。如果只有3个请求全失败了,也不会熔断
  • errorThresholdPercentage=50:当失败率超过50%时,断路器打开
  • sleepWindowInMilliseconds=5000:断路器打开5秒后进入半开状态,放一个请求试探

4.3 线程池配置

java 复制代码
@HystrixCommand(
    groupKey = "userGroup",
    commandKey = "getUser",
    threadPoolKey = "userThreadPool",
    threadPoolProperties = {
        // 核心线程数,默认10
        @HystrixProperty(name = "coreSize", value = "10"),
        // 队列大小,默认-1(用SynchronousQueue,不排队)
        // 设为正数用LinkedBlockingQueue
        @HystrixProperty(name = "maxQueueSize", value = "20"),
        // 队列拒绝阈值,即使maxQueueSize没到,达到这个数也拒绝
        @HystrixProperty(name = "queueSizeRejectionThreshold", value = "15"),
        // 空闲线程存活时间(分钟)
        @HystrixProperty(name = "keepAliveTimeMinutes", value = "1")
    }
)
  • coreSize:线程池核心线程数,根据下游接口的QPS和响应时间估算。比如接口平均响应100ms,每个线程每秒处理10个请求,10个线程每秒能处理100个请求
  • maxQueueSize=-1:默认用SynchronousQueue,不缓冲请求,线程都忙就直接拒绝并降级
  • maxQueueSize>0:用有界队列排队,但要注意队列堆积会增加延迟

4.4 全局配置(yaml)

如果不想在注解里一个个配,可以写在配置文件里,作用于所有HystrixCommand:

yaml 复制代码
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000
      circuitBreaker:
        requestVolumeThreshold: 20
        errorThresholdPercentage: 50
        sleepWindowInMilliseconds: 5000
  threadpool:
    default:
      coreSize: 10
      maxQueueSize: 20

也可以针对某个commandKey单独配置,把default换成commandKey即可。


五、Feign整合Hystrix

5.1 开启Feign对Hystrix的支持

yaml 复制代码
feign:
  hystrix:
    enabled: true

5.2 Feign接口降级

给Feign接口写一个降级实现类:

java 复制代码
@Component
public class UserFeignFallback implements UserFeignClient {

    @Override
    public User getUserById(Long id) {
        User user = new User();
        user.setId(id);
        user.setName("用户服务暂不可用,请稍后重试");
        return user;
    }

    @Override
    public List<User> listUsers() {
        return Collections.emptyList();
    }

    @Override
    public User createUser(User user) {
        throw new BusinessException("创建失败,用户服务暂不可用");
    }

    @Override
    public String updateUser(User user) {
        return "更新失败,用户服务暂不可用";
    }

    @Override
    public String deleteUser(Long id) {
        return "删除失败,用户服务暂不可用";
    }
}

然后在@FeignClient上指定fallback:

java 复制代码
@FeignClient(name = "user-provider", fallback = UserFeignFallback.class)
public interface UserFeignClient { ... }

当调用user-provider失败、超时或熔断时,会自动调用降级实现类里对应的方法返回兜底结果。

5.3 Feign + Hystrix 调用流程图

#mermaid-svg-WhpSTc4kaQjWI0Jx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WhpSTc4kaQjWI0Jx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WhpSTc4kaQjWI0Jx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WhpSTc4kaQjWI0Jx .error-icon{fill:#552222;}#mermaid-svg-WhpSTc4kaQjWI0Jx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WhpSTc4kaQjWI0Jx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WhpSTc4kaQjWI0Jx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WhpSTc4kaQjWI0Jx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WhpSTc4kaQjWI0Jx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WhpSTc4kaQjWI0Jx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WhpSTc4kaQjWI0Jx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WhpSTc4kaQjWI0Jx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WhpSTc4kaQjWI0Jx .marker.cross{stroke:#333333;}#mermaid-svg-WhpSTc4kaQjWI0Jx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WhpSTc4kaQjWI0Jx p{margin:0;}#mermaid-svg-WhpSTc4kaQjWI0Jx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WhpSTc4kaQjWI0Jx .cluster-label text{fill:#333;}#mermaid-svg-WhpSTc4kaQjWI0Jx .cluster-label span{color:#333;}#mermaid-svg-WhpSTc4kaQjWI0Jx .cluster-label span p{background-color:transparent;}#mermaid-svg-WhpSTc4kaQjWI0Jx .label text,#mermaid-svg-WhpSTc4kaQjWI0Jx span{fill:#333;color:#333;}#mermaid-svg-WhpSTc4kaQjWI0Jx .node rect,#mermaid-svg-WhpSTc4kaQjWI0Jx .node circle,#mermaid-svg-WhpSTc4kaQjWI0Jx .node ellipse,#mermaid-svg-WhpSTc4kaQjWI0Jx .node polygon,#mermaid-svg-WhpSTc4kaQjWI0Jx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WhpSTc4kaQjWI0Jx .rough-node .label text,#mermaid-svg-WhpSTc4kaQjWI0Jx .node .label text,#mermaid-svg-WhpSTc4kaQjWI0Jx .image-shape .label,#mermaid-svg-WhpSTc4kaQjWI0Jx .icon-shape .label{text-anchor:middle;}#mermaid-svg-WhpSTc4kaQjWI0Jx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WhpSTc4kaQjWI0Jx .rough-node .label,#mermaid-svg-WhpSTc4kaQjWI0Jx .node .label,#mermaid-svg-WhpSTc4kaQjWI0Jx .image-shape .label,#mermaid-svg-WhpSTc4kaQjWI0Jx .icon-shape .label{text-align:center;}#mermaid-svg-WhpSTc4kaQjWI0Jx .node.clickable{cursor:pointer;}#mermaid-svg-WhpSTc4kaQjWI0Jx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WhpSTc4kaQjWI0Jx .arrowheadPath{fill:#333333;}#mermaid-svg-WhpSTc4kaQjWI0Jx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WhpSTc4kaQjWI0Jx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WhpSTc4kaQjWI0Jx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WhpSTc4kaQjWI0Jx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WhpSTc4kaQjWI0Jx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WhpSTc4kaQjWI0Jx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WhpSTc4kaQjWI0Jx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WhpSTc4kaQjWI0Jx .cluster text{fill:#333;}#mermaid-svg-WhpSTc4kaQjWI0Jx .cluster span{color:#333;}#mermaid-svg-WhpSTc4kaQjWI0Jx div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WhpSTc4kaQjWI0Jx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WhpSTc4kaQjWI0Jx rect.text{fill:none;stroke-width:0;}#mermaid-svg-WhpSTc4kaQjWI0Jx .icon-shape,#mermaid-svg-WhpSTc4kaQjWI0Jx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WhpSTc4kaQjWI0Jx .icon-shape p,#mermaid-svg-WhpSTc4kaQjWI0Jx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WhpSTc4kaQjWI0Jx .icon-shape .label rect,#mermaid-svg-WhpSTc4kaQjWI0Jx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WhpSTc4kaQjWI0Jx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WhpSTc4kaQjWI0Jx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WhpSTc4kaQjWI0Jx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 成功
失败 / 超时 / 熔断
fallback
fallbackFactory
业务代码调用

UserFeignClient.getUserById(id)
Feign 动态代理
Hystrix 包裹请求

feign.hystrix.enabled=true
调用 user-provider 服务
返回真实 User 数据
配置了哪种兜底?
UserFeignFallback

降级实现类
UserFeignFallbackFactory

拿到 Throwable 异常原因
返回兜底数据

5.4 获取降级原因(fallbackFactory)

普通的fallback拿不到异常信息,如果想知道是什么原因导致的降级,可以用FallbackFactory

java 复制代码
@Component
@Slf4j
public class UserFeignFallbackFactory implements FallbackFactory<UserFeignClient> {

    @Override
    public UserFeignClient create(Throwable cause) {
        log.error("用户服务调用失败,进入降级", cause);

        return new UserFeignClient() {
            @Override
            public User getUserById(Long id) {
                log.error("getUserById降级,id={},原因:{}", id, cause.getMessage());
                User user = new User();
                user.setId(id);
                user.setName("服务降级(" + cause.getMessage() + ")");
                return user;
            }

            @Override
            public List<User> listUsers() {
                return Collections.emptyList();
            }

            @Override
            public User createUser(User user) {
                throw new BusinessException("创建失败:" + cause.getMessage());
            }

            @Override
            public String updateUser(User user) {
                return "更新失败";
            }

            @Override
            public String deleteUser(Long id) {
                return "删除失败";
            }
        };
    }
}

在@FeignClient上指定fallbackFactory:

java 复制代码
@FeignClient(name = "user-provider", fallbackFactory = UserFeignFallbackFactory.class)
public interface UserFeignClient { ... }

💡 我个人更推荐用fallbackFactory,因为能记录异常原因,排查问题时非常有用。fallback和fallbackFactory二选一即可。


六、实操验证:停掉Provider,实测降级与熔断恢复

纸上得来终觉浅,下面用本系列 demo 项目(Eureka + user-provider + user-consumer)完整走一遍:正常调用 → 停掉下游 → 触发降级 → 连续失败触发熔断 → 恢复下游 → 熔断自动关闭
user-provider user-consumer 浏览器 user-provider user-consumer 浏览器 #mermaid-svg-rF3ZlTYA3XDl2Xqx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rF3ZlTYA3XDl2Xqx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .error-icon{fill:#552222;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .marker.cross{stroke:#333333;}#mermaid-svg-rF3ZlTYA3XDl2Xqx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rF3ZlTYA3XDl2Xqx p{margin:0;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-rF3ZlTYA3XDl2Xqx text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-rF3ZlTYA3XDl2Xqx .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-rF3ZlTYA3XDl2Xqx #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .sequenceNumber{fill:white;}#mermaid-svg-rF3ZlTYA3XDl2Xqx #sequencenumber{fill:#333;}#mermaid-svg-rF3ZlTYA3XDl2Xqx #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .messageText{fill:#333;stroke:none;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .labelText,#mermaid-svg-rF3ZlTYA3XDl2Xqx .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .loopText,#mermaid-svg-rF3ZlTYA3XDl2Xqx .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-rF3ZlTYA3XDl2Xqx .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .noteText,#mermaid-svg-rF3ZlTYA3XDl2Xqx .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .actorPopupMenu{position:absolute;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-rF3ZlTYA3XDl2Xqx .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-rF3ZlTYA3XDl2Xqx .actor-man circle,#mermaid-svg-rF3ZlTYA3XDl2Xqx line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-rF3ZlTYA3XDl2Xqx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ① 正常状态 ② 停掉 user-provider ③ 连续失败达到阈值,断路器 OPEN ④ 重启 user-provider sleepWindow 后进入 HALF_OPEN 试探 GET /user/1 Feign 调用 getUserById(1) 200 真实 User 返回真实数据 GET /user/1 连接失败 / 超时 触发 Fallback 降级 返回兜底数据(不再报500) GET /user/1 断路器已打开,直接走降级 返回兜底数据 GET /user/1 试探请求成功 200 真实 User 恢复真实数据

6.1 第一步:正常调用

依次启动 Eureka、user-provider、user-consumer 三个服务(端口见各服务配置文件),然后访问:

复制代码
GET http://localhost:消费者端口/user/1

返回真实数据:

json 复制代码
{
  "id": 1,
  "name": "张三",
  "email": "zhangsan@example.com"
}

6.2 第二步:停掉Provider,观察降级

直接把 user-provider 停掉(模拟服务宕机),再次访问上面的接口,会发现接口不报 500,而是返回兜底数据

json 复制代码
{
  "id": 1,
  "name": "服务降级了,这是默认用户",
  "email": "fallback@example.com"
}

这就是降级的效果:宁可返回一个兜底结果,也不把异常堆栈抛给前端,保证接口"有响应"。

6.3 第三步:连续访问,触发熔断

保持 provider 停止,连续快速访问接口(请求数超过 requestVolumeThreshold=20、失败率超过 50% 后),观察 consumer 控制台日志,会出现类似输出:

复制代码
Hystrix Circuit-Breaker: UserController#getUser(Long) is OPEN and has failed 21 times

此时再访问接口,请求不再真正发往下游,而是直接走降级逻辑------断路器已经打开。

6.4 第四步:恢复Provider,观察熔断自动关闭

重新启动 user-provider,等待 sleepWindowInMilliseconds=5000(默认5秒)后,Hystrix 进入 HALF_OPEN 半开状态,放一个请求试探。此时访问接口,试探成功,断路器自动关闭,恢复正常返回真实数据。

💡 这一步验证了断路器"CLOSED → OPEN → HALF_OPEN → CLOSED"的完整闭环,建议结合 Hystrix Dashboard 一起观察状态切换过程(见第八章)。


七、异常传递与忽略

7.1 默认异常处理

默认情况下,Hystrix会捕获方法抛出的所有异常(包括业务异常)并触发降级。但有些场景我们希望某些异常直接抛给调用方,不要走降级逻辑。

7.2 忽略指定异常

java 复制代码
@HystrixCommand(
    fallbackMethod = "getUserFallback",
    ignoreExceptions = {BusinessException.class, IllegalArgumentException.class}
)
public User getUser(Long id) {
    if (id == null || id <= 0) {
        // 参数校验异常直接抛出,不降级
        throw new IllegalArgumentException("用户ID不合法");
    }
    return userFeignClient.getUserById(id);
}

配置了ignoreExceptions后,这些异常会直接抛给调用方,不会触发fallback。

7.3 降级方法中获取异常

fallback方法可以额外加一个Throwable参数来接收异常:

java 复制代码
public User getUserFallback(Long id, Throwable throwable) {
    log.error("getUser降级,id={}", id, throwable);
    User user = new User();
    user.setName("服务异常:" + throwable.getMessage());
    return user;
}

注意:加了Throwable参数后,其他参数顺序要和原方法一致,Throwable放在最后。


八、Hystrix Dashboard监控仪表盘

Hystrix提供了一个可视化的监控仪表盘,可以实时查看每个接口的成功/失败次数、熔断状态、响应时间、线程池状态等。

8.1 监控架构

#mermaid-svg-QjqUkJH81rjPGldS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-QjqUkJH81rjPGldS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-QjqUkJH81rjPGldS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-QjqUkJH81rjPGldS .error-icon{fill:#552222;}#mermaid-svg-QjqUkJH81rjPGldS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-QjqUkJH81rjPGldS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-QjqUkJH81rjPGldS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-QjqUkJH81rjPGldS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-QjqUkJH81rjPGldS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-QjqUkJH81rjPGldS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-QjqUkJH81rjPGldS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-QjqUkJH81rjPGldS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-QjqUkJH81rjPGldS .marker.cross{stroke:#333333;}#mermaid-svg-QjqUkJH81rjPGldS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-QjqUkJH81rjPGldS p{margin:0;}#mermaid-svg-QjqUkJH81rjPGldS .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-QjqUkJH81rjPGldS .cluster-label text{fill:#333;}#mermaid-svg-QjqUkJH81rjPGldS .cluster-label span{color:#333;}#mermaid-svg-QjqUkJH81rjPGldS .cluster-label span p{background-color:transparent;}#mermaid-svg-QjqUkJH81rjPGldS .label text,#mermaid-svg-QjqUkJH81rjPGldS span{fill:#333;color:#333;}#mermaid-svg-QjqUkJH81rjPGldS .node rect,#mermaid-svg-QjqUkJH81rjPGldS .node circle,#mermaid-svg-QjqUkJH81rjPGldS .node ellipse,#mermaid-svg-QjqUkJH81rjPGldS .node polygon,#mermaid-svg-QjqUkJH81rjPGldS .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-QjqUkJH81rjPGldS .rough-node .label text,#mermaid-svg-QjqUkJH81rjPGldS .node .label text,#mermaid-svg-QjqUkJH81rjPGldS .image-shape .label,#mermaid-svg-QjqUkJH81rjPGldS .icon-shape .label{text-anchor:middle;}#mermaid-svg-QjqUkJH81rjPGldS .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-QjqUkJH81rjPGldS .rough-node .label,#mermaid-svg-QjqUkJH81rjPGldS .node .label,#mermaid-svg-QjqUkJH81rjPGldS .image-shape .label,#mermaid-svg-QjqUkJH81rjPGldS .icon-shape .label{text-align:center;}#mermaid-svg-QjqUkJH81rjPGldS .node.clickable{cursor:pointer;}#mermaid-svg-QjqUkJH81rjPGldS .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-QjqUkJH81rjPGldS .arrowheadPath{fill:#333333;}#mermaid-svg-QjqUkJH81rjPGldS .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-QjqUkJH81rjPGldS .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-QjqUkJH81rjPGldS .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QjqUkJH81rjPGldS .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-QjqUkJH81rjPGldS .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QjqUkJH81rjPGldS .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-QjqUkJH81rjPGldS .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-QjqUkJH81rjPGldS .cluster text{fill:#333;}#mermaid-svg-QjqUkJH81rjPGldS .cluster span{color:#333;}#mermaid-svg-QjqUkJH81rjPGldS div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-QjqUkJH81rjPGldS .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-QjqUkJH81rjPGldS rect.text{fill:none;stroke-width:0;}#mermaid-svg-QjqUkJH81rjPGldS .icon-shape,#mermaid-svg-QjqUkJH81rjPGldS .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-QjqUkJH81rjPGldS .icon-shape p,#mermaid-svg-QjqUkJH81rjPGldS .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-QjqUkJH81rjPGldS .icon-shape .label rect,#mermaid-svg-QjqUkJH81rjPGldS .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-QjqUkJH81rjPGldS .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-QjqUkJH81rjPGldS .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-QjqUkJH81rjPGldS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 浏览器
Hystrix Dashboard 服务
被监控服务 user-consumer
② 推送监控数据流
③ 前端渲染
@HystrixCommand 接口

UserController.getUser
Hystrix 指标聚合器

成功/失败/超时/拒绝计数
/actuator/hystrix.stream 端点
监控看板

熔断状态 · 错误率 · 线程池
http://localhost:端口/hystrix

实时可视化

8.2 搭建Dashboard

新建一个模块或在consumer里加依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

启动类加@EnableHystrixDashboard

java 复制代码
@SpringBootApplication
@EnableHystrixDashboard
public class DashboardApplication { ... }

配置文件暴露hystrix.stream端点:

yaml 复制代码
management:
  endpoints:
    web:
      exposure:
        include: hystrix.stream,info,health

8.3 使用Dashboard

  1. 启动Dashboard服务,访问 http://localhost:端口/hystrix
  2. 在输入框填入被监控服务的hystrix.stream地址,比如 http://localhost:8080/actuator/hystrix.stream
  3. 点击Monitor Stream,就能看到实时监控界面

监控界面上会显示:

  • 每个方法的请求量、成功/失败/超时/拒绝次数
  • 错误百分比
  • 断路器状态(Closed/Open/HalfOpen)
  • 响应时间分布(P50/P90/P99)
  • 线程池活跃数和队列大小

💡 如果界面一直显示loading,先访问几次被@HystrixCommand标注的接口,产生一些调用数据后Dashboard才会显示。


九、Hystrix停止维护与替代方案

9.1 Hystrix现状

Netflix在2018年宣布Hystrix进入维护模式,不再开发新功能,只修复bug。Spring Cloud也从Greenwich版本开始逐步把Hystrix标记为deprecated,Hoxton是最后一个还默认支持Hystrix的版本。

虽然Hystrix不再更新,但它的断路器设计思想和使用方式仍然值得学习,而且很多老项目还在用。

9.2 替代方案对比

特性 Hystrix Resilience4j Sentinel
维护方 Netflix(已停更) Resilience4j社区 阿里巴巴
语言/平台 Java Java8+函数式 Java
熔断降级
限流 ✅ RateLimiter ✅(强大)
信号量隔离
线程池隔离 ❌(推荐信号量)
热点参数限流
系统自适应限流
控制台/Dashboard ✅ Hystrix Dashboard 需自己搭 ✅ Sentinel Dashboard
配置实时推送
与Spring Cloud集成 spring-cloud-netflix spring-cloud-circuitbreaker spring-cloud-alibaba
学习曲线 中等 较陡(函数式) 平缓
社区活跃度 高(国内)

9.3 选型建议

  • 老项目:如果已经在用Hystrix,可以继续用,稳定即可,不必为了换而换
  • 新项目 :国内Java项目推荐Sentinel,功能全面(限流+熔断+系统保护),中文文档好,Dashboard好用,和Spring Cloud Alibaba无缝集成
  • 轻量级/函数式风格:可以考虑Resilience4j,它是为Java8和函数式编程设计的,轻量无依赖
  • 我们这个系列后续Alibaba篇会详细讲Sentinel

十、常见问题

1. fallback方法不生效

  • 检查fallback方法名是否和fallbackMethod一致
  • 检查参数列表和返回值是否与原方法一致(Throwable参数放最后)
  • 检查类是否被Spring管理(@RestController/@Service等)
  • 检查异常是否在ignoreExceptions里
  • 注意:同类内部方法调用不走代理,@HystrixCommand不生效(AOP自调用问题)

2. Hystrix超时时间设多少

  • 必须大于Ribbon总超时(含重试),否则重试会被中断
  • 公式: T h y s t r i x ≥ ( T c o n n e c t + T r e a d ) × ( N r e t r i e s + 1 ) × ( N n e x t S e r v e r + 1 ) T_{hystrix} \ge (T_{connect} + T_{read}) \times (N_{retries} + 1) \times (N_{nextServer} + 1) Thystrix≥(Tconnect+Tread)×(Nretries+1)×(NnextServer+1)

3. 断路器不打开

  • requestVolumeThreshold默认20,请求量不够时不会触发熔断
  • 确认错误率达到了errorThresholdPercentage(默认50%)
  • 确认异常不是被ignoreExceptions忽略了

4. Feign降级不生效

  • 确认feign.hystrix.enabled=true
  • 确认fallback/fallbackFactory类加了@Component
  • 确认@FeignClient上正确配置了fallback属性

十一、高频面试题

1. 什么是服务雪崩?怎么防止?

服务雪崩是指下游某个服务故障,导致上游调用方线程阻塞耗尽,进而沿调用链向上蔓延,最终整个系统不可用。防止手段:熔断(断路器,失败率达到阈值直接拒绝调用)、降级(返回兜底结果)、资源隔离(线程池/信号量,一个依赖故障不影响其他)、超时控制(不让线程无限等待)。

2. 断路器有哪几种状态?怎么切换?

三种状态:CLOSED(关闭,正常调用并统计失败率)、OPEN(打开,直接降级不调用下游)、HALF_OPEN(半开,OPEN一段时间后放少量请求试探)。当CLOSED状态下滚动窗口内失败率达到阈值,切换到OPEN;OPEN持续sleepWindow时间后切换到HALF_OPEN;HALF_OPEN时试探成功切回CLOSED,失败回到OPEN。

3. 线程池隔离和信号量隔离的区别?怎么选?

线程池隔离用独立线程池执行,支持超时中断和异步,隔离性强但有线程切换开销,适合跨服务调用和慢接口;信号量隔离在调用方线程执行,通过计数器限制并发,无切换开销但不支持超时和异步,适合极快的内部调用。默认用线程池隔离。

4. Hystrix超时和Ribbon超时怎么配合?

Hystrix超时必须大于Ribbon总超时(包含重试)。公式是: T h y s t r i x ≥ ( T c o n n e c t + T r e a d ) × ( N r e t r i e s + 1 ) × ( N n e x t S e r v e r + 1 ) T_{hystrix} \ge (T_{connect} + T_{read}) \times (N_{retries} + 1) \times (N_{nextServer} + 1) Thystrix≥(Tconnect+Tread)×(Nretries+1)×(NnextServer+1)。否则Hystrix先超时降级,Ribbon重试还没完成就被打断了。

5. Feign整合Hystrix怎么做降级?fallback和fallbackFactory的区别?

配置feign.hystrix.enabled=true,写一个实现Feign接口的类加@Component,在@FeignClient上指定fallback。fallbackFactory可以拿到导致降级的异常对象(Throwable),方便记录日志排查问题;fallback只能做简单降级拿不到异常。推荐用fallbackFactory。

6. Hystrix的核心配置参数有哪些?

断路器相关:circuitBreaker.requestVolumeThreshold(窗口最小请求数,默认20)、errorThresholdPercentage(失败率阈值,默认50%)、sleepWindowInMilliseconds(半开等待时间,默认5秒)。超时:execution.isolation.thread.timeoutInMilliseconds(默认1秒)。线程池:coreSize(默认10)、maxQueueSize。

7. Hystrix已经停更了,现在用什么?

推荐用Alibaba Sentinel,支持熔断降级、限流、热点参数限流、系统自适应保护,有可视化Dashboard,配置可实时推送,国内生态好。轻量级场景也可以用Resilience4j。老项目用Hystrix也没问题,稳定就不必强制迁移。

8. @HystrixCommand注解在什么情况下不生效?

最常见原因是同类内部方法调用(自调用),Spring AOP代理只拦截外部调用,类内部this.method()不会走代理。解决方法是把方法拆到另一个类,或者自己注入自己调用。另外方法不是public、类没被Spring管理、异常被try-catch吞掉了也会导致不生效。


参考资料


总结

这篇我们讲了Hystrix熔断降级的核心内容:

  • 服务雪崩的成因和断路器模式的三种状态
  • Hystrix基本用法:@HystrixCommand + fallback
  • Hystrix命令执行的完整流程:熔断 → 隔离 → 执行 → 降级 → 统计 → 再熔断
  • 两种资源隔离方式:线程池(推荐)和信号量
  • 核心配置:超时、断路器阈值、线程池参数
  • Feign整合Hystrix做接口降级(fallback和fallbackFactory)
  • 实操验证:停掉下游服务,实测降级与熔断恢复全过程
  • 异常忽略和降级中获取异常
  • Hystrix Dashboard监控
  • Hystrix停更后的替代方案(Sentinel、Resilience4j)

Hystrix虽然不再维护,但它定义了熔断降级的经典模型,理解了这些概念再学Sentinel会很轻松。下一篇我们讲Zuul网关,看看所有外部请求进入微服务系统的第一道关卡是怎么工作的。

写作不易,如果这篇文章对你有帮助,欢迎点赞收藏,你的支持是我持续更新的动力。

你在项目中遇到过服务雪崩吗?或者Hystrix有什么印象深刻的坑?欢迎在评论区留言交流。

相关推荐
vHelios4 小时前
【电商项目】短信测试遇到的问题与解决方案:InaccessibleObjectException报错、单元测试通过但未接收到验证码
java·微服务
天天喝旺仔8 小时前
gRPC 流式通信实战:从一元调用到双向流,吃透四种 RPC 模式(Go 版)
分布式·http·微服务·rpc·go
野熊佩骑21 小时前
Kubernetes实战系列文章(三) 之 K8S运维常用命令
linux·运维·docker·微服务·云原生·容器·kubernetes
ZYJCSZKJ1 天前
基于微服务架构的本地生活POI团购系统设计与高并发实践
微服务·架构·生活
重生之我是Java开发战士1 天前
【Spring Cloud】认识微服务与工程搭建
spring·spring cloud·微服务
MetaLite1 天前
微服务认证选型-SpringSecurity-SaToken与自研方案
微服务·云原生·架构
梦Arrebol2 天前
Kubernetes 微服务
微服务·容器·kubernetes
源代码•宸2 天前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang
墨着染霜华2 天前
SpringCloud Gateway线上Nginx代理后自定义下划线请求头丢失(app_name/app_version获取不到)完美解决
nginx·spring cloud·gateway