Skip to content
清晨的一缕阳光
返回

Sentinel 控制台实战

Sentinel 控制台实战

Sentinel Dashboard 简介

Sentinel Dashboard 是 Sentinel 的可视化控制台,提供实时监控、规则配置、集群管理等功能。

核心功能

架构设计

┌─────────────────────────────────────────────────────┐
│              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. 实时监控页面

2. 监控指标说明

指标说明
QPS每秒请求数(Queries Per Second)
平均 RT平均响应时间(Response Time)
通过 QPS通过的请求 QPS
拒绝 QPS被限流/熔断拒绝的 QPS
线程数当前并发线程数
异常数业务异常数量
异常率异常请求占比

3. 集群总览

查看整个集群的流量情况:

流控规则配置

1. 添加流控规则

在”流控规则”页面点击”新增规则”:

配置项说明

2. 示例配置

QPS 限流

资源名:getUserById
针对来源:default
阈值类型:QPS
单机阈值:100
流控模式:直接
流控效果:快速失败

线程数限流

资源名:processData
针对来源:default
阈值类型:并发线程数
单机阈值:50
流控模式:直接
流控效果:快速失败

Warm Up 预热

资源名:seckill
针对来源:default
阈值类型:QPS
单机阈值:1000
流控模式:直接
流控效果:Warm Up
预热时间:10 秒

排队等待

资源名:createOrder
针对来源:default
阈值类型:QPS
单机阈值:100
流控模式:直接
流控效果:排队等待
超时时间:500ms

熔断降级规则

1. 添加熔断规则

在”熔断降级”页面点击”新增规则”:

配置项说明

2. 示例配置

异常比例熔断

资源名:getUserById
熔断策略:异常比例
比例:0.5(50%)
熔断时长:10 秒
最小请求数:10
统计时长:10000ms

慢调用比例熔断

资源名:callExternalApi
熔断策略:慢调用比例
最大 RT:3000ms
比例:0.3(30%)
熔断时长:10 秒
最小请求数:10
统计时长:10000ms

异常数熔断

资源名:processOrder
熔断策略:异常数
异常数:10
熔断时长:10 秒
最小请求数:10
统计时长:10000ms

热点参数限流

1. 添加热点规则

在”热点规则”页面点击”新增规则”:

配置项说明

2. 示例配置

基础热点限流

资源名:productDetail
参数索引:0(商品 ID)
限流模式:QPS
单机阈值:100

针对特定参数值设置阈值

资源名:productDetail
参数索引:0
限流模式:QPS
单机阈值:100

参数值特殊配置:
- 参数值:1001(热门商品)
  阈值:50
- 参数值:1002(热门商品)
  阈值:50

授权规则

1. 添加授权规则

在”授权规则”页面点击”新增规则”:

配置项说明

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. 配置集群模式

在”集群流控”页面配置:

配置项说明

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. 规则管理

2. 监控配置

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 看不到

排查步骤

2. 规则不生效

问题:配置了规则但不生效

解决方案

3. 规则丢失

问题:重启应用后规则丢失

解决方案

总结

Sentinel Dashboard 提供了可视化的流量控制管理界面,通过实时监控、规则配置、集群管理等功能,可以方便地管理和监控应用的流量控制策略。

在生产环境中,建议将规则持久化到配置中心,并建立完善的监控告警机制。


分享这篇文章到:

上一篇文章
Spring Boot 声明式事务管理
下一篇文章
Spring Boot Testcontainers 测试实战