背景

本文是《Java 后端从小白到大神》修仙系列之框架学习,Spring Cloud 微服务实战系列的 第五篇。Spring Cloud 是构建微服务架构的基石,拥有完整的服务治理生态,在云原生架构中广泛应用。本系列将从架构认知到实际工程,逐步构建一套企业级 Spring Cloud 微服务项目。若想详细学习请点击首篇博文开始,现在开始学习。

文章概览

服务熔断、限流、降级与系统稳定性防线:

  1. 熔断机制原理与线程隔离模型
  2. Sentinel 快速集成与 Dashboard 配置
  3. 接口级限流 + 热点参数限流实践
  4. 系统保护规则与高可用降级策略
  5. 服务级别限流 + 自定义降级返回模板

1. Sentinel 快速集成

微服务之间通过 HTTP 或 RPC 调用形成“调用链”,但链条越长、服务越多,系统稳定性也越脆弱。Spring Cloud Alibaba 提供的服务保护利器 —— Sentinel,通过限流、熔断、降级等机制,构筑系统的“最后防线”。

添加依赖(所有要保护的服务模块)

user-service 为例,在 pom.xml 添加:

1
2
3
4
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

配置 application.yaml

1
2
3
4
5
6
7
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8858
        port: 8719  # 默认端口,避免冲突可自定义
      eager: true

启动 Dashboard 控制台

1
2
java -jar sentinel-dashboard-1.8.6.jar
# 默认用户名/密码:sentinel / sentinel

访问地址:http://localhost:8858

2. 熔断机制原理与线程隔离模型

  • 熔断:指某个服务调用失败率或响应时间过高时,中断请求链。
  • 线程隔离:每个服务维护自己的线程池,防止“雪崩效应”。

示例:模拟 User 接口慢响应

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
@GetMapping("/delay")
@SentinelResource(value = "userDelay", blockHandler = "handleDelayBlock")
public String simulateDelay() throws InterruptedException {
    Thread.sleep(3000); // 模拟超时
    return "响应成功";
}

public String handleDelayBlock(BlockException e) {
    return "请求过载,请稍后重试";
}

然后在 Sentinel 控制台中为资源 userDelay 配置 熔断策略(慢调用比例)

3. 接口级限流 + 热点参数限流实践

接口级限流

1
2
3
4
5
6
7
8
9
@GetMapping("/info")
@SentinelResource(value = "getUserInfo", blockHandler = "blockHandler")
public UserDTO getUserInfo(@RequestParam Long id) {
    return userService.getUser(id);
}

public UserDTO blockHandler(Long id, BlockException ex) {
    return new UserDTO(-1L, "服务过载");
}

Sentinel 控制台中配置资源名 getUserInfo,并设置 QPS 限流(如 1 秒只能访问 2 次)。

热点参数限流(必须显式标注)

1
2
3
4
5
6
7
8
9
@GetMapping("/hot")
@SentinelResource(value = "hotKey", blockHandler = "hotKeyBlock")
public String hotParam(@RequestParam String name) {
    return "Hello " + name;
}

public String hotKeyBlock(String name, BlockException e) {
    return "请求过于频繁:" + name;
}

控制台中资源名为 hotKey,配置热点参数限流策略。

4. 系统保护与高可用降级策略

系统保护规则包括:

  • Load(系统负载)
  • RT(平均响应时间)
  • QPS
  • 线程数
  • 入口 QPS

这些规则在 Sentinel 控制台「系统规则」中配置,常用于入口服务(如 gateway-service)限流保护。

降级策略使用:

1
2
3
4
5
6
7
8
9
@GetMapping("/degrade")
@SentinelResource(value = "degradeDemo", fallback = "fallbackHandler")
public String degrade() {
    throw new RuntimeException("模拟异常");
}

public String fallbackHandler(Throwable e) {
    return "服务降级返回:请稍后访问";
}

控制台配置熔断触发条件如异常比例超过 50%。

5. 服务级别限流 + 自定义降级模板

服务级限流(基于服务名)

可使用 Gateway Sentinel 规则在网关层统一配置:

1
2
3
4
5
6
7
8
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**

然后在 Sentinel 控制台配置 Gateway 规则。

降级返回模板

自定义全局异常处理器:

1
2
3
4
5
6
7
8
9
@RestControllerAdvice
public class SentinelBlockHandler {

    @ExceptionHandler(BlockException.class)
    public ResponseEntity<String> handleBlock(BlockException ex) {
        return ResponseEntity.status(HttpStatus.TOO_MANY_REQUESTS)
                .body("请求被限流,请稍后再试");
    }
}

总结

核心对比 Resilience4j vs Sentinel

维度 Resilience4j Sentinel
所属方 Netflix 社区演进(Spring 官方推荐) 阿里巴巴开源(Alibaba Cloud 提供)
整合生态 Spring Cloud CircuitBreaker / Micrometer Spring Cloud Alibaba
功能模块 熔断、限流、重试、缓存、RateLimiter 等 熔断、限流、系统保护、热点参数、流控链路
配置方式 代码优先(Java API + 注解) 控制台优先(支持持久化规则)
依赖轻量 体积小,零依赖于 Netty/线程池 本身带有 Netty server,稍重
控制台支持 ❌(需自建监控) ✅ 自带可视化 Dashboard
热点参数限流 ❌ 不支持 ✅ 支持特定参数维度限流
服务级链路限流 ✅ 支持调用链限流策略
对网关层支持 ✅ 专门的 Gateway Sentinel 模块
服务端协调能力 ✅ 多实例集中控制(如控制台统一推送规则)
社区活跃度 高(与 Spring Boot 高度兼容) 高(国内广泛使用)

技术路线不同

  • Resilience4j:专注于本地 Java 级容错,面向开发者、轻量级、模块化。适用于单体服务或轻量微服务。
  • Sentinel:不仅支持本地容错,还支持服务链路层级的流控、限流策略,可以部署为统一控制平台。

功能覆盖范围

  • Resilience4j 更关注“熔断、限流、重试、退避”等行为;
  • Sentinel 更全面,适合网关 + 下游服务联动控制,如热点参数限流、流控链路、系统规则(如线程/负载保护)。

控制台 & 运维视角

  • Resilience4j 默认无 Dashboard,需配合 Micrometer + Prometheus + Grafana;
  • Sentinel 自带控制台,支持页面实时配置、推送限流/熔断规则,适合运维接手配置。

使用场景

场景 / 需求 建议使用
微服务架构、服务众多、希望统一控制规则 Sentinel
需要热点参数限流、系统级限流、网关层保护等复杂策略 Sentinel
小型项目、轻量服务、不需要可视化规则控制 Resilience4j
偏重代码控制,习惯注解 + 编程方式配置 Resilience4j
国际项目、不想引入阿里生态 Resilience4j
和 Spring Cloud Gateway / Nacos / Dubbo 配套使用 Sentinel 更合适

真实使用建议

架构层 推荐组件 说明
网关层 Sentinel 配合 Gateway Sentinel 使用,提供服务级链路限流
服务层 Resilience4j 注解式熔断/重试/Fallback,简单轻量,Spring Boot 兼容
复杂链路场景 Sentinel 控制台统一流控配置,如电商/活动系统