SpringCloud Fegin CircuitBreaker (原hystrix) 熔断失效原因

今天想着给自己的微服务项目添加一个熔断的功能,正好项目内远程调用是用的feign,那就直接用hystrix好了,也比较方便。

然后呢,我以为比较简单的东西,却一直不生效,资料查了个遍,硬是弄了我一上午+一下午的时间,所以记录一下,给大家避坑。

当前环境

如果你的环境跟我差的有点多,那这篇文章可能对你的帮助不大。

  • JDK8
  • SpringBoot2.6.6
  • openfeign3.1.2 (是我写这篇文章时比较新的版本了)

不生效的原因

原因主要有二

  1. 配置文件

    网上很多教程都是给的旧版本的配置文件,都是feign.hystrix.enabled: true,但在新版本这是不生效的 ,正确的配置应该是下面我这样:

    feign:
      circuitbreaker:
        enabled: true
    复制代码

    可以参考官网文档:docs.spring.io/spring-clou…

### Hystrix熔断降级的概念 Hystrix 是 Netflix 开源的一款用于提高分布式系统容错性和稳定性的库。它通过实现 **熔断机制** 和 **服务降级策略** 来保护应用程序免受级联故障的影响[^1]。当某个微服务不可用或者响应时间过长时,Hystrix 可以快速失败并触发备用逻辑(即降级处理),从而减少对整个系统的负面影响。 #### 熔断机制的核心概念 熔断机制类似于电路中的保险丝,在检测到异常情况时切断请求流以防止进一步损害。具体来说,Hystrix 维护了一个滚动的时间窗口来统计最近一段时间内的请求状态。一旦满足特定条件(例如错误率达到阈值),就会激活熔断器,阻止后续请求进入目标服务直到恢复期结束[^3]。 --- ### Hystrix的工作Hystrix 的工作流程可以分为以下几个方面: #### 1. 请求隔离 为了降低单个依赖项失效带来的风险,Hystrix 将每个外部调用封装在一个独立的线程池或信号量中运行。这种设计使得即使某些依赖出现问题也不会影响其他部分正常运作[^2]。 #### 2. 断路器模式 Hystrix 实现了经典的断路器模式。以下是其主要行为: - 当一定数量的请求连续失败后(由 `circuitBreaker.requestVolumeThreshold` 控制),如果这些请求中有足够的比例发生错误(通常为 50%,可配置),则断路器会被打开。 - 打开状态下,所有新的请求都会被立即拒绝而不会实际发送给远程服务,并执行预先定义好的回退函数 (fallback method)[^3]。 - 进入半开状态:经过一段设定的时间间隔 (`sleepWindowInMilliseconds`) 后,允许少量试探性请求重新尝试连接服务;成功的话就关闭断路器恢复正常操作,否则继续保持开启状态。 #### 3. 超时控制与时限管理 为了避免长时间等待无果的情况,Hystrix 对每一个命令都设置了最大超时时长(`execution.isolation.thread.timeoutInMilliseconds`) 。一旦超出这个时限仍未收到回应,则认为此次调用已经失败并将启动 fallback 方法作为替代方案[^4]。 #### 4. Fallback 回滚机制 每当遇到任何类型的失败情形(包括但不限于网络中断、服务器崩溃或是人为编码失误),都可以指定一个自定义的方法来进行补偿处理 —— 即所谓的 “fallback”。这可能涉及返回缓存数据、静态默认值或者其他合理的选择依据当前上下文环境决定最佳应对措施[^5]。 --- ### 使用方法概述 要集成 Spring Cloud 应用程序与 Hystrix 功能一起使用,需遵循如下几个关键步骤: 1. 添加必要的 Maven 或 Gradle 依赖项至项目构建文件当中; 2. 在主应用类上方标注注解@EnableCircuitBreaker 或者更具体的 @EnableHystrix 注释以便启用相应特性支持; 3. 定义好那些需要受到保护的服务接口方法并通过加注@HystrixCommand 注明它们以及关联起来的具体回调处理器名称等细节信息; 4. 如果有必要还可以调整一些内置参数数值来自定义适应不同业务场景下的需求特点比如修改默认超时毫秒数等等。 下面给出了一段简单的 Java 示例代码展示如何正确地运用以上提到的技术要点完成基本功能开发任务: ```java import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import org.springframework.stereotype.Service; @Service public class MyService { @HystrixCommand(fallbackMethod = "getDefaultResponse") public String fetchData() { // Simulate a remote call that might fail. throw new RuntimeException("Remote service is down!"); } private String getDefaultResponse() { return "Default response due to failure."; } } ``` --- ### 参数详解 | 参数名 | 描述 | 默认值 | |--------------------------------|--------------------------------------------------------------------------------------|------------| | circuitBreaker.enabled | 是否启用断路器 | true | | execution.isolation.thread.timeoutInMilliseconds | 设置 Hystrix 的超时时间,默认 1 秒 | 1000 ms | | circuitBreaker.sleepWindowInMilliseconds | 断路器打开后的休眠时间 | 5000 ms | | circuitBreaker.requestVolumeThreshold | 滑动窗口时间内请求数不能超过该配置 | 20 | | circuitBreaker.errorThresholdPercentage | 错误率达到此百分比时触发熔断 | 50% | ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值