Sentinel
1、Sentinel简介
Sentinel是面向分布式服务框架的轻量级流量控制框架,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来维护系统的稳定性
2、Sentinel基本概念
-
资源
资源是sentinel的关键概念,它可以是Java应用程序中的任何内容,例如由应用程序提供的服务,或由应用程序调用其他应用提供的服务,甚至可以是一段代码。
-
规则
围绕资源的实时状态设定的规则,可以包括流量控制规则,熔断降级规则,以及系统保护规则,所有规则都可以动态实时调整。
-
流量控制
流量控制在网络传输中是一个常用的概念,它用于调整网络包的发送数据。
流量控制有内下几个角度:
1。 资源的调用关系,例如资源的调用链路、资源和资源之间的关系
2。 运行指标,例如QPS、线程池、系统负载等
3。 控制的效果,例如直接限流、冷启动、排队
-
熔断降级
Sentinel 和 Hystrix 的原则一致,当调用链路中某个资源出现不稳定,例如timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其他资源。
在限制的手段上,Sentinel和Hystrix采取了完全不一样的方法:
-
Hystrix通过线程池的方式,来对依赖(对应Sentinel中的资源)进行隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本,还需要预先给各个资源做线程池大小的分配。
-
Sentinel有两种方式
1。通过并发线程数进行限制
Sentinel通过限制资源并发线程的数量,来减少不稳定资源对其他资源的影响。这样不但没有线程切换的损耗,也不需要预先分配线程池大小。当某个资源出现不稳定的情况下,例如相应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接受请求。
2。通过响应时间对资源进行降级
除了对并发线程数进行控制以外,Sentinel还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对资源的访问都会被直接拒绝,直接过了指定的时间之后才重新恢复。
-
系统负载保护
Sentinel同时对系统的维度提供保护,防止雪崩。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其他机器上去。如果这个时候其它机器也处于一个边缘状态,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。
3、集成Springboot/SpringCloud
-
启动Sentinel
-
启动jar包
java -jar sentinel-dashboard-1.8.0.jar
-
指定参数启动
java -Dserver.port=9000 -Dcsp.sentinel.dashboard.server=localhost:9000 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar #或者 java -jar sentinel-dashboard-1.8.0.jar --server.port=9000
-
浏览器访问
http://localhost:9000
默认账号密码都是 sentinel
-
-
SpringCloud微服务接入
-
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
-
yml配置
spring:
cloud:
sentinel:
transport:
# Sentinel 控制台地址
dashboard: localhost:9000
# 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
# client-ip:
# 取消Sentinel控制台懒加载
# 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
# 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
eager: true
filter:
# 配置启用拦截器
enabled: true
# 配置拦截器路径
url-patterns: /**
-
启动服务
服务启动成功之后,刷新sentinel控制台,即可在控制台中看到对应服务
-
配置限流规则
测试接口:/system/user/page
未限流之前可以一直点击请求
新建规则:
现在限制每秒QPS为1(每秒钟只能请求一次)
再次请求:
可以看到请求频率每秒超过一次时会直接显示失败(此时请求并未到达服务接口)
-
Gateway接入
-
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
-
修改yml配置文件(同上)
spring:
cloud:
sentinel:
transport:
# Sentinel 控制台地址
dashboard: localhost:9000
# 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
# client-ip:
# 取消Sentinel控制台懒加载
# 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
# 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
eager: true
filter:
# 配置启用拦截器
enabled: true
# 配置拦截器路径
url-patterns: /**
-
启动网关
启动成功后刷新Sentinel控制台可以看到网关接入成功
-
根据网关配置的routeId配置限流规则
网关接入与普通微服务接入的区别在于:可以根据网关服务里配置的routeId来配置限流规则
例如:zboot-system这个服务在网关中配置的routeId就是zboot-system
,所以这里可以这样配置:
这样是对zboot-system整个服务的资源进行限流保护。
-
集成Nacos完成持久化配置
一旦我们重启应用,sentinel规则消失,所以需要将配置规则进行持久化
-
添加依赖
<!-- Sentinel Datasource Nacos -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
-
修改yml配置文件
spring:
cloud:
sentinel:
transport:
# Sentinel 控制台地址
dashboard: localhost:9000
# 如果有多套网络,又无法正确获取本机IP,则需要使用下面的参数设置当前机器可被外部访问的IP地址,供admin控制台使用
# client-ip:
# 取消Sentinel控制台懒加载
# 默认情况下 Sentinel 会在客户端首次调用的时候进行初始化,开始向控制台发送心跳包
# 配置 sentinel.eager=true 时,取消Sentinel控制台懒加载功能
eager: true
filter:
# 配置启用拦截器
enabled: true
# 配置拦截器路径
url-patterns: /**
# nacos配置持久化
datasource:
ds1: #这个名字是自定义的随便写
nacos:
server-addr: ${spring.cloud.nacos.discovery.server-addr} # nacos地址
dataId: system-sentinel.json #nacos中的dataId
groupId: SENTINEL_CONFIG #nacos中的groupId
data-type: json #文件类型
rule-type: flow
-
nacos中添加配置文件
根据yml中配置的 dataId与groupId 创建对应的配置文件
配置内容:
[
{
"resource": "/system/user/page",
"count": 1,
"grade": 1,
"limitApp": "default",
"strategy": 0,
"controlBehavior": 0
}
]
配置规则详解:
- resource:资源名称
- limitApp:来源应用
- grade:阀值类型,0:线程数,1:QPS
- count:单机阀值
- strategy:流控模式,0:直接,1:关联,2:链路
- controlBehavior:流控效果,0:快速失败,1:warmUp,2:排队等待
- clusterMode:是否集群 true/false
-
重启服务
nacos配置成功后,重启system服务,可以直接在sentinel控制台看到与nacos中配置对应的流控规则
-
动态更新
只要在nacos中修改配置,对应的流控规则就会同步更新