设为首页 加入收藏

TOP

Sentinel入门到实操 (限流熔断降级)(三)
2023-07-26 08:16:09 】 浏览:142
Tags:Sentinel

在表单中填写流控规则:

image

4)在Jmeter测试

选择《流控模式-关联》:

image

可以看到1000个用户,100秒,因此QPS为10,超过了我们设定的阈值:5

查看http请求:

image

请求的目标是/order/update,这样这个断点就会触发阈值。

但限流的目标是/order/query,我们在浏览器访问,可以发现:确实被限流了。

image

2.3链路模式

链路模式:只针对从指定链路访问到本资源的请求做统计,判断是否超过阈值。

配置示例

例如有两条请求链路:

  • /test1 --> /common
  • /test2 --> /common

test1和test2是接口,common一般是方法。判断从这个接口访问这个方法的单机阈值是否到达QPS,超过则限制

如果只希望统计从/test2进入到/common的请求,则可以这样配置:

image

举例:

需求:有查询订单和创建订单业务,两者都需要查询商品。针对从查询订单进入到查询商品的请求统计,并设置限流。

步骤:

  1. 在OrderService中添加一个queryGoods方法,不用实现业务

  2. 在OrderController中,改造/order/query端点,调用OrderService中的queryGoods方法

  3. 在OrderController中添加一个/order/save的端点,调用OrderService的queryGoods方法

  4. 给queryGoods设置限流规则,从/order/query进入queryGoods的方法限制QPS必须小于2

实现:

1)添加查询商品方法

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

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

2)查询订单时,查询商品

在order-service的OrderController中,修改/order/query端点的业务逻辑:

@GetMapping("/query")
public String queryOrder() {
    // 查询商品
    orderService.queryGoods();
    // 查询订单
    System.out.println("查询订单");
    return "查询订单成功";
}

3)新增订单,查询商品

在order-service的OrderController中,修改/order/save端点,模拟新增订单:

@GetMapping("/save")
public String saveOrder() {
    // 查询商品
    orderService.queryGoods();
    // 查询订单
    System.err.println("新增订单");
    return "新增订单成功";
}

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

image

5)添加流控规则

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

image

6)Jmeter测试

选择《流控模式-链路》:

image

可以看到这里200个用户,50秒内发完,QPS为4,超过了我们设定的阈值2

一个http请求是访问/order/save:

image

运行的结果:完全不受影响。

image

另一个是访问/order/query:

image

运行结果:每次只有2个通过。

image

3. 流控效果

  • 快速失败:QPS超过阈值时,拒绝新的请求

  • warm up: QPS超过阈值时,拒绝新的请求;QPS阈值是逐渐提升的,可以避免冷启动时高并发导致服务宕机。

  • 排队等待:请求会进入队列,按照阈值允许的时间间隔依次执行请求;如果请求预期等待时长大于超时时间,直接拒绝

在流控的高级选项中,还有一个流控效果选项:

image

流控效果是指请求达到流控阈值时应该采取的措施,包括三种:

  • 快速失败:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。

  • warm up:预热模式,对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化,从一个较小值逐渐增加到最大阈值。

  • 排队等待(匀速器):让所有的请求按照先后次序排队执行,两个请求的间隔不能小于指定时长

    匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效

3.1 快速失败

达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。

3.2 warm up

阈值一般是一个微服务能承担的最大QPS,但是一个服务刚刚启动时,一切资源尚未初始化(冷启动),如果直接将QPS跑到最大值,可能导致服务瞬间宕机。

warm up也叫预热模式,是应对服务冷启动的一种方案。请求阈值初始值是 maxThreshold / coldFactor,持续指定时长后,逐渐提高到maxThreshold值。而coldFactor的默认值是3

例如,我设置QPS的maxThreshold为10,预热时间为5秒,那么初始阈值就是 10 / 3 ,也就是3,然后在5秒后逐渐增长到10.

image

举例:

需求:给/order/{orderId}这个资源设置限流,最大QPS为10,利用warm up效果,预热时长为5秒

1)配置流控规则:

image

2)Jmeter测试

选择《流控效果,warm up》:

image

QPS为10.

刚刚启动时,大部分请求失败,成功的只有3个,说明QPS被限定在3:

image

随着时间推移,成功比例越来越高:

image

到Sentinel控制台查看实时监控:

image

一段时间后:

image

3.3 排队等待

当请求超过QPS阈值时,快速失败和warm up 会拒绝新的请求并抛出异常。

而排队等待则是让所有请求进入一个队列中,然后按照阈值允许的时间间隔依次执行。后来的请求必须等待前面执行完成,如果请求预期的等待时间超出最大时长,则会被拒绝。

工作原理

例如:QPS = 5,意味着每200ms处理一个队列中的请

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 3/7/7
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【Spring】Bean装配类注解 下一篇二维数组的定义方式有几种

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目