微服务中的熔断、降级与限流
·
微服务中限流、降级、熔断是保障系统高可用的 “三板斧”,核心目标是 “防止雪崩、保护核心服务”。
一、限流(流量控制:防请求洪峰)
核心目标:限制接口 / 服务的请求 QPS / 并发数,避免超出系统处理能力。
实现方案(按层级划分)
- 网关层限流(全局入口):✅ 组件:Nginx / Spring Cloud Gateway + Sentinel;✅ 规则:按 IP / 接口 / 服务名限制 QPS(如单 IP 每秒 100 次请求);✅ 实战:Nginx 通过
limit_req_zone做 IP 限流,Gateway 通过 Sentinel 做接口级限流,拦截大部分无效流量。 - 应用层限流(服务内):✅ 组件:Sentinel / Guava RateLimiter(令牌桶算法);✅ 规则:按接口 QPS / 并发数限流(如订单创建接口 QPS 限制 2000);
二、降级(服务不可用时的兜底策略)
核心目标:当某个服务 / 接口异常(超时 / 报错率高)时,返回兜底数据,而非抛出异常,保证核心流程可用。
实现方案
- 应用层降级(Sentinel/Resilience4j):
✅ 触发条件:接口超时 / 异常率超过阈值(如超时 > 500ms、异常率 > 50%);
✅ 兜底策略:返回默认值 / 缓存数据 / 降级提示;
✅ java运行(Sentinel 降级):
// 降级规则:接口异常率>50%时触发降级,降级时间窗口10s
@SentinelResource(value = "user/get", fallback = "userFallback")
@GetMapping("/user/get/{id}")
public Result getUser(@PathVariable String id) {
// 调用用户服务,可能超时/报错
return userService.getUser(id);
}
// 降级兜底方法
public Result userFallback(String id) {
// 返回兜底数据(如缓存的用户基础信息)
return Result.success(UserDTO.getDefaultUser(id));
}
- 依赖服务降级:
✅ 场景:调用第三方服务(如支付、短信)超时;
✅ 方案:设置超时时间(如 Feign 调用超时 300ms),超时后触发降级,返回 “服务暂不可用”。
三、熔断(服务熔断:断开发故障的依赖)
核心目标:当依赖服务严重异常(如报错率 100%)时,暂时 “熔断” 调用链路,停止请求该服务,等待恢复后再恢复调用,避免雪崩。
实现方案(Resilience4j/Sentinel 熔断器模式)
- 核心规则(熔断器状态机):
✅ 关闭状态:正常调用依赖服务;
✅ 打开状态:异常率超过阈值,如 50%,触发熔断,拒绝调用该服务,直接走降级逻辑;
✅ 半开状态:熔断时间窗口结束后,允许少量请求试探,若恢复正常则关闭熔断器,否则继续打开;
- java运行代码(Resilience4j 熔断):
// 熔断规则:调用支付服务异常率>50%时熔断,熔断窗口10s @CircuitBreaker(name = "payService", fallbackMethod = "payFallback") @GetMapping("/order/pay/{orderId}") public Result pay(@PathVariable String orderId) { // 调用支付服务 return payService.pay(orderId); } // 熔断兜底方法 public Result payFallback(String orderId, Exception e) { return Result.fail("支付服务暂时不可用,请稍后重试"); }
四、核心配合策略
- 优先级:网关限流 → 应用限流 → 熔断 → 降级(从入口到内部层层防护);
- 规则配置:通过 Sentinel Dashboard / 配置中心动态调整规则(无需重启服务);
- 监控告警:对接 Prometheus+Grafana,监控限流 / 熔断触发次数,及时调整规则。
总结
- 微服务限流、降级、熔断是高可用核心手段,核心目标是:限流防过载、降级保可用、熔断防雪崩;
- 实现核心:网关层(Nginx)+ 应用层(Sentinel/Resilience4j) 结合,动态配置规则;
更多推荐

所有评论(0)