三、入门:整合 Spring Boot 3 + Sentinel + MyBatis-Plus + Lombok

1. 环境准备

  • JDK 17+(Spring Boot 3 最低要求)
  • Maven 3.8+
  • Sentinel 控制台

2. 搭建步骤

步骤 1:启动 Sentinel 控制台(同上)
步骤 2:创建 Spring Boot 3 项目,引入依赖

核心依赖,其他环境依赖略过。
pom.xml 核心依赖:

<dependencies>
    <!-- Sentinel 核心依赖 + Spring Cloud 适配   不需要指定版本,根据父类cloud 兼容继承即可 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
</dependencies>


步骤 3:配置 application.yml

添加一下配置配置,其他配置略过…

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 # 连接 Sentinel 控制台
        port: 8719 # 客户端与控制台通信端口(默认 8719,冲突时自动递增)
步骤 4:编写基础代码(Entity + Mapper + Service + Controller)

以“用户查询”为例,整合 MyBatis-Plus 和 Lombok:
实体类 User、Mapper 接口、Service 层、正常编写。此处略过。

Controller 层(添加 Sentinel 注解)

用 @SentinelResource 标记需要保护的接口,指定“限流/熔断后的降级方法”:

package com.example.sentineldemo.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.example.sentineldemo.entity.User;
import com.example.sentineldemo.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor // Lombok 注解:自动注入构造器(替代 @Autowired)
public class UserController {

    private final UserService userService;

    // @SentinelResource:Sentinel 保护标记,value 为资源名,blockHandler 为限流降级方法
    @SentinelResource(value = "sentinelGetUserById", blockHandler = "getUserByIdBlockHandler")
    @GetMapping("/getUserById/{id}")
    public String getUserById(@PathVariable Long id) {
        User user = userService.getUserById(id);
        return user != null ? user.toString() : "用户不存在";
    }

    // 限流/熔断后的降级方法:参数、返回值需与原方法一致,且多一个 BlockException 参数
    public String getUserByIdBlockHandler(Long id, Throwable e) {
        return "操作过于频繁,请稍后!";
    }
}
步骤 5:启动项目并测试限流
  1. 启动 Spring Boot 项目,访问 http://localhost:8081/user/1(先触发一次接口调用,Sentinel 控制台才会注册服务)。
  2. 进入 Sentinel 控制台(http://localhost:8080),在“簇点链路”中找到 getUserById 资源,点击“流控”按钮,配置规则:
    • 阈值类型:QPS
    • 单机阈值:2(每秒最多允许 2 次请求)
  3. 快速刷新 http://localhost:8081/user/1,当 QPS 超过 2 时,会返回降级信息“当前请求人数过多,请稍后再试”,限流生效。
    在这里插入图片描述

四、精通:Sentinel 核心规则与高级用法

1. 4 大核心规则配置(控制台 + 代码)

(1)流量控制规则(限流)
  • 配置场景:限制接口 QPS/线程数,防止流量过载。
  • 控制台配置:簇点链路 → 流控 → 选择阈值类型(QPS/线程数)+ 阈值。
  • 代码配置(硬编码,不推荐,推荐动态配置):
// 在项目启动时初始化限流规则
@Configuration
public class SentinelRuleConfig {
    @PostConstruct
    public void initFlowRule() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("getUserById"); // 资源名(与 @SentinelResource 的 value 一致)
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 阈值类型:QPS
        rule.setCount(2); // QPS 阈值 2
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}
(2)熔断降级规则
  • 配置场景:服务调用超时/错误率过高时,自动熔断,避免故障扩散。
  • 控制台配置:簇点链路 → 降级 → 选择策略(慢调用比例/错误比例/错误数)。
    • 例:慢调用比例 → 最大RT(500ms)→ 比例阈值(0.5)→ 熔断时长(5s):当 50% 的请求响应时间超过 500ms,熔断 5 秒。
(3)热点参数限流
  • 配置场景:对接口中高频参数值限流(如“查询商品接口”中,某热门商品 ID 被频繁访问)。
  • 控制台配置:热点规则 → 新增 → 选择资源(getUserById)→ 设置参数索引(0 表示第一个参数 id)→ 阈值(如 QPS=5)。
(4)系统自适应保护
  • 配置场景:监控服务 CPU、内存,当系统负载过高时主动限流。
  • 控制台配置:系统规则 → 新增 → 选择阈值类型(CPU 使用率/负载/内存)→ 阈值(如 CPU 使用率 80%)。

2. 规则持久化(解决重启丢失问题)

Sentinel 默认规则保存在内存,服务重启后丢失,生产环境需持久化到 Nacos/Apollo。以 Nacos 为例:

  1. 引入 Nacos 依赖:
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
  1. 配置 Nacos 数据源(application.yml):
spring:
  cloud:
    sentinel:
      datasource:
        ds1: # 数据源名称(自定义)
          nacos:
            server-addr: localhost:8848 # Nacos 地址
            data-id: sentinel-flow-rules # Nacos 中规则配置的 dataId
            group-id: DEFAULT_GROUP # 分组
            rule-type: flow # 规则类型(flow:限流,degrade:熔断)
  1. 在 Nacos 控制台新建 sentinel-flow-rules 配置,内容为 JSON 格式的限流规则:
[
  {
    "resource": "getUserById",
    "grade": 1, // 1=QPS,0=线程数
    "count": 2,
    "clusterMode": false
  }
]

重启服务后,规则会从 Nacos 加载,修改 Nacos 配置可实时更新规则。

五、原理:Sentinel 核心设计思想

1. 核心概念:资源与规则

  • 资源:Sentinel 保护的对象,如接口方法(@SentinelResource 标记)、服务调用、甚至一段代码块。
  • 规则:对资源的管控策略(限流、熔断等),规则触发时执行预设逻辑(降级、阻塞)。

2. 工作流程(3 步)

  1. 资源定义:通过 @SentinelResource 或代码手动标记资源(如 SphU.entry("resourceName"))。
  2. 规则检查:Sentinel 对进入资源的请求,实时检查是否命中规则(限流、熔断等)。
  3. 执行逻辑:
    • 未命中规则:正常执行资源逻辑。
    • 命中规则:执行降级方法(blockHandler)或直接抛出异常。

3. 底层实现:滑动窗口计数器(限流核心)

Sentinel 用“滑动窗口”统计 QPS,相比传统“固定窗口”(如 1 秒一个窗口),能更精准避免“窗口边界”的流量突刺问题:

  • 例:1 秒划分为 10 个小窗口(每个 100ms),统计最近 1 秒内的小窗口请求数总和,超过阈值则限流。

六、实战:生产环境典型应用场景

1. 接口限流(最常用)

  • 场景:对外暴露的 API 接口(如用户登录、商品查询),防止恶意请求或突发流量击垮服务。
  • 配置:QPS 阈值根据服务性能设定(如单机 QPS=100),结合集群限流(分布式场景下统一控制集群总 QPS)。

2. 服务熔断降级(微服务调用)

  • 场景:A 服务调用 B 服务(如订单服务调用支付服务),当 B 服务超时/错误率高时,A 服务熔断调用,返回默认结果(如“支付服务繁忙,稍后重试”)。
  • 配置:熔断策略设为“错误比例”(如错误率>50% 熔断 10 秒),避免 B 服务故障拖垮 A 服务。

3. 热点商品保护(电商场景)

  • 场景:电商秒杀中,某热门商品 ID 被高频访问,单独对该商品 ID 限流,不影响其他商品查询。
  • 配置:热点参数限流 → 参数索引 0(商品 ID)→ 对值为“1001”的商品设置 QPS=100,其他商品 QPS=500。

4. 系统保护(兜底措施)

  • 场景:当服务 CPU 使用率超过 85% 或内存不足时,主动限流所有非核心接口(如推荐、广告接口),保障核心接口(如下单、支付)可用。
  • 配置:系统规则 → CPU 使用率阈值=85%,触发后对非核心资源限流。

七、总结

Sentinel 是微服务流量治理的“瑞士军刀”,相比 Resilience4j、Hystrix,其动态规则、可视化控制台、生态适配性更适合生产环境;整合 Spring Boot 3 + MyBatis-Plus + Lombok 后,能快速实现接口防护与业务开发的结合。核心是掌握“资源定义-规则配置-降级逻辑”三步用法,结合生产场景选择限流、熔断或热点保护策略,最终保障服务高可用。

更多推荐