OpenFeign Fallback 几种降级策略

133 阅读2分钟
  1. 没有启用熔断器时(默认情况)
@FeignClient(name = "user-service", url = "http://localhost:8080")
public interface UserRemote {
    Response getUser();
}
  • ✅ 默认行为:直接抛出异常
  • ❌ 没有降级:连接失败、超时等会直接向上抛出 FeignException
  • ❌ 没有熔断:每次请求都会尝试调用远程服务
  1. 启用Hystrix时
feign.hystrix.enabled=true
  • 🔄 默认熔断策略:
  1. 10秒内20个请求
  2. 错误率超过50%时熔断
  3. 熔断后5秒尝试恢复
  4. ⚡ 默认超时:1秒
  5. 📊 默认线程池: 10个线程
  • 启用Circuit Breaker时
feign.circuitbreaker.enabled=true 

🔄 默认熔断策略:

  1. 基于Resilience4j的默认配置
  2. 失败率阈值:50%
  3. 最小请求数:100
  4. 等待时间:60秒
  • 启用Sentinel时
feign.sentinel.enabled=true

🔄 默认熔断策略:

  1. 异常比例阈值:50%
  2. 异常数阈值:5
  3. 时间窗口:1秒
  4. 最小请求数:5

Sentinel的默认策略详解

  • 🎯 默认熔断规则
// Sentinel默认配置
DegradeRule rule = new DegradeRule();
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO); // 异常比例模式
rule.setCount(0.5); // 50%异常比例阈值
rule.setTimeWindow(10); // 熔断时长10秒
rule.setMinRequestAmount(5); // 最小请求数5个
rule.setStatIntervalMs(1000); // 统计时长1秒
  • 📊 默认流控规则
  1. QPS限制:无限制(需要手动配置)
  2. 并发线程数:无限制
  3. 关联资源:无
  4. ⚡ 默认超时配置
# 当前的超时配置
feign.client.config.default.connectTimeout=5000  # 连接超时5秒
feign.client.config.default.readTimeout=5000     # 读取超时5秒

没有fallback时的默认行为 如果你移除 fallbackFactory = UserRemoteFallbackFactory.class

@FeignClient(name = "user-private-service", url = "${user-private-service.url}")
public interface UserRemote {
    Response tokenValidate(String clientId, String userId, String userToken);
}

🚨 默认异常处理

  • 连接失败:抛出 FeignException$ConnectException
  • 读取超时:抛出 FeignException$ReadTimeoutException
  • 服务返回4xx:抛出 FeignException$BadRequest
  • 服务返回5xx:抛出 FeignException$InternalServerError 💥 对你的Token拦截器的影响
// 在TokenValidationService中
public boolean tokenValidate(String userId, String userToken) {
    try {
        Response response = userRemote.tokenValidate(clientId, userId, userToken);
        return response != null && "SUCCESS".equals(response.getResultCode());
    } catch (Exception e) {
        // 没有fallback时,这里会捕获到FeignException
        return false; // 验证失败,拦截器会拒绝请求
    }
}

推荐的配置策略

  1. fallback配置 ✅ 在服务不可用时会降级到SUCCESS,保证业务可用性。

  2. 可以考虑的优化配置

# 更细粒度的超时配置
feign.client.config.user-private-service.connectTimeout=3000
feign.client.config.user-private-service.readTimeout=3000

总结

OpenFeign fallback的默认策略:

  • 🚫 无熔断器时:直接抛异常,无降级
  • 🔄 有熔断器时:根据熔断器的默认规则进行熔断和降级
  • 📊 Sentinel默认:50%异常率熔断,10秒恢复窗口
  • ⚡ 超时默认:根据你的配置(5秒连接+5秒读取)