Spring Boot 4 如何使用Sentinel进行限流-II【基于Sentinel Spring MVC Adapter实现】

文章目录

Sentinel 通过 拦截器 + 资源埋点 + 规则配置 三步完成对 Servlet 6.x 的限流适配。核心优势在于:

  • 无侵入性:通过配置自动拦截请求,无需修改业务代码。
  • 灵活性:支持自定义资源名、调用方解析和阻断响应。【自定义资源名通过UrlCleaner实现】
  • 异步兼容:适配 Servlet 6.x 的异步处理模型,保障高并发稳定性。

与 Spring MVC 的 HandlerInterceptor 集成,SentinelWebInterceptor 实现了 Spring 的 AsyncHandlerInterceptor 接口,同时支持同步、异步服务

基于sprinboot 4的 WebMVC如何集成sentinel?

本次采用sentinel-spring-webmvc-v6x-adapter方式集成 Sentinel

添加依赖

xml 复制代码
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-spring-webmvc-v6x-adapter</artifactId>
            <version>1.8.9</version>
        </dependency>

编写相关的测试代码

在WebMvcConfig中添加Sentinel拦截器

java 复制代码
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Resource
    private AuthorizationInterceptor authorizationInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(authorizationInterceptor).addPathPatterns("/api/**");
        
        SentinelWebMvcConfig config = new SentinelWebMvcConfig();
        // Enable the HTTP method prefix. 如 POST:/foo
        config.setHttpMethodSpecify(true);
        config.setBlockExceptionHandler(new DefaultBlockExceptionHandler());
        // Add to the interceptor list.
        registry.addInterceptor(new SentinelWebInterceptor(config)).addPathPatterns("/api/**");
    }
    ......
}

配置服务被拦截或降级的处理动作

有两种配置方式

  • 在SentinelWebMvcConfig 中设置setBlockExceptionHandler
  • 通过RestControllerAdvice处理,代码类似如下:
java 复制代码
import com.alibaba.csp.sentinel.slots.block.AbstractRule;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
@Order(0)
@Slf4j
public class SentinelBlockExceptionHandlerConfig {
    @ExceptionHandler(BlockException.class)
    public String sentinelBlockHandler(BlockException e) {
        AbstractRule rule = e.getRule();
        log.info("Blocked by Sentinel: {}", rule.toString());
        return "Blocked by Sentinel";
    }
}

启动程序

启动sentinel-dashboard

python 复制代码
java -Dserver.port=8858 -Dcsp.sentinel.dashboard.server=localhost:8858 -Dproject.name=sentinel-dashboard -Dsentinel.dashboard.auth.username=sentinel -Dsentinel.dashboard.auth.password=123456  -Dserver.servlet.session.timeout=7200 -jar sentinel-dashboard-1.8.9.jar

启动Springboot

注意在启动时需要添加VM参数

bash 复制代码
-Dcsp.sentinel.dashboard.server=localhost:8858

界面展示

通过界面 或 postman请求 如下服务:

可以通过界面配置各种规则,配置后立即生效

配置

高级配置项

配置项 作用 默认值
httpMethodSpecify 资源名是否包含 HTTP 方法前缀 false
urlCleaner 自定义 URL 清洗逻辑(如参数脱敏) null
webContextUnify 是否统一 Web 上下文(使用默认上下文名) true
originParser 从请求头提取调用方(如 IP、AppName) 必须实现
相关推荐
Flittly2 小时前
【雕虫大技】Agent 动态 Skill 供应链安全加固(三):输出校验与治理闭环实战
java·spring boot·spring
风流 少年2 小时前
Spring AI 2.0:MCP
java·后端·spring
风流 少年4 小时前
Spring AI 2.0:Tool
java·python·spring
爱敲键盘的猴子4 小时前
Java Spring -- 声明式事务控制
java·spring·事务控制
她说可以呀6 小时前
Sentinel 授权规则
开发语言·sentinel
小强库计算机毕业设计7 小时前
基于 Spring Boot + Vue3 的校园管理系统
java·spring boot·后端·项目实战·管理系统·技术分享·校园管理系统实战
她说可以呀9 小时前
Sentinel 流控规则 · 流控模式
sentinel
毕设单片机10 小时前
顺顺救助站流浪动物领养系统的设计与实现46649----SpringBoot + Vue.js + MySQL|领养审核、寻宠发布、救助站点与动物论坛协同
java·spring boot·管理系统·流浪动物
云烟成雨TD10 小时前
Micrometer 系列【63】统一观测:基于 Spring Boot 的生产级演示案例 | 基于 OTLP 集成 Prometheus + Jaeger
spring boot·云原生·prometheus
csdn2015_10 小时前
springboot +mybatis 查询myql开启程序级别缓存
spring boot·缓存·mybatis