前言
参考资料:
《Spring Microservices in Action》
《Spring Cloud Alibaba 微服务原理与实战》
《B站 尚硅谷 SpringCloud 框架开发教程 周阳》
《Sentinel GitHub 官网》
《Sentinel 官网》
Sentinel 是面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、服务降级、系统负载保护等多个维度来帮助我们保障微服务的稳定性;
1. Sentinel 基础知识
1.1 Sentinel 的特性
- 丰富的应用场景:几乎涵盖所有的应用场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制等;
- 实时监控:开发者可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群汇总运行情况;
- 开源生态支持:Sentine提供开箱即用的与其他开源框架/库的整合,例如与Spring Cloud、Dubbo、gRPC的整合;
- SPI 扩展点支持:提供了 SPI 扩展点支持,开发者可以通过扩展点来定制化限流规则,动态数据源适配等需求;
1.2 Sentinel 的组成
- 分两部分:
- 核心库(Java 客户端):不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo、Spring Cloud 等框架也有较好的支持;
- 控制台(Dashboard):亦称 Sentinel 服务器。基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器;
1.3 Sentinel 控制台上的 9 个功能
功能 | 说明 |
---|---|
实时监控 | 实时监控每个资源名(接口、请求路径)的通过 QPS、拒绝 QPS 和响应时间; |
簇点链路 | 通过树状视图和列表视图展示接口调用的关系以及通过 QPS、拒绝 QPS、并发数、平均 RT、分钟通过和拒绝等信息; |
流控规则 | 又称:流量控制(flow control)。其原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性; |
熔断规则 | 对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩; |
热点规则 | 又称:热点参数限流规则。热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制; |
系统规则 | 系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性; |
授权规则 | 根据调用来源来判断该次请求是否允许放行; |
集群流控 | 集群流控可以解决流量不均匀导致总体限流效果不佳的问题; |
机器列表 | 收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线; |
1.4 Sentinel 工作原理
-
Sentinel 的核心分为三部分:工作流程、数据结构和限流算法;
-
调用链路是 Sentinel 的工作主流程,由各个 Slot 插槽组成,将不同的 Slot 按照顺序串在一起(责任链模式),从而将不同的功能(限流、降级、系统保护)组合在一起;
-
Sentinel 中各个 Slot 承担了不同的职责,如:LogSlot 负责记录日志、StatisticSlot 负责统计指标数据、FlowSlot 负责限流等。这是一种职责分离的设计,每个模块更聚焦于实现某个功能;
-
在 Sentinel 中,所有的资源都对应一个资源名称(resourceName),每次访问该资源都会创建一个 Entry 对象,在创建 Entry 的同时,会创建一系列功能槽(Slot Chain),这些槽会组成一个责任链,每个槽负责不同的职责;
Slot 插槽 | 说明 |
---|---|
NodeSelectorSlot | 负责收集资源的调用路径,以树状结构存储调用栈,用于根据调用路径来限流降级; |
ClusterBuilderSlot | 负责创建以资源名维度统计的 ClusterNode ,以及创建每个 ClusterNode 下按调用来源 origin 划分的 StatisticNode; |
LogSlot | 在出现限流、熔断、系统保护时负责记录日志; |
AuthoritySlot | 权限控制,支持黑名单和白名单两种策略; |
SystemSlot | 控制总的入口流量,限制条件依次是总 QPS、总线程数、RT 阈值、操作系统当前 load1、操作系统当前 CPU 利用率; |
FlowSlot | 根据限流规则和各个Node中的统计数据进行限流判断; |
DegradeSlot | 根据熔断规则和各个Node中的统计数据进行服务降级; |
StatisticSlot | 统计不同维度的请求数、通过数、限流数、线程数等 runtime 信息,这些数据存储在 DefaultNode、OriginNode 和 ClusterNode 中; |
1.5 Sentinel 源码分析
- 由于篇幅有限,该内容放在以下文章:
- 详情请见:微服务架构 | 5.4 Sentinel 流控、统计和熔断的源码分析
2. 安装并运行 Sentinel 控制台
Sentinel 与 Nacos 类似,有两种安装方式:使用已经编译好的安装包和源码部署;由于要对 Sentinel 源码进行分析,这里推荐源码部署;
这里选择的版本是 1.8.3;
2.1 安装包安装 Sentinel 控制台
2.1.1 下载 Sentinel
- 从官网下载 Sentinel:https://github.com/alibaba/Sentinel/releases;
2.1.2 使用命令启动 Sentinel 控制台
- 运行前要满足两个条件:有 java8 环境、8080 端口不能被占用;
- win10 解决端口占用用以下三个命令即可(用管理员打开 cmd):
- 查看所有端口:
netstat -ano
或者指定查看 8080 端口占用情况netstat -aon|findstr 8080
; - 根据进程查找应用程序:
tasklist|findstr {上面查到的进程 PID}
; - 关闭进程:
taskkill /f /t /im {上面查到的应用程序}
;
- 到下载的 jar 包下启动 cmd 窗口,运行下面命令:
java -jar sentinel-dashboard-1.8.3.jar
;- 如果不想杀掉 8080 程序可以之地端口号运行:
java -Dserver.port=7777 -Dcsp.sentinel.dashboard.server=localhost:7777 -jar sentinel-dashboard-1.8.3.jar
;- -Dserver.port:指定 Sentinel 控制台的访问端口,默认是 8080;
- -Dcsp.sentinel.dashboard.server:指定 Sentinel Dashboard 控制台的 IP 地址和端口,这里进行设置的目的是把自己的限流数据暴露到监控平台;
- -Dproject.name:设置项目名称;
2.1.3 访问 Sentinel 控制台
- 发送请求:http://localhost:8080;
- 1.6.0 版本后引入登录功能,默认登录账号密