一、Sentinel 介绍和工作机制¶
1.1 微服务流量治理组件介绍¶
随着微服务的流行,服务和服务之间的调用导致服务的稳定性问题变得越来越重要
雪崩问题: 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,即雪崩。
解决雪崩问题的常见方式有四种:
- 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待
- 流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。
- 熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。当系统资源(如 CPU、内存、线程池)紧张或某服务负载过高时,主动暂时舍弃部分非核心功能或降低服务质量,以保证核心功能的可用性,通过牺牲部分功能来维持系统整体的可用性,避免因局部问题导致全局崩溃。
- 舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源, 因此也叫线程隔离。
同类组件功能对比
https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94
%A8-Sentinel
https://github.com/Netflix/Hystrix
| Sentinel | Hystrix(最后更新2018-11-17) | resilience4j | |
|---|---|---|---|
| 隔离策略 | 信号量隔离(并发控制) | 线程池隔离/信号量隔离 | 信号量隔离 |
| 熔断降级策略 | 基于慢调用比例、异常比例、异常数 | 基于异常比例 | 基于异常比例、响应时间 |
| 实时统计实现 | 滑动窗口(LeapArray) | 滑动窗口(基于RxJava) | Ring Bit Buffer |
| 动态规则配置 | 支持近十种动态数据源 | 支持多种数据源 | 有限支持 |
| 扩展性 | 多个扩展点 | 插件的形式 | 接口的形式 |
| 基于注解的支持 | 支持 | 支持 | 支持 |
| 单机限流 | 基于QPS,支持基于调用关系的限流 | 有限的支持 | Rate Limiter |
| 集群流控 | 支持 | 不支持 | 不支持 |
| 流量整形 | 支持预热模式与匀速排队控制效果 | 不支持 | 简单的Rate Limiter模式 |
| 系统自适应保护 | 支持 | 不支持 | 不支持 |
| 热点识别/防护 | 支持 | 不支持 | 不支持 |
| 多语言支持 | Java/Go/C++ | Java | Java |
| Service Mesh支持 | 支持Envoy/Istio | 不支持 | 不支持 |
| 控制台 | 提供开箱即用的控制台,可配置规则、实时监控、机器发现等 | 简单的监控查看 | 不提供控制台,可对接其它监控系统 |
1.2 Sentinel 介绍¶
https://spring.io/projects/spring-cloud-alibaba https://sentinelguard.io/zh-cn/ https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel https://github.com/alibaba/Sentinel/ https://github.com/sentinel-group https://github.com/alibaba/sentinel-golang
Sentinel 是 Spring Cloud Alibaba开发框架的众多组件之一
Sentinel 是阿里巴巴开发的面向云原生微服务的面向分布式、高可用、多语言异构化服务架构的流量治理组件
Sentinel 主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
Sentinel 的历史
2012 年,Sentinel 诞生,主要功能为入口流量控制。
2013-2017 年,Sentinel 在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel 也因此积累了大量的流量归整场景以及生产实践。
2018 年,Sentinel 开源,并持续演进。
2019 年,Sentinel 朝着多语言扩展的方向不断探索,推出 C++ 原生版本,同时针对 Service Mesh 场景也推出了 Envoy 集群流量控制支持,以解决 Service Mesh 架构下多语言限流的问题。
2020 年,推出 Sentinel Go 版本,继续朝着云原生方向演进。
2021 年,Sentinel 正在朝着 2.0 云原生高可用决策中心组件进行演进;同时推出了 Sentinel Rust 原生版本。同时我们也在 Rust 社区进行了 Envoy WASM extension 及 eBPF extension 等场景探索。
2022 年,Sentinel 品牌升级为流量治理,领域涵盖流量路由/调度、流量染色、流控降级、过载保护/实例摘除等;同时社区将流量治理相关标准抽出到 OpenSergo 标准中,Sentinel 作为流量治理标准实现。
Sentinel 具有以下特征:
丰富的应用场景: Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、实时熔断下游不可用应用等。
完备的实时监控: Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
广泛的开源生态: Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
完善的 SPI 扩展点: Sentinel 提供简单易用、完善的 SPI 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。

1.3 Sentinel 基本概念¶
资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
资源在java中的资源一般是接口方法。通常就是一个URL,比如:/hello/get
规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
1.4 Sentinel 功能和设计理念¶
https://sentinelguard.io/zh-cn/docs/introduction.html

流量控制
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:

流量控制有以下几个角度:
资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
运行指标,例如 QPS、线程池、系统负载等;
控制的效果,例如直接限流、冷启动、排队等。
Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。
熔断降级
除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。
当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源而导致产生雪崩的效果。
当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出DegradeException)。当访问系统失败超过一定的次数后,对该接口进行熔断的操作。

熔断降级设计理念
在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。
Hystrix 通过线程池的方式,来对依赖(在我们的概念中对应资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本,还需要预先给各个资源做线程池大小的分配。
Sentinel 对这个问题采取了两种手段:
通过并发线程数进行限制
和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
通过响应时间对资源进行降级
除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。
系统负载保护
Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。
针对此情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。
1.5 Sentinel 工作主流程¶
总体的框架如下:

在 Sentinel 里面,所有的资源都对应一个资源名称以及一个 Entry。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 API 显式创建;每一个 Entry 创建的时候,同时也会创建一系列功能插槽(slot chain)。这些插槽有不同的职责,例如:
NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级
ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据
StatisticSlot 则用于记录、统计不同纬度的 runtime 指标监控信息,Sentinel底层采用高性能的滑动窗口数据结构LeapArray来统计实时的秒级指标数据,可以很好地支撑写多于读的高并发场景
FlowSlot 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制
AuthoritySlot 则根据配置的黑白名单和调用来源信息,来做黑白名单控制
DegradeSlot 则通过统计信息以及预设的规则,来做熔断降级
SystemSlot 则通过系统的状态,例如 load1 等,来控制总的入口流量
Sentinel 将 ProcessorSlot 作为 SPI 接口进行扩展(1.7.2 版本以前 SlotChainBuilder 作为 SPI),使得 Slot Chain 具备了扩展的能力。您可以自行加入自定义的 slot 并编排 slot 间的顺序,从而可以给 Sentinel 添加自定义的功能。

1.6 Sentinel 架构¶

1.7 Sentinel 的构成¶
Sentinel 的构成可以分为两个部分:
核心库(Java 客户端):
开发人员通过JAVA调用,不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持(见 主流框架适配)
控制台(Dashboard):
可以由运维部署,Dashboard 主要负责管理推送规则、监控、管理机器信息等。
二、Sentinel 控制台¶
2.1 概述¶
Sentinel 提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。
Sentinel 控制台包含如下功能:
- 查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。
- 监控 (单机和集群聚合):通过 Sentinel 客户端暴露的监控 API,定期拉取并且聚合应用监控信息,最终可以实现秒级的实时监控。
- 流量控制
- 降级控制
- 规则管理和推送:统一管理推送规则。
- 鉴权:生产环境中鉴权非常重要。这里每个开发者需要根据自己的实际情况进行定制。
注意:Sentinel 控制台目前仅支持单机部署。Sentinel 控制台项目提供 Sentinel 功能全集示例,不作为开箱即用的生产环境控制台,若希望在生产环境使用请根据文档自行进行定制和改造。
2.2 部署和启动控制台(Dashboard)¶
安装方法说明
- 源码编译安装
- 二进制安装
- docker 启动
- docker compose 启动
2.2.1 Java 二进制启动控制台¶
下载最新版本的控制台 jar 包。
https://github.com/alibaba/Sentinel/releases https://github.com/alibaba/Sentinel/wiki/%E6%8E%A7%E5%88%B6%E5%8F%B0
您也可以从最新版本的源码自行构建 Sentinel 控制台:
下载控制台工程
https://github.com/alibaba/Sentinel/tree/master/sentinel/dashboard
使用以下命令将代码打包成一个 fat jar: mvn clean package
注意:启动 Sentinel 控制台需要 JDK 版本为 1.8 及以上版本。
Sentinel 控制台是一个标准的 Spring Boot 应用,以 Spring Boot 的方式运行 jar 包即可。
使用如下命令启动控制台:
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar
sentinel-dashboard.jar
其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080 。
APP 启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制台地址和端口
从 Sentinel 1.6.0 起,Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel。可以参考 鉴权模块文档 配置用户名和密码。
范例: Java 包启动控制台
#需要做主机名解析,否则可能会解析到互联网IP
[root@ubuntu2404 ~]#cat /etc/hosts
10.0.0.101 ubuntu2404.wang.org sentinel.wang.org
#安装JDK8或以上版本
[root@ubuntu2404 ~]#apt update && apt -y install openjdk-21-jdk openjdk-17-jdk openjdk-11-jdk openjdk-8-jdk
#指定Sentinel版本
[root@ubuntu2404 ~]#SENTINEL_VERSION=1.8.9
#下载官方
[root@ubuntu2404 ~]#wget https://github.com/alibaba/Sentinel/releases/download/${SENTINEL_VERSION}/sentinel-dashboard-${SENTINEL_VERSION}.jar
#下载加速镜像
[root@ubuntu2404 ~]#wget https://githubfast.com/alibaba/Sentinel/releases/download/${SENTINEL_VERSION}/sentinel-dashboard-${SENTINEL_VERSION}.jar
#启动Sentinel控制台
[root@ubuntu2404 ~]#java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-${SENTINEL_VERSION}.jar
#浏览器访问
http://sentinel.wang.org:8080
#默认账号密码:sentinel / sentinel

范例:二进制安装Sentinel dashboard脚本
#!/bin/bash
#支持在线和离线安装
#注意:从国内在线下载可能会失败,建议离线安装
SENTINEL_VERSION=1.8.6
#SENTINEL_VERSION=1.8.0
SENTINEL_FILE=sentinel-dashboard-${SENTINEL_VERSION}.jar
GITHUB_MIRROR=https://mirror.ghproxy.com/
SENTINEL_URL=${GITHUB_MIRROR}https://github.com/alibaba/Sentinel/releases/download/${SENTINEL_VERSION}/${SENTINEL_FILE}
INSTALL_DIR=/usr/local/sentinel
HOST=`hostname -I|awk '{print $1}'`
. /etc/os-release
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_jdk() {
java -version &>/dev/null && { color "JDK 已安装!" 1 ; return; }
if command -v yum &>/dev/null ; then
yum -y install java-1.8.0-openjdk-devel || { color "安装JDK失败!" 1; exit 1; }
elif command -v apt &>/dev/null ; then
apt update
apt install openjdk-8-jdk -y || { color "安装JDK失败!" 1; exit 1; }
else
color "不支持当前操作系统!" 1
exit 1
fi
java -version && { color "安装 JDK 完成!" 0 ; } || { color "安装JDK失败!" 1; exit 1; }
}
install_sentinel() {
mkdir -p ${INSTALL_DIR}/bin/
if [ -f ${SENTINEL_FILE} ] ;then
cp ${SENTINEL_FILE} ${INSTALL_DIR}
else
wget -P ${INSTALL_DIR} --no-check-certificate ${SENTINEL_URL} || { color "下载失败!" 1 ;exit 1; }
fi
cat > ${INSTALL_DIR}/bin/startup.sh <<EOF
#!/bin/bash
nohup java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar ${INSTALL_DIR}/sentinel-dashboard-${SENTINEL_VERSION}.jar &
EOF
chmod +x ${INSTALL_DIR}/bin/startup.sh
cat > /lib/systemd/system/sentinel.service <<EOF
[Unit]
Description=sentinel.service
After=network.target
[Service]
Type=forking
ExecStart=${INSTALL_DIR}/bin/startup.sh
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now sentinel.service
}
start_sentinel () {
systemctl is-active sentinel.service
if [ $? -eq 0 ] ;then
color "sentinel 安装成功!" 0
echo "-------------------------------------------------------------------"
echo -e "请访问链接: \E[32;1mhttp://$HOST:8080/\E[0m"
echo -e "用户/密码: \E[32;1msentinel/sentinel\E[0m"
else
color "sentinel 安装失败!" 1
exit 1
fi
}
install_jdk
install_sentinel
start_sentinel
2.2.2 Docker 启动¶
非官方镜像,更新缓慢
https://hub.docker.com/r/bladex/sentinel-dashboard


docker run --name sentinel -d -p 8858:8858 bladex/sentinel-dashboard:tagname#默认用户名和密码都是sentinel
范例:
[root@ubuntu2404 ~]#apt update && apt -y install docker.io
[root@ubuntu2404 ~]#docker pull bladex/sentinel-dashboard:latest
[root@ubuntu2404 ~]#docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bladex/sentinel-dashboard latest aa398704ebd3 3 years ago 147MB
#启动Sentinel-dashboard,注意:版本不同,端口不同
[root@ubuntu2404 ~]#docker run --name sentinel -d -p 8080:8080 -p 8719:8719 registry.cnbeijing.aliyuncs.com/wangxiaochun/sentinel-dashboard:1.8.8
[root@ubuntu2404 ~]#docker run --name sentinel -d -p 8080:8858 -p 8719:8719 registry.cnbeijing.aliyuncs.com/wangxiaochun/sentinel-dashboard:1.8.9
[root@ubuntu2404 ~]#docker run --name sentinel -d -p 8080:8858 -p 8719:8719 bladex/sentinel-dashboard
[root@ubuntu2404 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
812ece7071f2 bladex/sentinel-dashboard "java -Djava.securit…" 1 second ago Up 1 second 0.0.0.0:8719-
>8719/tcp, :::8719->8719/tcp, 0.0.0.0:8858->8858/tcp, :::8858->8858/tcp sentinel
#浏览器使用默认用户名和密码sentinel登录访问
http://sentinel.wang.org:8858



2.2.3 Docker Compose 启动¶
范例: docker-compose 部署 Sentinel dashboard
version: "3"
services:
sentinel:
image: bladex/sentinel-dashboard:latest
container_name: sentinel
restart: always
ports:
- 8858:8858
- 8719:8719
networks:
- sentinel-net
networks:
sentinel-net:
[root@ubuntu2404 sentinel]#docker-compose up -d
范例: docker-compose 部署Sentinel dashboard和 Nacos
version: "2"
services:
sentinel:
image: bladex/sentinel-dashboard:latest
container_name: sentinel
restart: always
networks:
macvlan100:
ipv4_address: 192.168.100.100
nacos:
image: nacos/nacos-server:v2.2.1-slim
container_name: nacos
restart: always
environment:
- PREFER_HOST_MODE=hostname
- MODE=standalone
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=192.168.100.102
- MYSQL_SERVICE_DB_NAME=nacos
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=nacos
- MYSQL_SERVICE_PASSWORD=nacos
- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true
- NACOS_AUTH_IDENTITY_KEY=2222
- NACOS_AUTH_IDENTITY_VALUE=2xxx
- NACOS_AUTH_TOKEN=SecretKey012345678901234567890123456789012345678901234567890123456789
depends_on:
- mysql
networks:
macvlan100:
ipv4_address: 192.168.100.101
mysql:
container_name: mysql
image: mysql:8
volumes:
- ./sql:/docker-entrypoint-initdb.d
restart: always
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=nacos
- MYSQL_USER=nacos
- MYSQL_PASSWORD=nacos
networks:
macvlan100:
ipv4_address: 192.168.100.102
networks:
macvlan100:
driver: macvlan
driver_opts:
parent: eth0
ipam:
driver: default
config:
- subnet: 192.168.100.0/24
ip_range: 192.168.100.0/24
gateway: 192.168.100.1
[root@ubuntu2404 sentinel-nacos]#docker-compose up -d
[root@ubuntu2404 ~]#docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
205177cd6e67 nacos/nacos-server:v221.1-slim "bin/docker-startup.…" 17 seconds ago Up 15 seconds nacos
322095462d5f bladex/sentinel-dashboard:latest "java -Djava.securit…" 17 seconds ago Up 16 seconds sentinel
7b67f782ba9a mysql:8 "docker-entrypoint.s…" 17 seconds ago Up 16 seconds mysql
三、JAVA客户端接入控制台¶
https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel https://sentinelguard.io/zh-cn/docs/quick-start.htm https://github.com/alibaba/Sentinel/tree/master/sentinel-demo 控制台启动后,JAVA应用的客户端需要按照以下步骤接入到控制台。
3.1 引入JAR包¶
查询JAVA依赖
https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel/2022.0.0.0
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2022.0.0.0</version>
</dependency>
<!-- 客户端与 Sentinel 控制台通信依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.6</version>
</dependency>
3.2 配置方式¶
参考启动配置项
http://sentinelguard.io/zh-cn/docs/startup-configuration.htm https://sentinelguard.io/zh-cn/docs/general-configuration.htm https://github.com/alibaba/spring-cloud-alibaba/wiki/Sentinel

Sentinel 提供如下的配置方式:
- JVM -D 参数方式
- properties 文件方式(1.7.0 版本开始支持)
其中,project.name 参数只能通过 JVM -D 参数方式配置(since 1.8.0 取消该限制),其它参数支持所有的配置方式。
优先级顺序:JVM -D 参数的优先级最高。若 properties 和 JVM 参数中有相同项的配置,以 JVM 参数配置的为准。
用户可以通过 -Dcsp.sentinel.config.file 参数配置 properties 文件的路径,支持 classpath 路径配置(如classpath:sentinel.properties )。默认 Sentinel 会尝试从 classpath:sentinel.properties 文件读取配置,读取编码默认为UTF-8。
注:1.7.0 以下版本可以通过旧的 ${user_home}/logs/csp/${project.name}.properties 配置文件进行配置(除 project.name和日志相关配置项)。
注:若您的应用为 Spring Boot 或 Spring Cloud 应用,您可以使用 Spring Cloud Alibaba,通过 Spring 配置文件来指定配置,详情请参考 Spring Cloud Alibaba Sentinel 文档。
配置项列表
sentinel-core 的配置项
基础配置项
| 名称 | 含义 | 类型 | 默认值 | 是否必需 | 备注 |
|---|---|---|---|---|---|
| project.name | 指定应用的名称 | String | null | 否 | |
| csp.sentinel.app.type | 指定应用的类型 | int | 0(APP_TYPE_COMMON) | 否 | 1.6.0引入 |
| csp.sentinel(metric.file.single.size | 单个监控日志文件的大小 | long | 52428800(50MB) | 否 | |
| csp.sentinel(metric.file.total.count | 监控日志文件的总数上限 | int | 6 | 否 | |
| csp.sentinel.statistics.max.rt | 最大的有效响应时长(ms),超出此值则按照此值记录 | int | 4900 | 否 | 1.4.1引入 |
| csp.sentinel spi.classloader | SPI加载时使用的ClassLoader,默认为给定类的ClassLoader | String | default | 否 | 若配置context:则使用thread context ClassLoader。1.7.0引入 |
其中 project.name 项用于指定应用名(appName)。若未指定,则默认解析 main 函数的类名作为应用名。实际项目使用中建议手动指定应用名。
日志相关配置项
| 名称 | 含义 | 类型 | 默认值 | 是否必需 | 备注 |
|---|---|---|---|---|---|
| csp.sentinel.log.dir | Sentinel日志文件目录 | String | ${user.home}/logs/csp/ | 否 | 1.3.0引入 |
| csp SENTinel.log.use.pid | 日志文件名中是否加入进程号,用于单机部署多个应用的情况 | boolean | false | 否 | 1.3.0引入 |
| csp SENTinel.log.output.type | Record日志输出的类型,file代表输出至文件,console代表输出至终端 | String | file | 否 | 1.6.2引入 |
注意:若需要在单台机器上运行相同服务的多个实例,则需要加入 -Dcsp.sentinel.log.use.pid=true 来保证不同实例日志的独立性。
sentinel-transport-common 的配置项
| 名称 | 含义 | 类型 | 默认值 | 是否必需 |
|---|---|---|---|---|
| csp.sentineldashboard.server | 控制台的地址,指定控制台后客户端会自动向该地址发送心跳包。地址格式为:hostIp:port | String | null | 是 |
| csp.sentinel.heartbeat.interval.ms | 心跳包发送周期,单位毫秒 | Long | null | 非必需,若不进行配置,则会从相应的 Heartbeatsender中提取默认值 |
| csp.sentinel api.port | 本地启动 HTTP API Server 的端口号 | int | 8719 | 否 |
| csp SENTinel.heartbeat.client.ip | 指定心跳包中本机的 IP | String | - | 若不指定则通过HostNameUtil解析;该配置项多用于多网卡环境 |
注:csp.sentinel.api.port 可不提供,默认为 8719,若端口冲突会自动向下探测可用的端口。
主要配置
启动时加入 JVM 参数 -Dcsp.sentinel.dashboard.server=consoleIp:port 指定控制台地址和端口。若启动多个应用,则需要通过 -Dcsp.sentinel.api.port=xxxx 指定客户端监控 API 的端口(默认是 8719)。
除了修改 JVM 参数,也可以通过配置文件取得同样的效果。
范例:
[root@ubuntu2404 sentinel-sample]#java -Dserver.port=8080 -
Dcsp.sentinel.dashboard.server=sentinel.wang.org:8080 -Dproject.name=sentinel-sample -jar target/sentinelsample-0.0.1-SNAPSHOT.jar
[root@ubuntu2404 ~]#ss -ntlp |grep java
LISTEN 0 100 *:8719 *:* users:(("java",pid=6121,fd=11))
LISTEN 0 100 *:8080 *:* users:(("java",pid=6121,fd=15))
3.3 触发客户端初始化¶
确保客户端有访问量,Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包。
注意:您还需要根据您的应用类型和接入方式引入对应的 适配依赖,否则即使有访问量也不能被 Sentinel 统计。
https://sentinelguardiolozh-cn/docs/open-source-framework-integrations.htm1

3.4 查看机器列表以及健康情况¶
当您在机器列表中看到您的机器,就代表着您已经成功接入控制台;如果没有看到您的机器,请检查配置,并通过
${user.home}/logs/csp/sentinel-record.log.xxx 日志来排查原因,详细的部分请参考 日志文档。

注意:若接入 Sentinel 控制台不成功,可以参考 FAQ 排查问题。
注意:请确保在使用较新版本的浏览器,我们不保证支持旧版本的浏览器。
范例: 在应用主机上查看日志
[root@ubuntu2404 ~]#tree logs/
logs/
└── csp
├── command-center.log.2023-11-28.0
├── command-center.log.2023-11-28.0.lck
├── sentinel-record.log.2023-11-28.0
├── sentinel-record.log.2023-11-28.0.lck
├── sentinel-sample-metrics.log.2023-11-28
└── sentinel-sample-metrics.log.2023-11-28.idx
1 directory, 6 files
[root@ubuntu2404 ~]#tail -f logs/csp/sentinel-record.log.2023-11-28.0
2023-11-28 16:29:43.104 INFO [ParamFlowRuleManager] Parameter flow rules received: {}
2023-11-28 16:29:43.106 INFO [DegradeRuleManager] Degrade rules loaded: {}
2023-11-28 16:29:43.106 WARNING No SPI configuration file, filename=META-INF/services/com.alibaba.csp.sentinel.metric.extension.MetricExtension, classloader=org.springframework.boot.loader.LaunchedURLClassLoader@4f3f5b24
2023-11-28 16:29:43.107 INFO [MetricExtensionProvider] No existing MetricExtension found
2023-11-28 16:29:43.127 INFO Add child <sayHello> to node </hello/{name}>
2023-11-28 16:29:44.308 INFO [MetricWriter] New metric file created: /root/logs/csp/sentinel-sample-metrics.log.2023-11-28
2023-11-28 16:29:44.308 INFO [MetricWriter] New metric index file created: /root/logs/csp/sentinel-sample-metrics.log.2023-11-28.idx
2023-11-28 16:30:34.825 INFO Receiving rule change (type: flow): [{"clusterConfig":{"acquireRefuseStrategy":0,"clientOfflineTime":2000,"fallbackToLocalWhenFail":true,"resourceTimeout":2000,"resourceTimeoutStrategy":0,"sampleCount":10,"strategy":0,"thresholdType":0,"windowIntervalMs":1000},"clusterMode":false,"controlBehavior":0,"count":1.0,"grade":1,"limitApp":"default","maxQueueingTimeMs":500,"resource":"/hello/{name}","strategy":0,"warmUpPeriodSec":10}]
2023-11-28 16:30:34.844 INFO [DynamicSentinelProperty] Config will be updated to: [FlowRule{resource=/hello/{name}, limitApp=default, grade=1, count=1.0, strategy=0, refResource=null, controlBehavior=0, warmUpPeriodSec=10, maxQueueingTimeMs=500, clusterMode=false, clusterConfig=ClusterFlowConfig{flowId=null, thresholdType=0, fallbackToLocalWhenFail=true, strategy=0, sampleCount=10, windowIntervalMs=1000, resourceTimeout=2000, resourceTimeoutStrategy=0, acquireRefuseStrategy=0, clientOfflineTime=2000}, controller=null}]
2023-11-28 16:30:34.845 INFO [FlowRuleManager] Flow rules received: {/hello/{name}=[FlowRule{resource=/hello/{name}, limitApp=default, grade=1, count=1.0, strategy=0, refResource=null, controlBehavior=0, warmUpPeriodSec=10, maxQueueingTimeMs=500, clusterMode=false, clusterConfig=ClusterFlowConfig{flowId=null, thresholdType=0, fallbackToLocalWhenFail=true, strategy=0, sampleCount=10, windowIntervalMs=1000, resourceTimeout=2000, resourceTimeoutStrategy=0, acquireRefuseStrategy=0, clientOfflineTime=2000}, controller=com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController@af532d2}]}
[root@ubuntu2404 ~]#tail -f logs/csp/sentinel-sample-metrics.log.2023-11-28
1701160183000|2023-11-28 16:29:43|sayHello|1|0|1|0|1|0|0|0
1701160183000|2023-11-28 16:29:43|/hello/{name}|1|0|1|0|59|0|0|1
1701160183000|2023-11-28 16:29:43|__total_inbound_traffic__|1|0|1|0|59|0|0|0
1701160310000|2023-11-28 16:31:50|sayHello|1|0|1|0|1|0|0|0
1701160310000|2023-11-28 16:31:50|/hello/{name}|1|0|1|0|3|0|0|1
1701160310000|2023-11-28 16:31:50|__total_inbound_traffic__|1|0|1|0|3|0|0|0
1701160311000|2023-11-28 16:31:51|/hello/{name}|0|1|0|0|0|0|0|1
1701160311000|2023-11-28 16:31:51|__total_inbound_traffic__|0|1|0|0|0|0|0|0
3.4.1 5.3.5. 监控¶
3.4.2 "簇点链路"中显示刚刚调用的资源(单机实时)¶
簇点链路(单机调用链路)页面实时的去拉取指定客户端资源的运行情况。它一共提供两种展示模式:一种用树状结构展示资源的调用链路,另外一种则不区分调用链路展示资源的运行情况。
注意: 簇点监控是内存态的信息,它仅展示启动后调用过的资源。
树状链路

平铺链路

3.4.3 "实时监控"汇总资源信息(集群聚合)¶
同时,同一个服务下的所有机器的簇点信息会被汇总,并且秒级地展示在"实时监控"下。
注意: 实时监控仅存储 5 分钟以内的数据,如果需要持久化,需要通过调用实时监控接口来定制。

注意:请确保 Sentinel 控制台所在的机器时间与自己应用的机器时间保持一致,否则会导致拉不到实时的监控数据。