第十节 SpringBoot使用Sentinel实现限流

亮子 | 2026-01-30 09:09:59 | 153 | 0 | 0 | 0

1、添加Sentinel依赖

Springboot版本、SpringCloud版本和SpringCloudAlibaba的版本他们是有对应关系的,具体对应关系如下:

1) Spring Boot 3.x 系列

SpringBoot SpringCloud SpringCloudAlibaba Sentinel 说明
3.2.x 2023.0.x 2023.0.x 1.8.7+ 最新稳定版
3.1.x 2022.0.x 2022.0.0.0 1.8.6+ 推荐生产使用
3.0.x 2022.0.x 2022.0.0.0-RC2 1.8.5+ 早期 3.0 版本

2)**Spring Boot 2.7.x 系列(主流稳定)**

SpringBoot SpringCloud SpringCloudAlibaba Sentinel 说明
2.7.18 2021.0.9 2021.0.8.0 1.8.6 LTS 长期支持版
2.7.x 2021.0.x 2021.0.5.0 1.8.5+ 生产推荐
2.7.0 2021.0.3 2021.0.4.0 1.8.4 初始版本

3) Spring Boot 2.6.x 系列

SpringBoot SpringCloud SpringCloudAlibaba Sentinel 说明
2.6.14 2021.0.8 2021.0.5.0 1.8.5 兼容版本
2.6.x 2021.0.x 2021.0.4.0 1.8.4 旧项目维护

4) Spring Boot 2.5.x 及以下

SpringBoot SpringCloud SpringCloudAlibaba Sentinel 说明
2.5.x 2020.0.x 2021.1 1.8.3 逐步淘汰
2.4.x 2020.0.x 2021.1 1.8.2 旧版本
2.3.x Hoxton 2.2.8.RELEASE 1.8.1 不推荐新项目
2.2.x Hoxton 2.2.7.RELEASE 1.8.0 已过时

我们以SpringBoot2.7.18为例,添加依赖如下:

<!-- SpringCloud 微服务 -->
<properties>
    <spring-boot.version>2.7.18</spring-boot.version>
    <spring-cloud.version>2021.0.9</spring-cloud.version>
    <spring-cloud-alibaba.version>2021.0.6.1</spring-cloud-alibaba.version>
</properties>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring-cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

<!-- SpringCloud Alibaba 微服务 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring-cloud-alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>${spring-cloud-alibaba.version}</version>
</dependency>

2、修改配置文件

# Spring
spring: 
  cloud:
    sentinel:
      # 取消控制台懒加载
      eager: true
      transport:
        # 控制台地址
        dashboard: 192.168.80.192:8858

3、定义全局异常类

package com.ruoyi.system.config;

import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.core.web.domain.AjaxResult;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @author 军哥
 * @version 1.0
 * @description: TODO
 * @date 2026/1/30 8:37
 */

@Component
public class GlobalSentinelBlockHandler implements BlockExceptionHandler {
    @Override
    public void handle(HttpServletRequest request, HttpServletResponse response, BlockException e) throws IOException {
        // 1. 构建统一返回结果
        AjaxResult result = AjaxResult.error();
        if (e instanceof FlowException) {
            result.put("code", 429);
            result.put("msg", "全局提示:接口访问过于频繁,请稍后再试!");
        } else {
            result.put("code", 500);
            result.put("msg", "全局提示:服务异常,请联系管理员!");
        }
        result.put("data", null);
        result.put("timestamp", System.currentTimeMillis());

        // 2. 设置响应格式(JSON)和编码
        response.setContentType(MediaType.APPLICATION_JSON_VALUE);
        response.setCharacterEncoding("UTF-8");
        response.setStatus(200); // 避免返回4xx/5xx状态码,前端可统一解析

        // 3. 写入响应结果
        response.getWriter().write(JSON.toJSONString(result));
    }
}

4、在接口上添加注解@SentinelResource

@RequiresPermissions("system:order:add")
@Log(title = "消费者下单(使用购物车下单)", businessType = BusinessType.INSERT)
@PostMapping("/addOrderByCar")
@SentinelResource(value = "addOrderByCar")
public AjaxResult addOrderByCar()
{
    return tbOrderService.addOrderByCar();
}

5、在Sentinel控制台添加流控规则

image.png

image.png

6、实际测试

image.png