Sentinel 和 OpenFeign 在微服务架构中是天生一对:OpenFeign 负责"调用",Sentinel 负责"保护调用"。下面从集成原理、代码示例、降级规则配置、银行场景实战以及监控方面讲透它们的协同工作方式。
一、OpenFeign 与 Sentinel 的分工
- OpenFeign:声明式 HTTP 客户端,简化远程服务调用,内置 Ribbon/LoadBalancer 负载均衡。
- Sentinel:流量防卫兵,提供限流、熔断降级、系统保护等能力。
集成后效果 :当 OpenFeign 调用下游服务出现高延迟、异常率高或流量激增时,Sentinel 能自动进行熔断降级,直接调用本地 Fallback 逻辑,快速返回兜底结果,防止故障蔓延。这相当于给每一个 Feign 调用都装上了"保险丝"。
二、集成步骤与代码案例
1. 引入依赖
xml
<!-- Spring Cloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- OpenFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2. 开启 Feign 对 Sentinel 的支持
yaml
feign:
sentinel:
enabled: true # 开启 Sentinel 整合 Feign
3. 定义 Feign 接口并配置降级处理
使用 fallback 或 fallbackFactory。推荐 fallbackFactory,因为能拿到具体的异常信息,方便记录日志或做精细处理。
java
// Feign 接口
@FeignClient(
name = "loan-service",
fallbackFactory = LoanClientFallbackFactory.class // 指定降级工厂
)
public interface LoanClient {
@PostMapping("/loan/disburse")
Result disburse(@RequestBody DisburseRequest request);
}
// 降级工厂类
@Component
public class LoanClientFallbackFactory implements FallbackFactory<LoanClient> {
@Override
public LoanClient create(Throwable cause) {
// 记录异常,可区分限流异常、熔断异常、超时异常等
log.error("LoanClient 调用异常,进入降级: {}", cause.getMessage());
return new LoanClient() {
@Override
public Result disburse(DisburseRequest request) {
// 返回兜底结果,或从缓存中获取
return Result.fail("放款服务暂不可用,请稍后重试");
}
};
}
}
4. 配置 Sentinel 降级规则
可以在 Sentinel 控制台动态配置,也可以通过代码初始化。针对资源名称(默认是 Feign 的 serviceId 或 @SentinelResource 指定的值)设置规则。
控制台配置 (推荐):
打开 Sentinel Dashboard,找到资源名 GET:http://loan-service/loan/disburse 或自定义资源名,添加降级规则,例如:
- 慢调用比例:最大 RT 500ms,慢调用比例 0.5,熔断时长 30s。
- 异常比例:异常比例 0.3,熔断时长 20s。
代码配置(适合初始化或测试):
java
@Component
public class SentinelRuleInit {
@PostConstruct
public void initDegradeRules() {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule("loan-service") // 资源名
.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO)
.setCount(0.3) // 异常比例 30%
.setTimeWindow(20) // 熔断窗口 20s
.setMinRequestAmount(5);
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
}
三、银行核心系统的实战细节
1. 金融写操作(转账、放款)------谨慎降级
- 原则 :写操作不轻易开启自动降级,否则可能导致业务中断或数据不一致。
- 替代方案 :使用 限流 (QPS 控制)和 快速失败,依赖数据库事务和幂等机制保证一致性。
- 必须降级时:只针对明确可补偿的写操作,降级逻辑进入重试队列或人工处理。
2. 读操作(查询余额、产品信息)------积极降级
- 策略 :启用慢调用比例 或异常比例降级。例如,征信查询接口 RT 超过 2s 且比例超过 40% 时,熔断 30s,降级逻辑返回缓存数据或友好提示。
- 兜底数据:降级时从本地缓存(Caffeine)或 Redis 中获取最近一次的有效数据。
3. 超时与重试配合
- Feign 的超时配置需与 Sentinel 的降级规则匹配。例如,Feign 读取超时 3s,Sentinel 慢调用最大 RT 设为 2s,这样超时前就能触发降级,避免线程堆积。
- 重试方面:Feign 默认不重试,且我们为资金接口禁用了任何自动重试,通过 Sentinel 快速失败。
4. 监控与告警
- 所有降级事件通过 Sentinel 的日志和
BlockException记录,并上报 Prometheus。 - 监控指标:
degrade_open_count(熔断打开次数)、degrade_half_open_count(半开尝试次数)。 - 告警规则:核心接口熔断打开超过 5 分钟,立即通知值班人员。
四、面试模板话术
"OpenFeign 负责微服务间的声明式调用,Sentinel 则作为它的保护伞。通过
feign.sentinel.enabled=true和fallbackFactory,我们能让每个 Feign 客户端都拥有熔断降级能力。在银行项目里,我对读接口(如产品查询)积极配置降级规则,慢调用或异常率达到阈值就返回缓存兜底;对写接口(如转账)则谨慎使用降级,更多依赖限流和事务保障。所有降级事件都接入 Prometheus 告警,确保第一时间响应。
这种组合让我们的微服务调用既保持了简洁的编程模型,又具备了生产级的弹性。"
这样回答,既讲清楚了 Sentinel 和 OpenFeign 的集成原理,又结合金融场景给出了安全与性能的权衡策略,非常符合你四年银行核心开发的经验定位。