Sentinel 流量控制安装与使用
一、Sentinel 是什么?它能做什么?
在深入之前,我们先简单了解一下 Sentinel 的核心能力:
- 流量控制(Flow Control):就像交通信号灯控制车流量一样,Sentinel 可以限制对某个资源(比如一个 API 接口)的访问频率,防止它被过多的请求压垮。常见的规则有 QPS(每秒查询率)限制、并发线程数限制等。
- 熔断降级(Circuit Breaking & Degradation):当依赖的服务(比如下游服务)出现故障或响应缓慢时,Sentinel 可以暂时“断开”对这个服务的调用(熔断),或者直接禁止调用某些非核心功能(降级),避免故障蔓延,保证核心业务可用。
- 系统自适应保护(System Protection):Sentinel 能根据系统的整体状态(如 CPU 使用率、吞吐量等)自动调整流量,在系统即将达到瓶颈时进行保护,防止系统崩溃。
二、安装 Sentinel Dashboard
Sentinel 的核心组件包括 Sentinel Core(运行在业务代码中)和 Sentinel Dashboard(可视化控制台)。我们先来安装 Dashboard,它是我们配置和管理规则的可视化界面。
2.1 下载 Sentinel Dashboard
访问 Sentinel 的 GitHub Release 页面:https://github.com/alibaba/Sentinel/releases
选择一个稳定版本(比如我们博客示例用的 1.8.8),下载对应的 zip
压缩包。
2.2 解压并启动
- 解压:将下载的
zip
文件解压到你希望存放的目录,例如D:\man\sentinel-dashboard
。 - 启动:进入解压后的目录,你会看到一个
sentinel-dashboard-1.8.8.jar
文件。打开命令行(CMD 或 PowerShell),进入该目录,执行以下命令启动 Dashboard:
java -Dserver.port=8040 -jar sentinel-dashboard-1.8.8.jar
* `-Dserver.port=8040`:指定 Dashboard 运行的端口号为 8040,你可以根据需要修改。
* `-jar sentinel-dashboard-1.8.8.jar`:指定要运行的 JAR 包。你会看到类似以下的日志输出,表示启动成功:
INFO: Sentinel log output type is: fileINFO: Sentinel log charset is: utf-8INFO: Sentinel log base directory is: C:\Users\aixl\logs\cspINFO: Sentinel log level is: INFO:: Spring Boot :: (v2.5.12)...
2.3 访问 Dashboard
打开浏览器,访问 http://localhost:8040
。默认情况下,用户名和密码都是空。你可以看到 Sentinel 的登录界面(如果没设密码,直接进入)。
三、集成 Sentinel 到你的 Spring Boot 项目
接下来,我们创建一个简单的 Spring Boot 项目,并集成 Sentinel,让它能被 Dashboard 管理和监控。
3.1 创建 Spring Boot 项目
你可以使用 Spring Initializr(https://start.spring.io/)或者你熟悉的 IDE(如 IntelliJ IDEA)创建一个基础的 Spring Boot 项目。记得添加 spring-boot-starter-web
依赖,以便我们能创建一个简单的 Web 服务。
3.2 添加 Sentinel 依赖
在项目的 pom.xml
文件中,添加 Sentinel 的依赖:
代码生成完成
XML代码
然后执行 mvn clean install
或 mvn clean package
重新构建项目。
3.3 配置 Sentinel Dashboard 地址
在 application.properties
或 application.yml
文件中,配置 Sentinel Dashboard 的地址,让我们的项目知道去哪里注册和上报数据:
properties
# application.properties
spring.cloud.alibaba.sentinel.dashboard.server-addr=localhost:8040
或者 YAML 格式:
# application.yml
spring:cloud:alibaba:sentinel:dashboard: localhost:8040
3.4 定义一个简单的资源
在 Spring Boot 项目中,创建一个简单的 Controller,并使用 @SentinelResource
注解标记需要被 Sentinel 管理的资源。
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {// 定义资源名 "helloWorld"@GetMapping("/hello")@SentinelResource(value = "helloWorld")public String hello(@RequestParam(value = "name", defaultValue = "Stranger") String name) {return "Hello, " + name + "!";}// 定义一个可能失败或耗时的资源@GetMapping("/maybeFail")@SentinelResource(value = "maybeFail", blockHandler = "handleException")public String maybeFail() {// 模拟一个可能失败的操作double random = Math.random();if (random < 0.3) {throw new RuntimeException("Oops, something went wrong!");}// 模拟耗时操作try {Thread.sleep((long) (Math.random() * 1000));} catch (InterruptedException e) {Thread.currentThread().interrupt();}return "Operation succeeded!";}// 定义 blockHandler 方法,当资源被限流或降级时调用public String handleException() {return "Oops! Service is busy or unavailable, please try again later.";}
}
@SentinelResource(value = "资源名")
:value
参数定义了资源的唯一标识符。Sentinel 会根据这个名称来统计调用次数、配置规则等。blockHandler = "handleException"
:指定当该资源触发了限流或降级规则时,应该调用哪个方法来处理。这个方法需要与原方法有相同的参数列表,并返回相同类型的结果。
3.5 启动你的 Spring Boot 应用
现在,启动你的 Spring Boot 应用。如果一切正常,你应该能在 Sentinel Dashboard 的“簇点链路”(Clustered Chain)页面看到你定义的 helloWorld
和 maybeFail
这两个资源。
四、体验 Sentinel 的核心功能
4.1 流量控制(Flow Control)
- 访问资源:在浏览器中多次快速访问
http://localhost:8080/hello?name=User
(假设你的 Spring Boot 应用了运行在 8080 端口)。 - 配置规则:回到 Sentinel Dashboard,进入“流控规则”页面,点击“添加”。
- 资源名:选择
helloWorld
。 - 阈值类型:选择“QPS”(每秒查询数)。
- 阈值:设置一个较低的值,比如
1
,表示每秒只允许 1 次请求。 - 控制模式:选择“直接”。
- 点击“保存”。
- 资源名:选择
- 测试效果:再次快速多次访问
/hello
接口。你会发现,当你访问速度超过 1 QPS 时,后续的请求会收到 Sentinel 的默认降级响应(或者如果你配置了blockHandler
,会返回你定义的友好提示)。在 Dashboard 的“簇点链路”或“簇点链路详情”页面,你可以看到实时的 QPS 统计和被限流的次数。
4.2 熔断降级(Circuit Breaking & Degradation)
- 访问资源:访问
http://localhost:8080/maybeFail
,多次尝试,你会看到有时成功,有时失败或耗时较长。 - 配置降级规则:进入 Sentinel Dashboard 的“降级规则”页面,点击“添加”。
- 资源名:选择
maybeFail
。 - 降级策略:选择“异常比例”或“RT(平均响应时间)”。
- 如果选择“异常比例”,设置一个阈值,比如
50%
,统计窗口时长(如 1s),表示如果在 1 秒内,该资源的异常比例超过 50%,则触发降级。 - 如果选择“RT”,设置一个 RT 阈值(如
500ms
),统计窗口时长(如 1s),表示如果在 1 秒内,该资源的平均响应时间超过 500ms,则触发降级。
- 如果选择“异常比例”,设置一个阈值,比如
- 最小请求:设置一个最小请求数(如
5
),表示只有当请求数达到这个值时才进行统计,避免误判。 - 点击“保存”。
- 资源名:选择
- 测试效果:持续访问
/maybeFail
接口。当触发了你设置的降级条件后,Sentinel 会进入降级状态(熔断),一段时间内(默认 10 秒)不再调用这个资源,而是直接返回你定义的blockHandler
方法的结果(“Oops! Service is busy or unavailable…”)。过了熔断时长后,会进入半开状态,尝试少量请求,如果成功则恢复。
五、总结
通过这篇简单的教程,我们安装了 Sentinel Dashboard,并将其集成到了一个 Spring Boot 项目中。我们体验了 Sentinel 的两个核心功能:流量控制和熔断降级。
这只是 Sentinel 强大功能的冰山一角。Sentinel 还支持热点参数限流、系统规则、授权规则等更多高级特性,并且可以很好地与 Nacos、Consul 等注册中心结合,实现动态规则配置。
掌握 Sentinel,对于构建高可用、稳定可靠的微服务系统至关重要。希望这篇入门教程能帮助你迈出第一步!后续可以继续探索 Sentinel 的更多玩法,比如结合 Nacos 实现动态规则管理,或者深入理解其内部原理。