当前位置: 代码网 > it编程>编程语言>Java > Springboot集成Sentinel 组件实现基本限流功能(快速入门)

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

2025年12月27日 Java 我要评论
概述sentinel 是面向云原生微服务的高可用流控防护组件,以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保障服务稳定性。阿里巴巴在近10年双十一大促中成功验证了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 限流内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com