一、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 扩展点。您可以通过实现扩展点,快速的定制逻辑。例如定制规则管理、适配数据源等。

image

1.3 Sentinel 基本概念

资源

资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。

只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。

资源在java中的资源一般是接口方法。通常就是一个URL,比如:/hello/get

规则

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。

1.4 Sentinel 功能和设计理念

https://sentinelguard.io/zh-cn/docs/introduction.html image

流量控制

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

image

流量控制有以下几个角度:

资源的调用关系,例如资源的调用链路,资源和资源之间的关系;

运行指标,例如 QPS、线程池、系统负载等;

控制的效果,例如直接限流、冷启动、排队等。

Sentinel 的设计理念是让您自由选择控制的角度,并进行灵活组合,从而达到想要的效果。

熔断降级

除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。

当调用链路中某个资源出现不稳定,例如,表现为 timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它的资源而导致产生雪崩的效果。

当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出DegradeException)。当访问系统失败超过一定的次数后,对该接口进行熔断的操作。

image

熔断降级设计理念

在限制的手段上,Sentinel 和 Hystrix 采取了完全不一样的方法。

Hystrix 通过线程池的方式,来对依赖(在我们的概念中对应资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本,还需要预先给各个资源做线程池大小的分配。

Sentinel 对这个问题采取了两种手段:

通过并发线程数进行限制

和资源池隔离的方法不同,Sentinel 通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。

通过响应时间对资源进行降级

除了对并发线程数进行控制以外,Sentinel 还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。

系统负载保护

Sentinel 同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。

针对此情况,Sentinel 提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。

1.5 Sentinel 工作主流程

总体的框架如下:

image

在 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 添加自定义的功能。

image

1.6 Sentinel 架构

image

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

image

范例:二进制安装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

image

image

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

image

image

image

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

image-20260407094116779

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 image

3.4 查看机器列表以及健康情况

当您在机器列表中看到您的机器,就代表着您已经成功接入控制台;如果没有看到您的机器,请检查配置,并通过

${user.home}/logs/csp/sentinel-record.log.xxx 日志来排查原因,详细的部分请参考 日志文档。

image-20260407094410721

注意:若接入 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 "簇点链路"中显示刚刚调用的资源(单机实时)

簇点链路(单机调用链路)页面实时的去拉取指定客户端资源的运行情况。它一共提供两种展示模式:一种用树状结构展示资源的调用链路,另外一种则不区分调用链路展示资源的运行情况。

注意: 簇点监控是内存态的信息,它仅展示启动后调用过的资源。

树状链路

image

平铺链路

image

3.4.3 "实时监控"汇总资源信息(集群聚合)

同时,同一个服务下的所有机器的簇点信息会被汇总,并且秒级地展示在"实时监控"下。

注意: 实时监控仅存储 5 分钟以内的数据,如果需要持久化,需要通过调用实时监控接口来定制。

image-20260407094654144

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