一、概述
"Feign 本身只支持降级(fallback),不支持熔断。
Feign + Hystrix 才能同时实现降级 + 熔断。
新项目用 Sentinel / Resilience4j 替代 Hystrix。"
二、Feign 单独 vs Feign + Hystrix 严格对比
| 维度 | Feign 单独 | Feign + Hystrix | Feign + Sentinel |
|---|---|---|---|
| 降级(Fallback) | ✅ 支持 | ✅ 支持 | ✅ 支持 |
| 熔断(CircuitBreaker) | ❌ 不支持 | ✅ 支持 | ✅ 支持(更强) |
| 限流 | ❌ 不支持 | ✅ 支持 | ✅ 支持(5 大功能) |
| 隔离 | ❌ 不支持 | ✅ 支持(线程池) | ✅ 支持 |
| 项目 | 简单场景 | 老项目 | 新项目推荐 |
三、Feign 单独实现降级 (不依赖 Hystrix)
3.1 完整代码
// 老哥 mpvs 关键时点:Feign 单独 + 降级(不用 Hystrix)
@FeignClient(name = "data-mask-service",
fallback = DataMaskFallback.class) // ⚠️ 降级类
public interface DataMaskFeignClient {
@GetMapping("/api/mask/query")
Result<MaskData> queryMaskData(@RequestParam String bankCode,
@RequestParam String dataId);
@PostMapping("/api/mask/exec")
Result<Void> executeMask(@RequestBody MaskRequest request);
}
// 降级类(实现 Feign 接口)
@Component
public class DataMaskFallback implements DataMaskFeignClient {
@Override
public Result<MaskData> queryMaskData(String bankCode, String dataId) {
log.warn("屏蔽服务降级, bankCode={}, dataId={}", bankCode, dataId);
// ⚠️ 返回兜底数据
return Result.ok(new MaskData("UNKNOWN", "服务降级"));
}
@Override
public Result<Void> executeMask(MaskRequest request) {
log.warn("屏蔽执行降级, request={}", request);
return Result.ok();
}
}
3.2 配置文件
# application.yml
feign:
client:
config:
default:
connectTimeout: 3000
readTimeout: 5000
# ⚠️ 关键:开启 Feign 降级
circuitbreaker:
enabled: true
注意:
- Feign 单独 + 降级 = 服务异常时返回兜底数据
- 没有熔断 ------故障服务一直返回兜底数据 (不会自动恢复)
- 新项目推荐 = Feign + Sentinel(同时实现降级 + 熔断 + 限流 + 隔离)
四、3 大方案严格对比
4.1 方案 1:Feign 单独(最简单)
# 优点:最简单,不用 Hystrix
# 缺点:只支持降级,不支持熔断
feign:
circuitbreaker:
enabled: true
适用场景:
- ✅ 小项目(连接数 < 100)
- ✅ 不要求高可用(故障返回兜底数据即可)
- ❌ 金融项目慎用
4.2 方案 2:Feign + Hystrix(老项目常用)
# 优点:完整 4 大机制(降级 + 熔断 + 隔离 + 限流)
# 缺点:Hystrix 停止维护
feign:
hystrix:
enabled: true
适用场景:
- ✅ 老项目
- ✅ 需要熔断(避免雪崩)
- ❌ 新项目不推荐(Hystrix 停止维护)
4.3 方案 3:Feign + Sentinel(新项目推荐)
# 优点:5 大功能(流量控制 + 熔断降级 + 热点参数 + 系统保护 + 来源控制)
# 缺点:需要新增依赖
feign:
sentinel:
enabled: true
适用场景:
- ✅ 新项目
- ✅ Spring Cloud Alibaba 项目 (新版推荐)
- ✅ 需要更多功能(5 大功能)
五、Feign + Sentinel 完整实战 (新项目推荐)
5.1 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-feign</artifactId>
</dependency>
6.2 配置文件
feign:
sentinel:
enabled: true # ⚠️ 关键:开启 Sentinel
client:
config:
default:
connectTimeout: 3000
readTimeout: 5000
6.3 Feign 接口 + Sentinel 降级
// 老哥 mpvs 关键时点(新版)
@FeignClient(name = "data-mask-service",
fallback = DataMaskFallback.class)
public interface DataMaskFeignClient {
@GetMapping("/api/mask/query")
Result<MaskData> queryMaskData(@RequestParam String bankCode,
@RequestParam String dataId);
}
// 降级类
@Component
public class DataMaskFallback implements DataMaskFeignClient {
@Override
public Result<MaskData> queryMaskData(String bankCode, String dataId) {
return Result.ok(new MaskData("UNKNOWN"));
}
}
6.4 Sentinel 控制台
http://localhost:8080/sentinel
# 配置规则:
# - 流控规则:QPS 100
# - 熔断规则:错误率 50% 熔断
# - 热点规则:参数限流
# - 系统保护:CPU / Load
# - 来源控制:按调用方限流
七、3 大方案 4 大经典面试追问
追问 1:Feign 不依赖 Hystrix 可以吗?
"可以 ------Feign 单独支持降级 (fallback)。但不支持熔断 ------故障服务一直返回兜底数据,不会自动恢复 。金融项目慎用。"
追问 2:Feign + Hystrix 怎么工作?
"Feign 调用时,Hystrix 拦截 ------失败率超 50% 触发熔断 ------5 秒后重试 ------Hystrix 同时实现降级 + 熔断 ------Feign 只负责远程调用,Hystrix 负责容错。"
追问 3:新项目用 Hystrix 还是 Sentinel?
"新项目用 Sentinel (Spring Cloud Alibaba 主推 )。Hystrix 已停止维护 (Netflix Hystrix 2018 年停止更新 )。Sentinel 5 大功能(流量控制 + 熔断降级 + 热点参数 + 系统保护 + 来源控制)。"
追问 4:Feign 降级和 Hystrix 降级区别?
"Feign 降级 ------服务不可用时返回兜底 (静态 )。
Hystrix 降级 ------服务不可用 + 熔断 ------返回兜底 (动态 ,5 秒后重试 )。
Feign 降级没有自动恢复,Hystrix 降级会自动恢复 (5 秒后重试)。"
八、记忆口诀
"Feign 单独只降级"
"Feign + Hystrix 降级 + 熔断"
"Feign + Sentinel 5 大功能(新项目推荐)"
"Hystrix 已停止维护,新项目别用"