携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情
1-5、流控模式
在流控规则设置的高级选项中有流控模式,分别为:直接、关联、链路三个
1-5-1、直接
上面举例测试的都为直接方式,也是默认的。也就是设置当前的接口的流控规则,资源调用达到设置的阈值后直接被流控抛出异常
1-5-2、关联
当两个资源之间具有资源争抢或者依赖关系的时候,这两个资源便具有了关联。比如对数据库同一个字段的读操作和写操作存在争抢,读的速度过高会影响写得速度,写的速度过高会影响读的速度。如果放任读写操作争抢资源,则争抢本身带来的开销会降低整体的吞吐量。可使用关联限流来避免具有关联关系的资源之间过度的争抢
举例来说:当商城进行促销的时候,大量用户会下订单,也有用户查询订单。在服务器资源无法满足的情况下,我们只能二选一,让下单服务优先使用服务器资源,这样就可以使用流控模式为:关联
1-5-2-1、首先创建两个服务
1-5-2-2、设置关联流控规则
设置流控规则的时候,一定要先访问一下接口,这样在簇点链路里面才能看到接口
给order/get设置流控规则,这个地方需要注意的是,上面的接口是被流控的接口,下面是触发的接口和设置的流控阈值。
1-5-2-3、测试
因为手动无法模拟每秒三个QPS,因此需要使用一下压测工具,我这使用的是jmeter。
1、设置jmeter线程组,设置300个请求,在50s内运行完毕,这样每秒平均6个就可以触发流控规则了。
2、设置http请求,将addnew接口信息填入
3、查看运行结果树,通过结果数,可以查看调用结果
4、点击运行,运行之后就可以看到结果树的数据了
5、流控结果,在jmeter压测order/addnew的时候,然后浏览访问order/get,就会发现已经被流控,这样就可以将非必要服务进行控制,将更多的资源给核心服务。
1-5-3、链路
根据调用链路入口限流。
下面中记录了资源之间的调用链路,这些资源通过调用关系,相互之间构成一棵调用树。这棵树的根节点是一个名字为 getUserName 的虚拟节点,调用链的入口都是这个虚节点的子节点。
一棵典型的调用树如下图所示:
上图中来自入口/order/test1和order/test2的请求都调佣了getUserName,如果getUserName只允许/order/test2无线访问,但是对order/test1有限访问,就需要用到sentinel的链路流控模式
1-5-3-1、首先创建被调用的服务
sentinel控制台通过访问接口来监控服务,而当前的服务非接口,无法被监控到。因此需要给服务添加@SentinelResource
注解,否则sentinel无法监测到这个服务。同时也需要实现BlockException,上面设置的全局BlockException是无法使用的。
1-5-3-2、创建接口调用方法
创建入口服务,都调用getUserName服务。
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
1-5-3-4、配置链路限流
服务重启之后,还需要对order/test1和order/test2访问一下,否则簇点链路无法监控到服务,如下就可以看到两个入口下的getUserName服务。
如果不给getUserName添加@SentinelResource
注解,这个地方就不会显示
点击getUserName下的流控(test1/test2的都可以)
通过以上设置就可以完成对test1的QPS流控
1-5-3-5、测试
频繁访问order/test1就会触发流控
1-6、流控效果
流控效果下有三种方案分别是:快速失败、Warm Up(激增流量)、排队等待。默认使用的是快速失败效果
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流控规则
1-6-2-2、使用jmeter设置并发
总线程3000,60s内运行完毕,每秒50个线程
1-6-2-3、查看监控数据
1-6-3、排队等待(一般用于脉冲流量)
1-6-3-1、使用jmeter模拟脉冲流量
如下图、流量请求一次、然后暂停5s,然后再次请求,再暂停5s。这样就形成了脉冲流量。
1-6-3-2、设置排队等待
每秒进来10个QPS,其中5个可以正常通过,另外5个就让其排队,等待5s;这样在脉冲低谷的时候,排队的QPS就可以正常通过。
1-6-3-3、测试查看监控
如下、通过设置排队,并且jmeter请求未改变的情况下,所有请求的QPS就都可以正常通过了,并且通过监控观察,还有低谷期,这样就还可以提高并发的线程数量。
1-6-3-4、修改并发线程测试
jmeter由每秒10线程改为20个线程,可以发现所有的QPS全部还是成功,只是低谷期不想之前那么空闲了。