概述
雪崩问题虽然有四种方案,但是限流是避免服务因突发的流量而发生故障,是对微服务雪崩问题的预防。我们先学习这种模式。
1. 簇点链路
- 当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的一个调用链就叫做簇点链路。簇点链路中被监控的每一个接口就是一个资源。
- 默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint,也就是controller中的方法),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。
- 例如,我们刚才访问的order-service中的OrderController中的端点:/order/{orderId}
- 流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:
- 流控:流量控制
- 降级:降级熔断
- 热点:热点参数限流,是限流的一种
- 授权:请求的权限控制
2. 快速入门
2.1 示例
2.2 Jmeter安装与快速入门
2.2.1 Jmeter安装与配置
Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量
可以Apache Jmeter官网下载,地址:http://jmeter.apache.org/download_jmeter.cgi
双击bin目录下的jmeter.bat即可运行,但是有两点注意
- 启动速度比较慢,要耐心等待
- 启动后黑窗口不能关闭,否则Jmeter也跟着关闭了
默认Jmeter的语言是英文,需要设置为中文
注意:上面的配置只能保证本次运行是中文,如果要永久中文,需要修改Jmeter的配置文件
打开jmeter文件夹,在bin目录中找到 jmeter.properties,添加下面配置:language=zh_CN
注意:前面不要出现#,#代表注释,另外这里是下划线,不是中划线
2.2.2 Jmeter基本用法
在测试计划上点鼠标右键,选择添加 > 线程(用户) > 线程组:
在新增的线程组中,填写线程信息:
给线程组点鼠标右键,添加http取样器:
编写取样器内容:
添加监听报告:
添加监听结果树:
汇总报告结果:
结果树:
2.3 练习
通过Jmeter工具进行测试
20个用户,2秒内运行完,QPS是10,超过了5.
选中流控入门,QPS<5
右键启动:
注意:不要点击菜单中的执行按钮来运行。
结果:成功的请求每次只有5个
被Sentinel阻塞(限流)
3. 流控模式
在添加限流规则时,点击高级选项,可以选择三种流控模式:
- 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
- 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
- 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
快速入门测试的就是直接模式。
3.1 关联模式
3.1.1 关联模式
关联模式:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。配置规则:语法说明:当/write资源访问量触发阈值时,就会对/read资源限流,避免影响/write资源。
3.1.2 案例
需求说明:
- 在OrderController新建两个端点:/order/query和/order/update,无需实现业务
- 配置流控规则,当/order/ update资源被访问的QPS超过5时,对/order/query请求限流
具体实现
1)定义/order/query端点,模拟订单查询
@GetMapping("/query")
public String queryOrder() {
return "查询订单成功";
}
2)定义/order/update端点,模拟订单更新
@GetMapping("/update")
public String updateOrder() {
return "更新订单成功";
}
重启服务,查看sentinel控制台的簇点链路:
可以看到重启后数据空了,需要重新访问才能激活
3)配置流控规则
对哪个端点限流,就点击哪个端点后面的按钮。我们是对订单查询/order/query限流,因此点击它后面的按钮:
在表单中填写流控规则:
4)在Jmeter测试
选择《流控模式-关联》:
可以看到1000个用户,100秒,因此QPS为10,超过了我们设定的阈值:5
查看http请求地址:
《流控模式-关联》右键启动,查看结果
请求的目标是/order/update,这样这个断点就会触发阈值。
但限流的目标是/order/query,我们在浏览器访问,可以发现:
确实被限流了。
3.1.3 小结
3.2 链路模式
3.2.1 添加查询商品方法
在order-service服务中,给OrderService类添加一个queryGoods方法:
public void queryGoods(){
System.err.println("查询商品");
}
3.2.2 查询订单时,查询商品
在order-service的OrderController中,修改/order/query端点的业务逻辑:
@GetMapping("/query")
public String queryOrder() {
// 查询商品
orderService.queryGoods();
// 查询订单
System.out.println("查询订单");
return "查询订单成功";
}
3.2.3 新增订单,查询商品
在order-service的OrderController中,新增/order/save端点,模拟新增订单:
@GetMapping("/save")
public String saveOrder() {
// 查询商品
orderService.queryGoods();
// 查询订单
System.err.println("新增订单");
return "新增订单成功";
}
3.2.4 给查询商品添加资源标记
默认情况下,OrderService中的方法是不被Sentinel监控的,需要我们自己通过注解来标记要监控的方法。
给OrderService的queryGoods方法添加@SentinelResource注解:
@SentinelResource("goods")
public void queryGoods(){
System.err.println("查询商品");
}
链路模式中,是对不同来源的两个链路做监控。但是sentinel默认会给进入SpringMVC的所有请求设置同一个root资源,会导致链路模式失效。
我们需要关闭这种对SpringMVC的资源聚合,修改order-service服务的application.yml文件:
spring:
cloud:
sentinel:
web-context-unify: false # 关闭context整合
重启服务,访问/order/query和/order/save,可以查看到sentinel的簇点链路规则中,出现了新的资源:
3.2.5 添加流控规则
点击goods资源后面的流控按钮,在弹出的表单中填写下面信息:
只统计从/order/query进入/goods的资源,QPS阈值为2,超出则被限流。
3.2.6 Jmeter测试
选择《流控模式-链路》:
可以看到这里200个用户,50秒内发完,QPS为4,超过了我们设定的阈值2
《流控模式-链路》右键启动
一个http请求是访问/order/save:
运行的结果:
完全不受影响。
另一个http请求是访问/order/query:
运行结果:
每次只有2个通过。
最后
以上就是负责小鸭子为你收集整理的HM-SpringCloud微服务系列8.2.1【流量控制】1. 簇点链路2. 快速入门3. 流控模式的全部内容,希望文章能够帮你解决HM-SpringCloud微服务系列8.2.1【流量控制】1. 簇点链路2. 快速入门3. 流控模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复