目录
[1.1 核心概念](#1.1 核心概念)
[1.2 核心功能](#1.2 核心功能)
[1.3 工作原理](#1.3 工作原理)
[2.1 下载安装控制台](#2.1 下载安装控制台)
[2.2 引入依赖](#2.2 引入依赖)
[2.3 配置文件](#2.3 配置文件)
[2.4 查看效果](#2.4 查看效果)
[2.5 定义资源](#2.5 定义资源)
[2.6 测试流控](#2.6 测试流控)
一、介绍
Sentinel是阿里巴巴开源的一款面向分布式服务架构的轻量级高可用流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保障微服务的稳定性。本文将全面解析Sentinel的核心概念、工作原理、使用方法和最佳实践。

1.1 核心概念
(1)资源
资源是Sentinel的关键概念,可以是Java应用程序中的任何内容:
-
由应用程序提供的服务
-
应用程序调用的其他应用提供的服务
-
一段代码或方法
-
一个API接口
大部分情况下,可以使用方法签名、URL甚至服务名称作为资源名来标识资源
(2)规则
围绕资源的实时状态设定的规则主要包括:
-
流量控制规则:限制资源的访问频率,如QPS、并发线程数
-
熔断降级规则:当资源不稳定时自动熔断
-
系统保护规则:保护系统整体负载
-
热点参数规则:针对特定参数值的流量控制
-
授权规则:黑白名单控制
所有规则都可以动态实时调整,无需重启应用。
1.2 核心功能
(1)流量控制
Sentinel提供两种流量统计方式:
-
并发线程数控制:当并发线程数超出阈值,新请求会被立即拒绝
-
QPS控制:当QPS超出阈值,系统可以拒绝或排队等方式应对
流量控制设计理念包括:
-
资源调用关系控制
-
运行指标(QPS、线程数、系统负载等)控制
-
控制效果(直接限流、冷启动、排队等)
(2)熔断降级
Sentinel通过以下指标判断资源稳定性:
-
慢调用比例
-
异常比例
-
异常数
与Hystrix相比,Sentinel的熔断策略更加灵活:
-
不依赖线程池隔离,减少线程切换开销
-
支持基于响应时间和异常比例的熔断
-
提供半开状态自动恢复机制
(3)系统自适应保护
Sentinel提供系统维度的自适应保护能力:
-
根据系统负载(如CPU使用率、平均RT等)动态调整入口流量
-
防止系统在高负载时崩溃
-
保证系统在能力范围内处理最多请求
(4)实时监控与可视化
Sentinel Dashboard提供:
-
实时监控各资源的QPS、RT、异常比例等指标
-
规则配置与管理界面
-
机器发现与健康状态监控
-
集群流量汇总统计
1.3 工作原理
(1)核心流程
当请求访问一个资源时,Sentinel的工作流程如下:
-
资源定义:通过API或注解定义需要保护的资源
-
规则检查:检查该资源的流量控制、熔断等规则
-
请求处理:根据规则决定是否允许请求通过
-
统计监控:记录请求处理结果用于后续规则判断

(2)责任链模式
Sentinel内部采用责任链模式处理请求,包含多个ProcessorSlot:
-
NodeSelectorSlot:收集资源路径,构建调用树
-
ClusterBuilderSlot:构建ClusterNode用于统计
-
StatisticSlot:多维度统计(响应时间、线程数等)
-
AuthoritySlot:黑白名单校验
-
SystemSlot:系统指标检查(负载、QPS等)
-
FlowSlot:流量控制
-
DegradeSlot:熔断降级
-
LogSlot:日志记录
开发者可以通过SPI机制自定义Slot并插入处理链。
二、整合Sentinel
2.1 下载安装控制台
官网地址:home | Sentinel
控制台下载地址:https://github.com/alibaba/Sentinel/releases
版本推荐:1.8.8

启动jar包
bash
java -jar sentinel-dashboard-1.8.8.jar

登录控制台
账号密码默认都是:sentinel


2.2 引入依赖
在servie父工程下引入依赖,前面章节其实已经引入过了
XML
<!-- 熔断限流 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.3 配置文件
各个服务的配置文件中配置上sentinel的控制台地址
java
spring.cloud.sentinel.transport.dashboard=localhost:8080

2.4 查看效果

这样就加载进来了,只不过这些菜单都没有数据,这是因为我们还没有配置资源。
2.5 定义资源
所谓资源,前面也介绍了,Java应用程序中的任何内容都可以称为资源。
以接口为例,我们定义某个接口作为sentinel的资源,通过
@SentinelResource(value = "定义资源名称")注解来定义资源,假设如下这个接口定义成一个资源。当然不限于接口,任何方法内容都可以。
java
@SentinelResource(value = "getRemoteUser")
@GetMapping("/getRemoteFeign")
public User getRemoteFeign(){
return systemFeignClient.getUser();
}
然后我们重新启动,发送这个请求。

再进入sentinel控制台,从簇点链路中刷新可以看到,它将刚才我们定义的这个资源以及上下游涉及到的都定义为了资源。
每个资源通过右边的操作按钮,可以对它们的流量、熔断、热点等进行控制。

2.6 测试流控
我们就以刚才的资源为例,点击流控按钮,配置流控规则。
比如选择按QPS 每秒1次进行控制


然后我们将刚才的接口快速点击看看,发现提示被限流了。
