- 没有启用熔断器时(默认情况)
@FeignClient(name = "user-service", url = "http://localhost:8080")
public interface UserRemote {
Response getUser();
}
- ✅ 默认行为:直接抛出异常
- ❌ 没有降级:连接失败、超时等会直接向上抛出 FeignException
- ❌ 没有熔断:每次请求都会尝试调用远程服务
- 启用Hystrix时
feign.hystrix.enabled=true
- 🔄 默认熔断策略:
- 10秒内20个请求
- 错误率超过50%时熔断
- 熔断后5秒尝试恢复
- ⚡ 默认超时:1秒
- 📊 默认线程池: 10个线程
- 启用Circuit Breaker时
feign.circuitbreaker.enabled=true
🔄 默认熔断策略:
- 基于Resilience4j的默认配置
- 失败率阈值:50%
- 最小请求数:100
- 等待时间:60秒
- 启用Sentinel时
feign.sentinel.enabled=true
🔄 默认熔断策略:
- 异常比例阈值:50%
- 异常数阈值:5
- 时间窗口:1秒
- 最小请求数: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秒
- 📊 默认流控规则
- QPS限制:无限制(需要手动配置)
- 并发线程数:无限制
- 关联资源:无
- ⚡ 默认超时配置
# 当前的超时配置
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; // 验证失败,拦截器会拒绝请求
}
}
推荐的配置策略
-
fallback配置 ✅
在服务不可用时会降级到SUCCESS,保证业务可用性。 -
可以考虑的优化配置
# 更细粒度的超时配置
feign.client.config.user-private-service.connectTimeout=3000
feign.client.config.user-private-service.readTimeout=3000
总结
OpenFeign fallback的默认策略:
- 🚫 无熔断器时:直接抛异常,无降级
- 🔄 有熔断器时:根据熔断器的默认规则进行熔断和降级
- 📊 Sentinel默认:50%异常率熔断,10秒恢复窗口
- ⚡ 超时默认:根据你的配置(5秒连接+5秒读取)
7909

被折叠的 条评论
为什么被折叠?



