摘要:在当今互联网大厂后端开发的高并发场景下,保证系统的稳定性和可靠性至关重要。其中,限流操作是一种关键手段,能够有效防止系统因流量过大而崩溃。Sentinel 作为阿里巴巴开源的强大流量控制工具,在 Spring Boot3 项目中进行整合,可以轻松实现限流功能。
在当今互联网大厂后端开发的高并发场景下,保证系统的稳定性和可靠性至关重要。其中,限流操作是一种关键手段,能够有效防止系统因流量过大而崩溃。Sentinel 作为阿里巴巴开源的强大流量控制工具,在 Spring Boot3 项目中进行整合,可以轻松实现限流功能。本文将为各位互联网大厂后端开发人员详细介绍这一整合过程。
随着微服务架构的普及,服务间的稳定性越发重要。Sentinel 以流量为切入点,从流量控制、熔断降级和系统负载保护等多个维度来保障服务的稳定性。它具有以下显著特点:
丰富应用场景:Sentinel 承接了阿里巴巴过去 10 年双十一流量驱动的核心场景,如秒杀(即系统容量范围内的突发流量控制)、消息削峰填谷、集群流量控制、实时熔断不可用的下游应用等。实时监控完善:Sentinel 提供实时监控能力,从控制台可以查看单机每秒数据的性能汇总,甚至是规模小于 500 台机器的集群运行状况。开源生态广泛:它与其他开源框架 / 库提供了开箱即用的集成模块,例如 Spring Cloud、Dubbo 和 gRPC 等。通过引入适当的依赖并进行简单配置,就能快速接入 Sentinel。SPI 扩展点成熟:Sentinel 提供了易于使用且成熟的 SPI 扩展接口,通过实现扩展接口,能够快速自定义逻辑,比如自定义规则管理和适配动态数据源。Sentinel 分为两部分:核心库(Java 客户端)独立于任何框架 / 库,可在所有 Java 运行时环境中运行,并且对 Dubbo/Spring Cloud 等框架有良好的支持;控制台(Dashboard)基于 Spring Boot,可以直接打包运行,无需额外的应用容器,如 Tomcat。
在 Spring Boot3 项目的 pom.xml 文件中,添加 Sentinel 相关依赖。如果使用的是 Maven 项目,代码如下:
com.alibaba.cloudspring-cloud-starter-alibaba-sentinel2023.0.3.2此外,若要暴露 actuator/Sentinel 端点,还需添加如下依赖:
org.springframework.bootspring-boot-starter-actuator同时,在配置文件(如 application.yml)中进行如下配置,以暴露端点(默认不暴露):
management:endpoints:web:exposure:include: '*'连接 Sentinel 控制台
在 application.yml 文件中配置 Sentinel 控制台的地址信息:
spring:cloud:sentinel:transport:dashboard: localhost:8080启动 Sentinel 控制台
从 Sentinel 的 GitHub 仓库(https://github.com/alibaba/sentinel/releases)下载 Sentinel 控制台的 jar 包,例如 sentinel - dashboard - 1.8.0.jar。
在命令行中,进入 jar 包所在目录,执行命令:java -jar sentinel - dashboard - 1.8.0.jar。
默认情况下,Sentinel 控制台的访问地址为http://localhost:8080 ,默认用户名和密码均为 sentinel 。
编写限流代码
以一个简单的 Controller 为例,对接口进行限流。
import com.alibaba.csp.sentinel.annotation.SentinelResource;import com.alibaba.csp.sentinel.slots.block.BlockException;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class TestController {@GetMapping("/test")@SentinelResource(value = "test", blockHandler = "handleBlock")public String test {// 业务逻辑return "Hello Sentinel!";}public String handleBlock(BlockException ex) {return "Flow control triggered!";}}在上述代码中,@SentinelResource注解用于标记需要进行限流的资源,value属性指定资源名称为 “test”,blockHandler属性指定了限流触发时的处理方法handleBlock。
自定义限流规则
在配置类中,初始化 Sentinel 的流控规则。例如:
import com.alibaba.csp.sentinel.slots.block.RuleConstant;import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;import java.util.ArrayList;import java.util.List;@Configurationpublic class SentinelConfig {@PostConstructpublic void initFlowRules {List rules = new ArrayList;FlowRule rule = new FlowRule;rule.setResource("test");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setCount(10);rules.add(rule);FlowRuleManager.loadRules(rules);}}上述代码中,创建了一个流控规则,针对资源 “test”,设置限流阈值类型为 QPS,阈值数量为 10,即每秒最多允许 10 个请求通过。
启动 Spring Boot3 项目后,访问http://localhost:8080/test接口。当请求次数在限流阈值内时,接口正常返回 “Hello Sentinel!”。
当请求次数超过每秒 10 次(根据上述配置的限流规则),接口将返回 “Flow control triggered!”,表明限流生效。
同时,在 Sentinel 控制台中,可以实时监控到接口的流量信息,包括 QPS、成功请求数、失败请求数等。并且,还可以在控制台中动态修改限流规则,无需重启项目,就能使新规则生效。
通过以上步骤,我们成功地在 Spring Boot3 项目中整合了 Sentinel 并实现了限流操作。在实际项目中,各位互联网大厂后端开发人员可以根据具体业务需求,灵活调整限流规则和处理逻辑,以保障系统的高可用性和稳定性。
来源:从程序员到架构师一点号