目录
1.官网及相关介绍:
介绍 · alibaba/Sentinel Wiki · GitHub
流控、服务熔断、服务降级等名词解释:
(1)流控:即流量控制,根据流量、并发线程数、响应时间等指标,把随机到来的流量调整成合适的形状,即流量塑性,保证系统在流量突增情况下的可用性,避免系统被瞬时的流量高峰冲垮,一旦达到阈值则进行拒绝服务、排队等降级操作。
(2)熔断:当下游服务发生一定数量的失败后,打开熔断器,后续请求就快速失败。一段时间过后再判断下游服务是否已恢复正常,从而决定是否重置熔断器。
(3)降级:当访问量剧增、服务出现异常或者非核心服务影响到核心流程时,暂时牺牲掉一些东西,以保障整个系统的平稳运行。
2.sentinel的下载和运行
下载地址:Releases · alibaba/Sentinel · GitHub
只需下载jar即可,然后运行,打开cmd,输入java -jar + 文件名字,回车即可运行成功
默认端口号为8080,输入http://localhost:8080即可进入sentinel管理界面,账户密码初始都为sentinel
3.Sentinel的流量监控
项目部署可以参考113_Sentinel初始化监控_哔哩哔哩_bilibili
提前做好服务注册工作,并创建cloudalibaba-sentinel-service8401微服务,采用五步法,
- 建module
- 改pom
- yml
- 主启动
- 业务类
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos服务中心地地址
sentinel:
transport:
dashboard: localhost:8080 #sentinel dashboard地址
port: 8719 #默认端口,如果被占用会自动加1
management:
endpoints:
web:
exposure:
include: '*'
编写测试Controller,发送get请求,查看监控效果
@RestController
public class FlowController {
@GetMapping("/testA")
public String testA(){
return "----testA";
}
@GetMapping("/testB")
public String testB(){
return "----testB";
}
}
然后刷新sentinel控制台,会发现成功监控到8401微服务
4.sentinel的流控规则
进入sentinel控制台,点击流控规则,新增流控规则
阈值类型
我们为testA新增流控规则,选择QPS为1,即每秒钟只允许一次请求,如果多次,则会反馈提示。进入簇点链路,找到/testA,添加流控,设置为1.
然后访问testA,当我们一秒一次请求时,正常访问,而如果快速点击,达到了阈值,则会反馈默认的提示 。
对线程数进行流控,将其设置为1,意思是一次只能处理一个线程,如果我们没有为testA添加处理时间,则狂点刷新,仍然不会出现限流,因为每个进程来了之后直接就处理了,没有达到阈值;而当我们为testA添加处理时间后,例如一个请求的处理时间为1s,如果testA访问,需要1s的处理时间,并且这时间内只能为他一个线程进行服务,而如果其他线程进来,则会直接反馈限流效果。
流控模式 :
1.快速失败(默认),当达到流控规则时,新的请求就会被立即拒绝。
2.预热(Warm Up),即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。
3.排队等待,阙值必须设置为QPS,会严格控制请求通过的间隔时间,也即是让请求以均匀的速度通过,对应的是漏桶算法 。
关联流控:
有两个资源,资源A和资源B,当与A关联的资源B达到阈值后,就限流A自己。
5.熔断降级
一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。
熔断策略
Sentinel 提供以下几种熔断策略:
- 慢调用比例 (
SLOW_REQUEST_RATIO
):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。 - 异常比例 (
ERROR_RATIO
):当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0, 1.0]
,代表 0% - 100%。 - 异常数 (
ERROR_COUNT
):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
RT: (官网已更新,目前用的仍然是1.7版本的Sentinel)
6.热点参数限流:
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:
- 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
例子:
我们为请求添加两个参数,分别是p1和p2,并设置热点参数限流规则。
当我们访问时,只要带有参数p1(第0个位置),访问达到了阈值,就会触发限流,走blockHandler方法。而如果没有带有参数p1,则不会限流。
参数例外项:当p1是某个特定值时,他的限流条件可以例外设置,如当他例外项设置为5,此时的阈值为200,则遵循这个限流规则,而其他值(如1,2,3)时,仍然走阈值为1的规则。
@SentinelResource注解
fallback和blockHandler: