Sentinel 流控模式及流控效果的设置

312 阅读6分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

1-5、流控模式

在流控规则设置的高级选项中有流控模式,分别为:直接、关联、链路三个

1-5-1、直接

上面举例测试的都为直接方式,也是默认的。也就是设置当前的接口的流控规则,资源调用达到设置的阈值后直接被流控抛出异常

image.png

1-5-2、关联

当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢

举例来说:当商城进行促销的时候,大量用户会下订单,也有用户查询订单。在服务器资源无法满足的情况下,我们只能二选一,让下单服务优先使用服务器资源,这样就可以使用流控模式为:关联

1-5-2-1、首先创建两个服务

image.png

1-5-2-2、设置关联流控规则

设置流控规则的时候,一定要先访问一下接口,这样在簇点链路里面才能看到接口 image.png

给order/get设置流控规则,这个地方需要注意的是,上面的接口是被流控的接口,下面是触发的接口和设置的流控阈值。

image.png

1-5-2-3、测试

因为手动无法模拟每秒三个QPS,因此需要使用一下压测工具,我这使用的是jmeter。

1、设置jmeter线程组,设置300个请求,在50s内运行完毕,这样每秒平均6个就可以触发流控规则了。 image.png

2、设置http请求,将addnew接口信息填入

image.png

3、查看运行结果树,通过结果数,可以查看调用结果 image.png

4、点击运行,运行之后就可以看到结果树的数据了 image.png

image.png

5、流控结果,在jmeter压测order/addnew的时候,然后浏览访问order/get,就会发现已经被流控,这样就可以将非必要服务进行控制,将更多的资源给核心服务。 image.png

1-5-3、链路

根据调用链路入口限流。

下面中记录了资源之间的调用链路,这些资源通过调用关系,相互之间构成一棵调用树。这棵树的根节点是一个名字为 getUserName 的虚拟节点,调用链的入口都是这个虚节点的子节点。

一棵典型的调用树如下图所示:

image.png

上图中来自入口/order/test1和order/test2的请求都调佣了getUserName,如果getUserName只允许/order/test2无线访问,但是对order/test1有限访问,就需要用到sentinel的链路流控模式

1-5-3-1、首先创建被调用的服务

sentinel控制台通过访问接口来监控服务,而当前的服务非接口,无法被监控到。因此需要给服务添加@SentinelResource注解,否则sentinel无法监测到这个服务。同时也需要实现BlockException,上面设置的全局BlockException是无法使用的。 image.png

1-5-3-2、创建接口调用方法

创建入口服务,都调用getUserName服务。 image.png

1-5-3-3、配置yml支持链路限流

从1.6.3 版本开始,Sentinel Web filter默认收敛所有URL的入口context,因此链路限流不生效。

1.7.0 版本开始(对应SCA的2.1.1.RELEASE),官方在CommonFilter 引入了

WEB_CONTEXT_UNIFY 参数,用于控制是否收敛context。将其配置为 false 即可根据不同的URL 进行链路限流。

SCA 2.1.1.RELEASE之后的版本,可以通过配置spring.cloud.sentinel.web-context-unify=false即可关闭收敛

spring.cloud.sentinel.web-context-unify: false

image.png

1-5-3-4、配置链路限流

服务重启之后,还需要对order/test1和order/test2访问一下,否则簇点链路无法监控到服务,如下就可以看到两个入口下的getUserName服务。

如果不给getUserName添加@SentinelResource注解,这个地方就不会显示

image.png

点击getUserName下的流控(test1/test2的都可以)

image.png

通过以上设置就可以完成对test1的QPS流控

1-5-3-5、测试

频繁访问order/test1就会触发流控 image.png

1-6、流控效果

流控效果下有三种方案分别是:快速失败、Warm Up(激增流量)、排队等待。默认使用的是快速失败效果 image.png

1-6-1、快速失败

(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的流量控制方式,当QPS超过任意规则的阈值后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位时。

1-6-2、Warm Up(一般用于激增流量)

Warm Up(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动方式。当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮。

冷加载因子: codeFactor 默认是3,即请求 QPS 从 threshold / 3 开始,经预热时长逐渐升至设定的 QPS 阈值。

1-6-2-1、设置流控规则

设置Warm Up流控规则 image.png

1-6-2-2、使用jmeter设置并发

总线程3000,60s内运行完毕,每秒50个线程 image.png

1-6-2-3、查看监控数据

image.png

1-6-3、排队等待(一般用于脉冲流量)

1-6-3-1、使用jmeter模拟脉冲流量

如下图、流量请求一次、然后暂停5s,然后再次请求,再暂停5s。这样就形成了脉冲流量。 image.png

1-6-3-2、设置排队等待

每秒进来10个QPS,其中5个可以正常通过,另外5个就让其排队,等待5s;这样在脉冲低谷的时候,排队的QPS就可以正常通过。 image.png

1-6-3-3、测试查看监控

如下、通过设置排队,并且jmeter请求未改变的情况下,所有请求的QPS就都可以正常通过了,并且通过监控观察,还有低谷期,这样就还可以提高并发的线程数量。 image.png

1-6-3-4、修改并发线程测试

jmeter由每秒10线程改为20个线程,可以发现所有的QPS全部还是成功,只是低谷期不想之前那么空闲了。 image.png