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) 必须实现
相关推荐
暮色妖娆丶6 小时前
SpringBoot 启动流程源码分析 ~ 它其实不复杂
spring boot·后端·spring
Coder_Boy_6 小时前
Deeplearning4j+ Spring Boot 电商用户复购预测案例中相关概念
java·人工智能·spring boot·后端·spring
雨中飘荡的记忆6 小时前
Spring Batch实战
java·spring
爱学英语的程序员6 小时前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
Java新手村6 小时前
基于 Vue 3 + Spring Boot 3 的 AI 面试辅助系统:实时语音识别 + 大模型智能回答
vue.js·人工智能·spring boot
callJJ7 小时前
Spring AI 文本聊天模型完全指南:ChatModel 与 ChatClient
java·大数据·人工智能·spring·spring ai·聊天模型
消失的旧时光-19437 小时前
第十四课 · 实战篇:Redis 缓存系统落地指南(Spring Boot 从 0 到可用)
spring boot·redis·缓存
wxin_VXbishe8 小时前
C#(asp.net)学员竞赛信息管理系统-计算机毕业设计源码28790
java·vue.js·spring boot·spring·django·c#·php
森焱森8 小时前
详解 Spring Boot、Flask、Nginx、Redis、MySQL 的关系与协作
spring boot·redis·python·nginx·flask