Sentinel
1、sentinel基本概念
1.1、资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。
只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源。
1.2、规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
1.3、Sentinel 组成
核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器
2、sentinel的基本功能
2.1、流量控制
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状,如下图所示:
流量控制有以下几个角度:
资源的调用关系,例如资源的调用链路,资源和资源之间的关系;
运行指标,例如 QPS、线程池、系统负载等;
控制的效果,例如直接限流、冷启动、排队等。
2.2、熔断降级
什么是熔断降级
除了流量控制以外,降低调用链路中的不稳定资源也是 Sentinel 的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。
3、控制台安装
3.1、控制台简介以及操作指南
控制台简介以及安装启动:https://github.com/alibaba/Sentinel/wiki/控制台
3.2、控制台下载安装
控制台下载地址:https://github.com/alibaba/Sentinel/releases,其中包含jar包、源码下载。
源码构建:使用 maven 命令 mvn clean package
构建 Sentinel 源码
3.3、控制台启动及参数
启动控制台:java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
其中 -Dserver.port=8080 用于指定 Sentinel 控制台端口为 8080。Sentinel 控制台引入基本的登录功能,默认用户名和密码都是 sentinel
控制台其他可配置参数
jar 包启动命令(云服务器需要放开端口号,window cmd 换行可以使用 ^)
java -Dserver.port=28080\
-Dcsp.sentinel.dashboard.server=localhost:28080\
-Dproject.name=sentinel-dashboard\
-Dauth.enabled=true\
-Dsentinel.dashboard.auth.username=sentinel\
-Dsentinel.dashboard.auth.password=123456\
-Dserver.servlet.session.timeout=7200\
-jar sentinel-dashboard-1.8.4.jar
访问:http://127.0.0.1:28080/ ⭐ 用户名:密码 🌙 sentinel:123456
4、项目集成 sentinel
4.1、依赖配置
引入相关依赖:SpringBoot、SpringCloudAlibaba、SpringCloudAlibaba-Sentinel
pom中引入sentinel的依赖和springboot的web模块
<!--sentinel相关依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!--springbootweb模块相关-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
4.2、配置文件中配置sentinel控制台地址信息
server:
port: 9000
servlet:
context-path:
spring:
application:
name: user-demo
cloud:
sentinel:
transport:
dashboard: localhost:8080 # 控制台地址
port: 9000 # 启动该服务,会在应用程序的相应服务器上启动HTTP Server,并且该服务器将与Sentinel dashboard进行交互
#这个端口是自己项目服务器所要开放的端口,不然会出现sentinel控制台上显示有服务注册进来,
#这里是配置的一个开始端口号,每一个服务都需要使用一个端口号来和sentinel控制台进行交互,
#如果当前配置的端口号被占用以后会在该端口号基础上自动加1进行连接,如果还是被占用则继续加1进行连接,直到连接成功位置。
4.3、配置流控、熔断、热点、授权
在簇点链路中可以看到我们刚刚进行调用的接口,在这里可以给这个接口进行配置:流控、熔断、热点、授权
4.3.1、流控
这里为给大家展示效果就简单配置了一个流控规则:资源名就是我们被调用的接口路径,阈值类型选择了QPS,阈值为1。这里还需根据实际项目的QPS大小来决定阈值具体为多少,也可根据并发线程数来进行选择;
配置好流控规则后,我们再次调用接口可发现流控规则已经生效了:
4.3.2、熔断
熔断这里给大家介绍以下几种熔断策略吧,由于是demo展示,demo没有部署成集群的形式,接口只是一个简单查询,不容易出现慢调用的情况。
慢调用比例
慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
异常比例
异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒请求量 >= N(可配置),并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
异常数
异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。
4.3.3、授权
授权相对来说就比较好理解了,这里指调用方的ip,如果是多个ip的话可以用英文的逗号隔开。
4.3.4、热点
热点配置,也就是请求中的热点参数进行限流,当设定限流的参数达到阈值时,执行限流;
先来准备一个带参数的API
可以看到我们给getAllUser接口,添加了SentinelResource注解,再次调用该接口,可以看到sentinel控制台中会增加一个资源。
接下来就是要给这个名为hot的资源配置热点规则:参数索引就是getAllUser这个接口入参的索引,0指第一个参数,1指第二个参数等。
当我们多次调用该接口时,超过该参数配置的阈值就会报错:
5、sentinel+nacos持久化流控规则
Sentinel 是面向分布式服务架构的高可用流量防护组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。但是sentinel 无法持久化流量防控的规则,当项目重新启动的时候就要重新配置相关的流控规则了,接下来带大家看一下sentinel结合nacos如何持久化流控规则。
5.1、修改配置文件
在sentinel下面增加sentinel的datasource相关配置;
spring:
application:
name: user-demo
cloud:
sentinel:
transport:
dashboard: localhost:8080 # 控制台地址
port: 9000 # 启动该服务,会在应用程序的相应服务器上启动HTTP Server,并且该服务器将与Sentinel dashboard进行交互
#这个端口是自己项目服务器所要开放的端口,不然会出现sentinel控制台上显示有服务注册进来,
#这里是配置的一个开始端口号,每一个服务都需要使用一个端口号来和sentinel控制台进行交互,
#如果当前配置的端口号被占用以后会在该端口号基础上自动加1进行连接,如果还是被占用则继续加1进行连接,直到连接成功位置。
datasource:
# 流控规则
flow:
nacos:
server-addr: localhost:8848
namespace: sentinel-test
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-sentinel-flow-rules
# 规则类型:flow、degrade、param-flow、system、authority
data-type: json
rule-type: flow
# 熔断降级
degrade:
nacos:
server-addr: localhost:8848
namespace: sentinel-test
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-sentinel-degrade-rules
rule-type: degrade
# 热点规则
param-flow:
nacos:
server-addr: localhost:8848
namespace: sentinel-test
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-sentinel-param-flow-rules
rule-type: param-flow
# 系统规则
system:
nacos:
server-addr: localhost:8848
namespace: sentinel-test
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-sentinel-system-rules
rule-type: system
# 授权规则
authority:
nacos:
server-addr: localhost:8848
namespace: sentinel-test
group-id: DEFAULT_GROUP
data-id: ${spring.application.name}-sentinel-authority-rules
rule-type: authority
5.2、修改sentinel配置
如果是下载的sentinel的源码的话我们可以直接打开项目修改配置信息:
# ...省略其他配置
nacos.server-addr=localhost:8848
nacos.namespace=sentinel-test
nacos.group=DEFAULT_GROUP
如果是直接下载的jar包,可以在启动jar的时候通过命令来指定这些配置信息: nohup java -Dnacos.server-addr=localhost:8848 -Dnacos.namespace=sentinel-test -Dnacos.group=DEFAULT_GROUP -jar sentinel-dashboard-1.8.4.jar
- 感谢你赐予我前进的力量