Sentinel 流量控制安装与使用

发布于:2025-06-13 ⋅ 阅读:(16) ⋅ 点赞:(0)

一、Sentinel 是什么?它能做什么?

在深入之前,我们先简单了解一下 Sentinel 的核心能力:

  1. 流量控制(Flow Control):就像交通信号灯控制车流量一样,Sentinel 可以限制对某个资源(比如一个 API 接口)的访问频率,防止它被过多的请求压垮。常见的规则有 QPS(每秒查询率)限制、并发线程数限制等。
  2. 熔断降级(Circuit Breaking & Degradation):当依赖的服务(比如下游服务)出现故障或响应缓慢时,Sentinel 可以暂时“断开”对这个服务的调用(熔断),或者直接禁止调用某些非核心功能(降级),避免故障蔓延,保证核心业务可用。
  3. 系统自适应保护(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 解压并启动

  1. 解压:将下载的 zip 文件解压到你希望存放的目录,例如 D:\man\sentinel-dashboard
  2. 启动:进入解压后的目录,你会看到一个 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: file
    INFO: Sentinel log charset is: utf-8
    INFO: Sentinel log base directory is: C:\Users\aixl\logs\csp
    INFO: 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)

  1. 访问资源:在浏览器中多次快速访问 http://localhost:8080/hello?name=User(假设你的 Spring Boot 应用了运行在 8080 端口)。
  2. 配置规则:回到 Sentinel Dashboard,进入“流控规则”页面,点击“添加”。
    • 资源名:选择 helloWorld
    • 阈值类型:选择“QPS”(每秒查询数)。
    • 阈值:设置一个较低的值,比如 1,表示每秒只允许 1 次请求。
    • 控制模式:选择“直接”。
    • 点击“保存”。
  3. 测试效果:再次快速多次访问 /hello 接口。你会发现,当你访问速度超过 1 QPS 时,后续的请求会收到 Sentinel 的默认降级响应(或者如果你配置了 blockHandler,会返回你定义的友好提示)。在 Dashboard 的“簇点链路”或“簇点链路详情”页面,你可以看到实时的 QPS 统计和被限流的次数。

4.2 熔断降级(Circuit Breaking & Degradation)

  1. 访问资源:访问 http://localhost:8080/maybeFail,多次尝试,你会看到有时成功,有时失败或耗时较长。
  2. 配置降级规则:进入 Sentinel Dashboard 的“降级规则”页面,点击“添加”。
    • 资源名:选择 maybeFail
    • 降级策略:选择“异常比例”或“RT(平均响应时间)”。
      • 如果选择“异常比例”,设置一个阈值,比如 50%,统计窗口时长(如 1s),表示如果在 1 秒内,该资源的异常比例超过 50%,则触发降级。
      • 如果选择“RT”,设置一个 RT 阈值(如 500ms),统计窗口时长(如 1s),表示如果在 1 秒内,该资源的平均响应时间超过 500ms,则触发降级。
    • 最小请求:设置一个最小请求数(如 5),表示只有当请求数达到这个值时才进行统计,避免误判。
    • 点击“保存”。
  3. 测试效果:持续访问 /maybeFail 接口。当触发了你设置的降级条件后,Sentinel 会进入降级状态(熔断),一段时间内(默认 10 秒)不再调用这个资源,而是直接返回你定义的 blockHandler 方法的结果(“Oops! Service is busy or unavailable…”)。过了熔断时长后,会进入半开状态,尝试少量请求,如果成功则恢复。

五、总结

通过这篇简单的教程,我们安装了 Sentinel Dashboard,并将其集成到了一个 Spring Boot 项目中。我们体验了 Sentinel 的两个核心功能:流量控制和熔断降级。

这只是 Sentinel 强大功能的冰山一角。Sentinel 还支持热点参数限流、系统规则、授权规则等更多高级特性,并且可以很好地与 Nacos、Consul 等注册中心结合,实现动态规则配置。

掌握 Sentinel,对于构建高可用、稳定可靠的微服务系统至关重要。希望这篇入门教程能帮助你迈出第一步!后续可以继续探索 Sentinel 的更多玩法,比如结合 Nacos 实现动态规则管理,或者深入理解其内部原理。