微信登录

服务限流 - Sentinel - 阿里限流框架

Java - Web - Spring 《服务限流 - Sentinel - 阿里限流框架》

一、引言

在当今的互联网应用中,高并发场景屡见不鲜。当大量请求同时涌入服务时,可能会导致服务性能下降、系统崩溃等问题。为了保障服务的稳定性和可用性,限流是一种非常重要的技术手段。Sentinel 是阿里巴巴开源的一款轻量级的流量控制框架,它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保障微服务的稳定性。

二、Sentinel 简介

Sentinel 具有以下几个核心特性:

  1. 丰富的应用场景:适用于各种微服务、分布式系统的流量控制场景。
  2. 实时监控:可以实时查看系统的运行状态和流量信息。
  3. 多种限流策略:支持 QPS 限流、并发线程数限流等多种策略。
  4. 熔断降级:当服务出现异常时,能够自动进行熔断降级,避免级联故障。
  5. 动态配置:可以通过控制台或配置文件动态调整限流规则。

三、Sentinel 的工作原理

Sentinel 的核心是一个流量控制器,它会对进入系统的请求进行拦截和检查。当请求到达时,Sentinel 会根据预设的规则判断是否允许该请求通过。如果请求超过了限流阈值,Sentinel 会采取相应的措施,如返回错误信息或进行熔断降级。

Sentinel 的主要工作流程如下:

  1. 规则配置:用户可以通过控制台或配置文件设置限流规则。
  2. 请求拦截:Sentinel 会在请求进入系统时进行拦截。
  3. 规则检查:根据预设的规则判断请求是否允许通过。
  4. 执行策略:如果请求超过阈值,执行相应的限流策略。
  5. 监控统计:实时统计系统的流量信息和运行状态。

四、Sentinel 在 Spring Boot 项目中的使用

1. 引入依赖

pom.xml 中添加 Sentinel 的依赖:

  1. <dependency>
  2. <groupId>com.alibaba.csp</groupId>
  3. <artifactId>sentinel-core</artifactId>
  4. <version>1.8.3</version>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.alibaba.csp</groupId>
  8. <artifactId>sentinel-transport-simple-http</artifactId>
  9. <version>1.8.3</version>
  10. </dependency>

2. 配置 Sentinel

创建一个配置类,用于初始化 Sentinel:

  1. import com.alibaba.csp.sentinel.slots.block.RuleConstant;
  2. import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
  3. import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
  4. import org.springframework.context.annotation.Configuration;
  5. import javax.annotation.PostConstruct;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. @Configuration
  9. public class SentinelConfig {
  10. @PostConstruct
  11. public void initFlowRules() {
  12. List<FlowRule> rules = new ArrayList<>();
  13. FlowRule rule = new FlowRule();
  14. // 设置资源名
  15. rule.setResource("hello");
  16. // 设置限流阈值类型为 QPS
  17. rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
  18. // 设置 QPS 阈值为 2
  19. rule.setCount(2);
  20. rules.add(rule);
  21. // 加载规则
  22. FlowRuleManager.loadRules(rules);
  23. }
  24. }

3. 编写业务代码

创建一个简单的控制器,模拟业务逻辑:

  1. import com.alibaba.csp.sentinel.Entry;
  2. import com.alibaba.csp.sentinel.SphU;
  3. import com.alibaba.csp.sentinel.slots.block.BlockException;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. public class HelloController {
  8. @GetMapping("/hello")
  9. public String hello() {
  10. Entry entry = null;
  11. try {
  12. // 尝试进入资源
  13. entry = SphU.entry("hello");
  14. // 业务逻辑
  15. return "Hello, Sentinel!";
  16. } catch (BlockException e) {
  17. // 限流处理
  18. return "请求被限流,请稍后再试!";
  19. } finally {
  20. if (entry != null) {
  21. entry.exit();
  22. }
  23. }
  24. }
  25. }

4. 启动项目

启动 Spring Boot 项目,访问 http://localhost:8080/hello。当请求频率超过 QPS 阈值(2 次/秒)时,会返回“请求被限流,请稍后再试!”的提示信息。

五、Sentinel 控制台

Sentinel 提供了一个可视化的控制台,方便用户查看系统的运行状态和配置限流规则。

1. 下载并启动控制台

从 Sentinel 官方 GitHub 仓库下载控制台的 JAR 包,然后使用以下命令启动:

  1. java -Dserver.port=8088 -jar sentinel-dashboard-1.8.3.jar

2. 配置项目连接控制台

在项目的 application.properties 中添加以下配置:

  1. csp.sentinel.dashboard.server=localhost:8088

3. 访问控制台

启动项目后,访问 http://localhost:8088,使用默认用户名和密码(sentinel/sentinel)登录控制台。在控制台中可以实时查看系统的流量信息和配置限流规则。

六、总结

Sentinel 是一款功能强大、使用方便的流量控制框架,它可以帮助我们有效地应对高并发场景,保障服务的稳定性和可用性。通过本文的介绍,我们学习了 Sentinel 的基本原理和在 Spring Boot 项目中的使用方法,同时也了解了 Sentinel 控制台的使用。

Sentinel 核心概念总结

概念 描述
资源 被 Sentinel 保护的对象,可以是一个方法、接口等。
规则 定义了对资源的保护策略,如限流规则、熔断降级规则等。
流量控制器 Sentinel 的核心组件,负责对请求进行拦截和检查。
控制台 提供了可视化的界面,方便用户查看系统状态和配置规则。

希望本文能够帮助你快速上手 Sentinel,在实际项目中发挥它的作用。如果你对 Sentinel 还有其他疑问或想深入学习,可以参考 Sentinel 的官方文档。

通过以上内容,你可以全面了解 Sentinel 的基本原理、使用方法和控制台的配置,在实际项目中应用 Sentinel 进行服务限流,保障系统的稳定性和可用性。