Sentinel 控制台实战
Sentinel Dashboard 简介
Sentinel Dashboard 是 Sentinel 的可视化控制台,提供实时监控、规则配置、集群管理等功能。
核心功能
- 实时监控:查看应用的 QPS、响应时间、线程数等指标
- 规则管理:配置流控、熔断、热点参数等规则
- 集群管理:管理集群限流配置
- 机器发现:自动发现接入的应用实例
- 规则持久化:支持将规则推送到配置中心
架构设计
┌─────────────────────────────────────────────────────┐
│ Sentinel Dashboard │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 实时监控 │ │ 规则管理 │ │ 集群管理 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└───────────────────┬─────────────────────────────────┘
│
│ HTTP
▼
┌─────────────────────────────────────────────────────┐
│ 应用应用(Sentinel Client) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 指标上报 │ │ 规则接收 │ │ 命令响应 │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────┘
快速开始
1. 下载 Dashboard
# 从 GitHub 下载
wget https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar
# 或使用 Docker
docker pull bladex/sentinel-dashboard:1.8.6
2. 启动 Dashboard
# 直接运行
java -jar sentinel-dashboard-1.8.6.jar
# 指定端口
java -Dserver.port=8080 -jar sentinel-dashboard-1.8.6.jar
# 指定用户名密码
java -Dserver.port=8080 \
-Dsentinel.dashboard.auth.username=sentinel \
-Dsentinel.dashboard.auth.password=sentinel \
-jar sentinel-dashboard-1.8.6.jar
3. Docker 部署
docker run -d \
-p 8080:8080 \
-e SENTINEL_USERNAME=sentinel \
-e SENTINEL_PASSWORD=sentinel \
--name sentinel-dashboard \
bladex/sentinel-dashboard:1.8.6
4. 访问控制台
打开浏览器访问:http://localhost:8080
默认账号密码:sentinel / sentinel
应用接入
1. 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2. 配置 Dashboard 地址
spring:
cloud:
sentinel:
enabled: true
transport:
dashboard: localhost:8080 # Dashboard 地址
port: 8719 # 客户端端口(可选,默认自动选择)
datasource:
ds1:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-sentinel.json
groupId: DEFAULT_GROUP
rule-type: flow
3. 查看应用
启动应用后,在 Dashboard 的”机器发现”页面可以看到接入的应用。
实时监控
1. 实时监控页面
- QPS 曲线:显示每秒请求数
- 响应时间曲线:显示平均响应时间
- 线程数曲线:显示并发线程数
- 通过请求数:显示通过的请求总数
- 被限流请求数:显示被限流的请求数
- 异常数:显示异常请求数
2. 监控指标说明
| 指标 | 说明 |
|---|---|
| QPS | 每秒请求数(Queries Per Second) |
| 平均 RT | 平均响应时间(Response Time) |
| 通过 QPS | 通过的请求 QPS |
| 拒绝 QPS | 被限流/熔断拒绝的 QPS |
| 线程数 | 当前并发线程数 |
| 异常数 | 业务异常数量 |
| 异常率 | 异常请求占比 |
3. 集群总览
查看整个集群的流量情况:
- 集群 QPS:所有实例的总 QPS
- 集群连接数:客户端连接数
- 集群线程数:总线程数
流控规则配置
1. 添加流控规则
在”流控规则”页面点击”新增规则”:
配置项说明:
- 资源名:需要限流的资源名称(方法名或 URL 路径)
- 针对来源:限流针对的调用来源(default 表示所有来源)
- 阈值类型:
- QPS:每秒请求数
- 并发线程数:并发请求数
- 单机阈值:单机阈值(集群模式为集群阈值)
- 流控模式:
- 直接:达到阈值直接拒绝
- 关联:关联资源达到阈值时限流
- 链路:只统计指定链路的流量
- 流控效果:
- 快速失败:直接拒绝
- Warm Up:预热模式
- 排队等待:匀速排队
2. 示例配置
QPS 限流:
资源名:getUserById
针对来源:default
阈值类型:QPS
单机阈值:100
流控模式:直接
流控效果:快速失败
线程数限流:
资源名:processData
针对来源:default
阈值类型:并发线程数
单机阈值:50
流控模式:直接
流控效果:快速失败
Warm Up 预热:
资源名:seckill
针对来源:default
阈值类型:QPS
单机阈值:1000
流控模式:直接
流控效果:Warm Up
预热时间:10 秒
排队等待:
资源名:createOrder
针对来源:default
阈值类型:QPS
单机阈值:100
流控模式:直接
流控效果:排队等待
超时时间:500ms
熔断降级规则
1. 添加熔断规则
在”熔断降级”页面点击”新增规则”:
配置项说明:
- 资源名:需要熔断的资源
- 熔断策略:
- 慢调用比例:基于响应时间
- 异常比例:基于异常比例
- 异常数:基于异常数量
- 最大 RT:慢调用比例策略下,超过该 RT 算慢调用(毫秒)
- 比例或数量:触发熔断的阈值
- 熔断时长:熔断持续时间(秒)
2. 示例配置
异常比例熔断:
资源名:getUserById
熔断策略:异常比例
比例:0.5(50%)
熔断时长:10 秒
最小请求数:10
统计时长:10000ms
慢调用比例熔断:
资源名:callExternalApi
熔断策略:慢调用比例
最大 RT:3000ms
比例:0.3(30%)
熔断时长:10 秒
最小请求数:10
统计时长:10000ms
异常数熔断:
资源名:processOrder
熔断策略:异常数
异常数:10
熔断时长:10 秒
最小请求数:10
统计时长:10000ms
热点参数限流
1. 添加热点规则
在”热点规则”页面点击”新增规则”:
配置项说明:
- 资源名:需要限流的资源
- 参数索引:参数在方法中的索引(从 0 开始)
- 限流模式:
- QPS 模式:每秒请求数
- 单机阈值:每个参数值的阈值
- 是否参数集群:是否对参数值聚类
2. 示例配置
基础热点限流:
资源名:productDetail
参数索引:0(商品 ID)
限流模式:QPS
单机阈值:100
针对特定参数值设置阈值:
资源名:productDetail
参数索引:0
限流模式:QPS
单机阈值:100
参数值特殊配置:
- 参数值:1001(热门商品)
阈值:50
- 参数值:1002(热门商品)
阈值:50
授权规则
1. 添加授权规则
在”授权规则”页面点击”新增规则”:
配置项说明:
- 资源名:需要授权控制的资源
- 流控效果:
- 白名单:允许访问
- 黑名单:拒绝访问
- 流控值:调用来源(Origin)
2. 示例配置
白名单:
资源名:internalApi
流控效果:白名单
流控值:app1,app2
黑名单:
资源名:sensitiveApi
流控效果:黑名单
流控值:maliciousApp
3. 实现 OriginParser
@Component
public class SentinelOriginParser implements OriginParser<String> {
@Override
public String parseOrigin(HttpServletRequest request) {
// 从 Header 中获取调用来源
String origin = request.getHeader("X-App-Name");
if (origin != null) {
return origin;
}
// 从参数获取
origin = request.getParameter("app");
return origin != null ? origin : "unknown";
}
}
集群限流
1. 配置集群模式
在”集群流控”页面配置:
配置项说明:
- 流控 ID:规则的唯一标识
- 流控模式:
- 阈值均摊:平均分配到每个节点
- 阈值总量:集群总阈值
- 限流模式:
- QPS 模式
- 线程数模式
2. 示例配置
集群总阈值:
流控 ID:1
资源名:seckill
流控模式:阈值总量
阈值:1000(集群总 QPS)
平均分配:
流控 ID:2
资源名:createOrder
流控模式:阈值均摊
阈值:100(每个节点 100 QPS)
3. 集群限流配置
spring:
cloud:
sentinel:
enabled: true
transport:
dashboard: localhost:8080
datasource:
flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-sentinel-flow.json
groupId: DEFAULT_GROUP
rule-type: gw-flow
cluster:
enabled: true
token-server:
port: 8719
token-client:
request-timeout: 2000
规则持久化
1. Push 模式(推荐)
将规则推送到配置中心(如 Nacos):
spring:
cloud:
sentinel:
datasource:
# 流控规则
flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-sentinel-flow.json
groupId: DEFAULT_GROUP
rule-type: flow
# 熔断规则
degrade:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-sentinel-degrade.json
groupId: DEFAULT_GROUP
rule-type: degrade
# 热点规则
param-flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-sentinel-param.json
groupId: DEFAULT_GROUP
rule-type: param-flow
2. 规则格式
流控规则(flow):
[
{
"resource": "getUserById",
"limitApp": "default",
"grade": 1,
"count": 100,
"strategy": 0,
"refResource": null,
"controlBehavior": 0,
"warmUpPeriodSec": 10,
"maxQueueingTimeMs": 500
}
]
熔断规则(degrade):
[
{
"resource": "getUserById",
"limitApp": "default",
"grade": 0,
"count": 0.5,
"timeWindow": 10,
"minRequestAmount": 10,
"statIntervalMs": 10000
}
]
3. 自定义推送
修改 Dashboard 源码,实现规则推送到配置中心:
@RestController
@RequestMapping("/api/v1/flow")
public class FlowControllerV2 {
@Autowired
private ConfigService configService;
@PostMapping("/rules")
public Result<FlowRuleEntity> apiAddFlowRule(@RequestBody FlowRuleEntity entity) {
// 保存到内存
repository.save(entity);
// 推送到 Nacos
String rules = JSON.toJSONString(getRulesByApp(entity.getApp()));
configService.publishConfig(
entity.getApp() + "-sentinel-flow.json",
"DEFAULT_GROUP",
rules
);
return Result.success(entity);
}
}
监控告警
1. 集成 Prometheus
# application.yml
management:
endpoints:
web:
exposure:
include: prometheus
metrics:
export:
prometheus:
enabled: true
2. 配置告警规则
# alert_rules.yml
groups:
- name: sentinel
rules:
- alert: SentinelQPSHigh
expr: sentinel_flow_qps > 1000
for: 1m
labels:
severity: warning
annotations:
summary: "Sentinel QPS 过高"
description: "应用 {{ $labels.app }} 的 QPS 超过 1000"
- alert: SentinelBlockQPSHigh
expr: sentinel_block_qps > 100
for: 1m
labels:
severity: critical
annotations:
summary: "Sentinel 限流严重"
description: "应用 {{ $labels.app }} 被限流的 QPS 超过 100"
3. 告警通知
@Component
public class SentinelAlertHandler {
@Autowired
private AlertService alertService;
@Scheduled(fixedRate = 60000)
public void checkMetrics() {
// 获取限流指标
Map<String, MetricVo> metrics = getMetrics();
metrics.forEach((resource, metric) -> {
if (metric.getBlockQps() > 100) {
alertService.sendAlert(
String.format("资源 %s 限流严重,BlockQPS=%d",
resource, metric.getBlockQps())
);
}
});
}
}
最佳实践
1. 规则管理
- 按环境分离:dev/test/prod 使用不同的规则
- 版本控制:规则配置纳入 Git 管理
- 变更审批:规则变更走审批流程
- 定期 Review:定期 review 规则有效性
2. 监控配置
- 关键指标监控:QPS、RT、BlockQPS
- 告警阈值设置:根据业务场景设置
- 告警分级:warning/critical 分级告警
- 告警降噪:避免告警风暴
3. 性能优化
- 规则缓存:本地缓存规则,减少网络请求
- 异步上报:指标异步上报,减少性能影响
- 采样率调整:根据流量调整采样率
4. 高可用部署
# 部署多个 Dashboard 实例
docker run -d -p 8081:8080 --name sentinel-dashboard-1 sentinel-dashboard
docker run -d -p 8082:8080 --name sentinel-dashboard-2 sentinel-dashboard
# Nginx 负载均衡
upstream sentinel {
server sentinel1:8080;
server sentinel2:8080;
}
常见问题
1. Dashboard 无法看到应用
问题:应用已接入但 Dashboard 看不到
排查步骤:
- 检查
transport.dashboard配置 - 检查网络连通性
- 查看应用日志
- 检查版本兼容性
2. 规则不生效
问题:配置了规则但不生效
解决方案:
- 检查资源名是否正确
- 检查规则配置
- 查看 Sentinel 日志
- 重启应用
3. 规则丢失
问题:重启应用后规则丢失
解决方案:
- 使用 Push 模式持久化到配置中心
- 配置 Nacos 数据源
- 实现自定义规则仓库
总结
Sentinel Dashboard 提供了可视化的流量控制管理界面,通过实时监控、规则配置、集群管理等功能,可以方便地管理和监控应用的流量控制策略。
在生产环境中,建议将规则持久化到配置中心,并建立完善的监控告警机制。