Springboot集成Sentinel 组件实现基本限流功能(快速入门)

 更新时间:2025年12月27日 15:00:45   作者:firechili  
Sentinel是阿里巴巴开发的面向云原生微服务的高可用流控防护组件,支持流量控制、熔断降级、系统负载保护等多维度防护,适用于秒杀、消息削峰填谷等场景,本文给大家介绍Springboot集成Sentinel组件实现基本限流功能,感兴趣的朋友跟随小编一起看看吧

概述

Sentinel 是面向云原生微服务的高可用流控防护组件,以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保障服务稳定性。阿里巴巴在近10年双十一大促中成功验证了Sentinel在高并发场景下的可靠性。

核心概念

资源 (Resource)

资源是Sentinel的核心概念,可以是:

  • 应用程序提供的服务
  • 调用的外部服务
  • URL地址
  • 方法签名
  • 代码片段

规则 (Rule)

围绕资源的实时状态设定的策略:

  • 流量控制规则
  • 熔断降级规则
  • 系统保护规则
  • 所有规则支持动态实时调整

核心特性

特性描述
丰富的应用场景支持秒杀、消息削峰填谷、集群流量控制、实时熔断等
完备的实时监控提供秒级监控数据,支持500台以下集群汇总
广泛的开源生态支持Spring Cloud/Dubbo/gRPC/Quarkus等框架
SPI扩展机制提供定制规则管理、动态数据源适配等扩展能力

系统架构大概长这样

快速入门:核心库使用

1. 添加Maven依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.6</version>
</dependency>
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>1.8.6</version>
</dependency>

2、通过硬编码方式设定流控规则,主要有拦截器和注解两种方式(不够灵活,不推荐)

2.1、使用拦截器对所有请求进行限流拦截

@Component
public class FlowLimitInterceptor implements HandlerInterceptor {
    private static final Logger log = LoggerFactory.getLogger(FlowLimitInterceptor.class);
    private final ObjectMapper objectMapper;
    public FlowLimitInterceptor(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    } 
     // SmallNovel 项目所有的资源,名称只用于标识,建议易于理解即可
    private static final String SMALL_NOVEL_RESOURCE = "SmallNovelResource";
	//静态代码块使规则在类加载时就初始化了
    static {
        // 接口限流规则:所有的请求,限制每秒最多只能通过 2000 个,超出限制匀速排队
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule1 = new FlowRule();
        rule1.setResource(SMALL_NOVEL_RESOURCE);
        rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 设置 QPS 限流 2000.
        rule1.setCount(2000);
        rule1.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
        rules.add(rule1);
        FlowRuleManager.loadRules(rules);
        // 接口防刷规则 1:所有的请求,限制每个 IP 每秒最多只能通过 50 个,超出限制直接拒绝
        ParamFlowRule rule2 = new ParamFlowRule(SMALL_NOVEL_RESOURCE)
                .setParamIdx(0)
                .setCount(50);
        // 接口防刷规则 2:所有的请求,限制每个 IP 每分钟最多只能通过 1000 个,超出限制直接拒绝
        ParamFlowRule rule3 = new ParamFlowRule(SMALL_NOVEL_RESOURCE)
                .setParamIdx(0)
                .setCount(1000)
                .setDurationInSec(60);
        ParamFlowRuleManager.loadRules(Arrays.asList(rule2, rule3));
    }
    @Override
    public boolean preHandle(@NotNull HttpServletRequest request, @NotNull HttpServletResponse response, @NotNull Object handler) throws Exception {
        String ip = IpUtils.getRealIp(request);
        Entry entry = null;
        try {
            entry = SphU.entry(SMALL_NOVEL_RESOURCE, EntryType.IN, 1, ip);
            return HandlerInterceptor.super.preHandle(request, response, handler);
        } catch (BlockException ex) {
            log.info("IP:{}被限流了!", ip);
            response.setCharacterEncoding(StandardCharsets.UTF_8.name());
            response.setContentType(MediaType.APPLICATION_JSON_VALUE);
            response.getWriter()
                    .write(错误信息);
        } finally {
            if (entry != null) {
                entry.exit(1, ip);
            }
        }
        return false;
    }
}

然后将拦截器注册到webconfig

@Configuration
public class WebConfig implements WebMvcConfigurer {
    private final FlowLimitInterceptor flowLimitInterceptor;
    public WebConfig(FlowLimitInterceptor flowLimitInterceptor) {
        this.flowLimitInterceptor = flowLimitInterceptor; }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 流量限制拦截器
        registry.addInterceptor(flowLimitInterceptor)
                .addPathPatterns("/**")
                .order(0);
}
}

2.2、使用spring切面技术配合注解使用Sentinel组件

 配置Sentinel切面

@Configuration
public class SentinelAspectConfig {
    @Bean
    public SentinelResourceAspect sentinelResourceAspect() {
        return new SentinelResourceAspect();
    }
}

使用注解定义受保护资源

@Service
public class OrderService {
    @SentinelResource(
        value = "createOrder", 
        blockHandler = "handleFlowBlock",
        blockHandlerClass = OrderServiceBlockHandler.class
    )
    public String createOrder() {
        // 业务逻辑
        return "订单创建成功";
    }
    // 异常处理函数(可选)
    public String handleException(Throwable ex) {
        return "服务异常: " + ex.getMessage();
    }
}

注意:注解方式埋点不支持 private 方法

实现流控处理逻辑

public class OrderServiceBlockHandler {
    // 流控处理函数需满足:
    // 1. public static修饰
    // 2. 返回类型与原方法相同
    // 3. 参数列表包含原方法所有参数 + BlockException
    public static String handleFlowBlock(BlockException ex) {
        return "请求过于频繁,请稍后重试!触发规则: " + ex.getRule().getResource();
    }
}

初始化流控规则

@Component
public class SentinelRuleInitializer {
    @PostConstruct
    public void initFlowRules() {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        rule.setResource("createOrder");   // 资源名称
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // QPS限流模式
        rule.setCount(2);                 // 阈值:2次/秒
        rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT); 
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
}

高级配置选项

流量控制行为

// 在FlowRule中设置
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP); // 预热模式
rule.setWarmUpPeriodSec(10); // 预热时间(秒)

rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER); // 匀速排队
rule.setMaxQueueingTimeMs(500); // 最大排队时间

熔断降级规则

List<DegradeRule> degradeRules = new ArrayList<>();
DegradeRule degradeRule = new DegradeRule();
degradeRule.setResource("createOrder");
degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT); // 异常数模式
degradeRule.setCount(5); // 异常数阈值
degradeRule.setTimeWindow(30); // 熔断时长(秒)
degradeRules.add(degradeRule);
DegradeRuleManager.loadRules(degradeRules);

最佳实践

  • 资源命名规范:使用 服务名:接口名 格式(如 orderService:createOrder
  • 规则管理:生产环境推荐通过控制台动态管理规则
  • 监控集成:结合控制台实时监控流量和系统负载
  • 默认降级:为所有资源配置全局默认的 blockHandler
  • 多层次防护:结合流量控制+熔断降级+系统保护形成立体防护

3、控制台部署与使用(最推荐的方式)

# 下载控制台JAR包
wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar
# 启动控制台(默认端口8080)
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard-1.8.6.jar

控制台功能:

  • 实时监控集群/单机QPS、响应时间
  • 动态管理流控/降级/系统规则
  • 机器发现与管理
  • 调用链路分析

常见问题解决

  • 规则不生效
    • 检查资源名称是否一致
    • 确认规则已正确加载(通过 FlowRuleManager.getRules() 验证)
  • blockHandler未触发
    • 检查函数签名是否符合要求(static、参数列表)
    • 确认aspectj依赖已添加且切面配置生效
  • 控制台无数据显示
    • 检查应用与控制台网络连通性
    • 添加JVM参数:-Dcsp.sentinel.dashboard.server=consoleIp:port
  • 输出日志位置配置
    • 在启动应用时添加 JVM 参数 java -Dcsp.sentinel.log.dir=/var/log/sentinel -jar your-application.jar
    • 在应用的 classpath 下创建 sentinel.properties 文件

# 设置日志目录

csp.sentinel.log.dir=/var/log/sentinel

# 日志文件最大数量(默认7)

csp.sentinel.log.max.file.count=14

# 单个日志文件大小(默认300MB)

csp.sentinel.log.max.file.size=1073741824  # 1GB

# 日志输出类型(file 或 console)

csp.sentinel.log.output.type=file

通过系统环境变量配置

# Linux/macOS
export SENTINEL_LOG_DIR=/var/log/sentinel
# Windows
set SENTINEL_LOG_DIR=C:\logs\sentinel  

性能优化建议

  • 集群流控:对于分布式系统,启用集群流控模式
  • 热点参数限流:对特定参数(如用户ID)实施精细控制
  • 异步调用支持:结合Async注解实现非阻塞限流
  • 规则持久化:集成Nacos/ZooKeeper实现规则持久存储

Sentinel通过精细化的流量控制和多种防护机制,为微服务架构提供可靠的稳定性保障。建议生产环境结合控制台使用,充分发挥动态配置和实时监控的优势。

到此这篇关于Springboot集成Sentinel 组件实现基本限流功能(快速入门)的文章就介绍到这了,更多相关Springboot Sentinel 限流内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • idea中如何使用git进行版本回退详解

    idea中如何使用git进行版本回退详解

    工作中遇到git远程仓库需要回退到历史版本的问题,根据网上的搜索结果结合自己的实践,下面这篇文章主要给大家介绍了关于idea中如何使用git进行版本回退的相关资料,需要的朋友可以参考下
    2023-04-04
  • Java获取resources下文件路径的几种方法及遇到的问题

    Java获取resources下文件路径的几种方法及遇到的问题

    这篇文章主要给大家介绍了关于Java获取resources下文件路径的几种方法及遇到的问题,在Java开发中经常需要读取项目中resources目录下的文件或获取资源路径,需要的朋友可以参考下
    2023-12-12
  • springboot动态定时任务的实现方法示例

    springboot动态定时任务的实现方法示例

    这篇文章主要给大家介绍了关于springboot动态定时任务的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • JAVA导出EXCEL表格的实例教学

    JAVA导出EXCEL表格的实例教学

    在本文中我们给大家整理了关于JAVA导出EXCEL表格的实例教学以及相关知识点,需要的朋友们学习下。
    2019-02-02
  • Freemarker常用指令使用示例

    Freemarker常用指令使用示例

    这篇文章主要介绍了Freemarker常用指令使用示例,步骤简单,大家参考使用吧
    2013-11-11
  • Java多线程之同步锁-lock详解

    Java多线程之同步锁-lock详解

    这篇文章主要为大家详细介绍了Java多线程中同步锁-lock的原理与使用,文中的示例代码讲解详细,对我们了解线程有一定帮助,需要的可以参考一下
    2022-10-10
  • Java实现获取cpu、内存、硬盘、网络等信息的方法示例

    Java实现获取cpu、内存、硬盘、网络等信息的方法示例

    这篇文章主要介绍了Java实现获取cpu、内存、硬盘、网络等信息的方法,涉及java使用第三方jar包针对本机硬件的cpu、内存、硬盘、网络信息等的读取相关操作技巧,需要的朋友可以参考下
    2018-06-06
  • SpringBoot中WebClient的实践过程

    SpringBoot中WebClient的实践过程

    本文介绍了SpringBoot中WebClient的使用,包括配置、使用场景以及优化策略,帮助开发者更高效地进行服务间通信,WebClient具有非阻塞式I/O、强大的功能、灵活性等优点,适用于高并发场景,通过合理配置和优化,可以显著提升服务间通信的效率和可靠性
    2025-12-12
  • Spring Boot 快速搭建微服务框架详细教程

    Spring Boot 快速搭建微服务框架详细教程

    SpringBoot是为了简化Spring应用的创建、运行、调试、部署等而出现的,使用它可以做到专注于Spring应用的开发,而无需过多关注XML的配置。本文重点给大家介绍Spring Boot 快速搭建微服务框架详细教程,需要的的朋友参考下吧
    2017-09-09
  • LRU算法及Apache LRUMap源码实例解析

    LRU算法及Apache LRUMap源码实例解析

    这篇文章主要给大家介绍了关于LRU算法及Apache LRUMap源码解析的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-11-11

最新评论