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) 必须实现
相关推荐
回到原点的码农21 分钟前
maven导入spring框架
数据库·spring·maven
Predestination王瀞潞1 小时前
Java EE3-我独自整合(第一章:Spring入门)
java·spring·java-ee
bjzhang752 小时前
SpringCloud——国产化改造,项目对接 TongWeb 嵌入版
后端·spring·spring cloud
无名-CODING2 小时前
SpringCloud 网关与熔断:Gateway + Sentinel 快速入门
spring cloud·gateway·sentinel
csdn2015_2 小时前
springboot controller 参数可以是List吗
spring boot·后端·list
xiaohe072 小时前
JAVA系统中Spring Boot 应用程序的配置文件:application.yml
java·开发语言·spring boot
de_wizard3 小时前
DeepSeek API 调用 - Spring Boot 实现
windows·spring boot·后端
Flittly3 小时前
【SpringAIAlibaba新手村系列】(4)流式输出与响应式编程
java·spring boot·spring·ai
无名-CODING3 小时前
SpringCloud 服务注册与发现:Nacos 零基础入门实战
后端·spring·spring cloud
yangyanping201083 小时前
广告系统设计二之RTA系统设计
java·spring·mybatis