我是靠谱客的博主 负责小鸭子,最近开发中收集的这篇文章主要介绍HM-SpringCloud微服务系列8.2.1【流量控制】1. 簇点链路2. 快速入门3. 流控模式,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

雪崩问题虽然有四种方案,但是限流是避免服务因突发的流量而发生故障,是对微服务雪崩问题的预防。我们先学习这种模式。

1. 簇点链路

  1. 当请求进入微服务时,首先会访问DispatcherServlet,然后进入Controller、Service、Mapper,这样的一个调用链就叫做簇点链路。簇点链路中被监控的每一个接口就是一个资源
  2. 默认情况下sentinel会监控SpringMVC的每一个端点(Endpoint,也就是controller中的方法),因此SpringMVC的每一个端点(Endpoint)就是调用链路中的一个资源。
  3. 例如,我们刚才访问的order-service中的OrderController中的端点:/order/{orderId}image
  4. 流控、熔断等都是针对簇点链路中的资源来设置的,因此我们可以点击对应资源后面的按钮来设置规则:
    • 流控:流量控制
    • 降级:降级熔断
    • 热点:热点参数限流,是限流的一种
    • 授权:请求的权限控制

2. 快速入门

2.1 示例

image

2.2 Jmeter安装与快速入门

2.2.1 Jmeter安装与配置

Jmeter依赖于JDK,所以必须确保当前计算机上已经安装了JDK,并且配置了环境变量
可以Apache Jmeter官网下载,地址:http://jmeter.apache.org/download_jmeter.cgiimage
双击bin目录下的jmeter.bat即可运行,但是有两点注意

  • 启动速度比较慢,要耐心等待
  • 启动后黑窗口不能关闭,否则Jmeter也跟着关闭了

imageimageimage
默认Jmeter的语言是英文,需要设置为中文image
注意:上面的配置只能保证本次运行是中文,如果要永久中文,需要修改Jmeter的配置文件
打开jmeter文件夹,在bin目录中找到 jmeter.properties,添加下面配置:language=zh_CNimage
注意:前面不要出现#,#代表注释,另外这里是下划线,不是中划线imageimage

2.2.2 Jmeter基本用法

在测试计划上点鼠标右键,选择添加 > 线程(用户) > 线程组:image
在新增的线程组中,填写线程信息:image
给线程组点鼠标右键,添加http取样器:image
编写取样器内容:image
添加监听报告:image
添加监听结果树:image
汇总报告结果:image
结果树:image

2.3 练习

imageimageimageimage
通过Jmeter工具进行测试imageimage
20个用户,2秒内运行完,QPS是10,超过了5.
选中流控入门,QPS<5右键启动:image
注意:不要点击菜单中的执行按钮来运行。image
结果:成功的请求每次只有5个imageimageimageimage
被Sentinel阻塞(限流)image

3. 流控模式

imageimageimage
在添加限流规则时,点击高级选项,可以选择三种流控模式

  • 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
  • 关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
  • 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
    快速入门测试的就是直接模式。

3.1 关联模式

3.1.1 关联模式

关联模式:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流使用场景:比如用户支付时需要修改订单状态,同时用户要查询订单。查询和修改操作会争抢数据库锁,产生竞争。业务需求是优先支付和更新订单的业务,因此当修改订单业务触发阈值时,需要对查询订单业务限流。配置规则image语法说明:当/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 "更新订单成功";
}

image
重启服务,查看sentinel控制台的簇点链路:image
可以看到重启后数据空了,需要重新访问才能激活imageimageimage

3)配置流控规则
对哪个端点限流,就点击哪个端点后面的按钮。我们是对订单查询/order/query限流,因此点击它后面的按钮:image
在表单中填写流控规则:imageimage

4)在Jmeter测试
选择《流控模式-关联》:image
可以看到1000个用户,100秒,因此QPS为10,超过了我们设定的阈值:5
查看http请求地址:image
《流控模式-关联》右键启动,查看结果image
请求的目标是/order/update,这样这个断点就会触发阈值。
但限流的目标是/order/query,我们在浏览器访问,可以发现:image
确实被限流了。

3.1.3 小结

image

3.2 链路模式

imageimage

3.2.1 添加查询商品方法

在order-service服务中,给OrderService类添加一个queryGoods方法:

public void queryGoods(){
    System.err.println("查询商品");
}

image

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 "新增订单成功";
}

image

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的簇点链路规则中,出现了新的资源:


imageimageimageimageimageimageimage

3.2.5 添加流控规则

点击goods资源后面的流控按钮,在弹出的表单中填写下面信息:imageimage
只统计从/order/query进入/goods的资源,QPS阈值为2,超出则被限流。

3.2.6 Jmeter测试

选择《流控模式-链路》:image
可以看到这里200个用户,50秒内发完,QPS为4,超过了我们设定的阈值2
《流控模式-链路》右键启动
一个http请求是访问/order/save:image
运行的结果:image
完全不受影响。


另一个http请求是访问/order/query:image
运行结果:image
每次只有2个通过。

最后

以上就是负责小鸭子为你收集整理的HM-SpringCloud微服务系列8.2.1【流量控制】1. 簇点链路2. 快速入门3. 流控模式的全部内容,希望文章能够帮你解决HM-SpringCloud微服务系列8.2.1【流量控制】1. 簇点链路2. 快速入门3. 流控模式所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部