嘉鱼网站建设前十,磁力珠,2345的网址,wordpress提取某个分类文章文章目录 前言一、快速掌握 Sentinel 的使用1.1 什么是簇点链路1.2 Sentinel 的简单使用示例 二、Sentinel 流控模式2.1 直接模式2.2 关联模式2.3 链路模式 三、流控效果3.1 快速失败3.2 预热模式3.3 排队等待 四、对热点参数的流控4.1 热点规则4.2 热点规则演示 前言
微服务架… 文章目录 前言一、快速掌握 Sentinel 的使用1.1 什么是簇点链路1.2 Sentinel 的简单使用示例 二、Sentinel 流控模式2.1 直接模式2.2 关联模式2.3 链路模式 三、流控效果3.1 快速失败3.2 预热模式3.3 排队等待 四、对热点参数的流控4.1 热点规则4.2 热点规则演示 前言
微服务架构的流行使得在分布式系统中保障稳定性变得尤为关键。在前文中已经讨论了微服务中可能出现的雪崩问题以及相应的解决方案。作为确保系统可用性的关键工具之一Sentinel 应运而生它是一款功能强大的流量控制组件为开发人员提供了多种方式来管理和保护微服务。
在本文中我将深入探讨 Sentinel 的核心功能包括流控模式、流控效果和对热点资源的限流策略。深入了解这些概念并通过示例演示如何在 Spring Cloud 项目中使用 Sentinel以便更好地应对各种流量控制和限流需求。
一、快速掌握 Sentinel 的使用
1.1 什么是簇点链路
在学习 Sentinel 的使用之前我们有必要首先了解一下簇点链路。所谓的簇点链路就是项目内的调用链路链路中被监控的每个接口就是一个资源。默认情况下 Sentinel 会监控 Spring MVC 的每一个端点Endpoint因此 SpringMVC 的每一个端点Endpoint就是调用链路中的一个资源。
流控、熔断等都是针对簇点链路中的资源来设置的因此我们可以点击对应资源后面的按钮来设置规则 1.2 Sentinel 的简单使用示例
现在我们需要对 /order/{orderId} 这个路径进行限流要求它的 QPS 每秒不能超过 5设置步骤如下
在簇点链路中在指定的链路下点击添加流控规则 设置流控规则QPS 不超过 5 新增之后可以在流控规则中查看这条新增的规则
使用 Jmeter 进行测试 设置线程属性
设置了20个线程线程的启动时间是 2s此时的 QPS 是10。
配置 HTTP 请求 在这个 HTTP 请求中访问的资源是 /order/101。
启动 JMeter 进行测试
通过结果树可以发现连续请求成功的请求数不会超过5。
二、Sentinel 流控模式
Sentinel 是一款功能强大的流量控制组件它支持多种流控模式以帮助开发人员更好地管理和保护微服务。下面将介绍 Sentinel 的三种主要流控模式直接模式、关联模式和链路模式。
在使用 Sentinel 添加限流规则时点击高级选项可以选择三种流控模式
直接统计当前资源的请求触发阈值时对当前资源直接限流也是默认的模式关联统计与当前资源相关的另一个资源触发阈值时对当前资源限流链路统计从指定链路访问到本资源的请求触发阈值时对指定链路限流 2.1 直接模式
直接模式是 Sentinel 最基本的流控模式它通过对资源的访问频率进行限制来控制流量。在直接模式下可以为每个资源配置允许的 QPS每秒查询率限制。如果某个资源的实际流量超过了配置的限制Sentinel 将拒绝或降级该资源的访问请求。
这种模式适用于需要对某个具体资源进行流控的场景例如 API 接口、微服务等。通过配置直接模式您可以保护关键资源免受过多请求的干扰确保系统的稳定性和可用性。
上文中 Sentinel 的简单使用示例就是直接模式它是对order/{orderId} 这个具体的请求资源进行限流。
2.2 关联模式
关联模式是 Sentinel 提供的一种更为灵活的流控模式。在关联模式中可以定义多个资源之间的关联关系然后基于这些关联关系来控制流量。这使得可以更好地适应多资源之间的复杂交互。
简单来说关联模式的作用是统计与当前资源相关的另一个资源当触发资源访问的阈值时对当前资源限流。
关联模式的使用场景
比如用户支付时需要修改订单状态同时用户要查询订单。查询和修改操作会争抢数据库锁产生竞争。业务需求是有限支付和更新订单的业务因此当修改订单业务触发阈值时需要对查询订单业务限流。
例如下面在 order-service 中新增两个接口query 表示查询订单update 表示更新订单
GetMapping(/query)
public String queryOrder(){return 查询订单成功!;
}GetMapping(/update)public String updateOrder(){return 更新订单成功!;}下面通过关联模式设置对 query 接口的限流
此时将 query 和 update 两个接口进行关联当 update 资源被访问的 QPS 超过 5 时就会对 query 接口进行限流。
使用 JMeter 测试
设置线程数此时 QPS 为 10 设置 HTTP 请求 启动 JMeter 进行测试 此时发送可以正常处理 update接口的请求但是此时我们通过浏览器访问query 接口发现该接口被 Sentinel 限流了 这就是关联模式通过上面的例子可以得出结论
满足下面条件可以使用关联模式
两个有竞争关系的资源一个优先级较高一个优先级较低。
2.3 链路模式
链路模式只针对从指定链路访问到本资源的请求做统计判断是否超过阈值。
例如有两条请求链路test1 和 test2从它们都可以服务到 commom 资源
/test1 - /common/test2 - /common
如果只希望统计从/test2进入到/common的请求则可以使用链路模式进行配置
现在有一个需求有查询订单和创建订单业务两者都需要查询商品。针对从查询订单进入到查询商品的请求统计并设置限流。设置的步骤如下 在OrderService中添加一个queryGoods方法不用实现业务 SentinelResource(goods) // Sentinel 标记除 Controller 以外的方法
public void queryGoods(){System.err.println(查询商品);
}注意在默认情况下Sentinel 只会监视 Controller 中的端点方法如果要监视其他方法可以使用 SentinelResource 注解。 另外Sentinel 默认会将 Controller 方法做 context 整合导致链路模式的流控失效需要修改application.yml添加如下配置 spring:cloud:sentinel:web-context-unify: false # 关闭 Context 上下文整合在OrderController中改造/order/query端点调用OrderService中的queryGoods方法 GetMapping(/query)
public String queryOrder(){// 查询商品orderService.queryGoods();// 查询订单System.out.println(查询订单);return 查询订单成功!;
}在OrderController中添加一个/order/save的端点调用OrderService的queryGoods方法 GetMapping(/save)
public String saveOrder(){// 查询商品orderService.queryGoods();// 新增订单System.out.println(新增订单);return 新增订单成功!;
}给queryGoods设置限流规则从/order/query进入queryGoods的方法限制QPS不能超过2 使用 JMeter 进行测试 设置线程QPS 为 4 设置 HTTP 请求 分别设置了对 query 和 save 两个接口的 HTTP 请求。 启动 JMeter 可以发现对 query 接口进行限流了 而对 save 接口没有限流
三、流控效果
在 Sentinel 中流控效果是指当请求达到流控阈值时应该采取的措施。Sentinel 提供了多种流控效果包括快速失败、预热模式以及排队等待。每种效果都适用于不同的使用场景可以根据具体需求选择合适的流控效果。
快速失败 达到阈值后新的请求会被立即拒绝并抛出 FlowException 异常。通过前文的演示可以发现是默认的处理方式。预热模式 对超出阈值的请求同样是拒绝并抛出异常。但这种模式阈值会动态变化从一个较小值逐渐增加到最大阈值。排队等待 让所有的请求按照先后次序排队执行两个请求的间隔不能小于指定时长
这些模式可以在 Sentinel 控制台的高级选项中进行设置下面分别是对这些流控效果的演示。
3.1 快速失败
快速失败 是 Sentinel 的默认流控效果。当请求达到流控阈值时新的请求会被立即拒绝并抛出 FlowException 异常。这意味着请求将立即失败不会继续执行后续逻辑。这种效果适用于对系统资源有明确限制的场景帮助尽早识别并拒绝过多请求以避免系统超负荷运行。
使用快速失败效果可以保护系统免受过多请求的干扰确保系统的稳定性和可用性。
3.2 预热模式
预热模式 也被称为 “warm up” 模式。在预热模式下超出流控阈值的请求同样会被拒绝并抛出异常但不同的是流控阈值在一段时间内会逐渐增加到最大阈值。
预热模式是应对服务冷启动的一种方案。请求阈值初始值是 threshold / coldFactor持续指定时长后逐渐提高到threshold值。而coldFactor的默认值是3。
例如设置QPS的threshold为10预热时间为 5 秒那么初始阈值就是 10 / 3 也就是 3然后在 5 秒后从 3 逐渐增长到 10。 现在有一个需求就是给/order/{orderId}这个资源设置限流最大 QPS 为 10利用 warm up 效果预热时长为 5 秒步骤如下
1. 新增流控规则 2. 使用 JMeter 进行测试
设置 QPS 为10 设置 HTTP 请求 启动 JMeter 查看 Sentinel 控制台实时监控 可以发现QPS 的值最近增大拒绝的请求数量也逐渐减少。
3.3 排队等待
排队等待 流控效果允许所有的请求按照先后次序排队执行保证请求之间的间隔不小于指定的时长。这意味着请求会进入队列等待处理直到轮到请求执行。如果请求无法立即执行它们将排队等待。
排队等待效果适用于需要有序执行请求的场景例如需要按照请求的到达顺序处理的业务或者要求请求间保持固定的时间间隔的场景。
例如QPS 5意味着每 200ms 处理一个队列中的请求timeout 2000意味着预期等待超过 2000ms 的请求会被拒绝并抛出异常。 现在有一个需求给/order/{orderId}这个资源设置限流最大 QPS 为10利用排队的流控效果超时时长设置为 5s步骤如下
1. 添加限流规则 2. 使用 JMeter 进行测试
设置 QPS 为 15
设置 HTTP 请求 启动 JMeter查看 Sentinel 的实时监控 可以发现在排队等待流控模式下请求会有序排队执行这有助于削峰平谷。这种模式对于高并发场景和需要请求按照到达顺序处理的业务非常有用。通过将请求按照时间间隔排队执行系统可以更好地应对流量的突发增加降低系统的压力从而提高系统的稳定性和可用性。
四、对热点参数的流控
4.1 热点规则
前文的限流都是统计访问某个资源的所有请求判断是否超过 QPS 阈值。而热点参数限流是分别统计参数值相同的请求判断是否超过QPS阈值。
例如下图所示访问同样一个链路但是这个链路中 id 为 1 的资源访问的次数比其他资源多那么说明该资源是热点资源就可以将该资源的 QPS 设置的大一些 在 Sentinel 控制台中可以发现有一个热点规则通过这个规则就可以对热点资源进行流控设置例如 代表的含义是对hot这个资源的 0 号参数第一个参数做统计每 1 秒相同参数值的请求数不能超过 5。
另外在热点参数限流的高级选项中可以对部分参数设置例外配置 结合上一个配置这里的含义是对 0 号的 long 类型参数限流每 1 秒相同参数的QPS不能超过 5有两个例外
如果参数值是 100则每 1 秒允许的QPS为 10如果参数值是 101则每 1 秒允许的QPS为 15。
4.2 热点规则演示
现在有一个需求就是给 /order/{orderId} 这个资源添加热点参数限流规则如下
默认的热点参数规则是每 1 秒请求量不超过 2给 102 这个参数设置例外每 1 秒请求量不超过 4给 103 这个参数设置例外每1秒请求量不超过 10
1. 添加热点规则
热点参数限流对默认的 SpringMVC 资源无效因此需要使用 SentinelResource() 注解指定热点资源名称 2. 使用 JMeter 进行测试
设置QPS 为 5 设置 HTTP 请求 这里分别设置了对 ID 为 101、102、103 三个不同资源的HTTP请求对应了上述设置的规则的不同情况。
启动 JMeter
对于 ID 为 101 资源的结果树发现每秒只能通过 2 个请求
对于 ID 为 102 资源的结果树发现每秒只能通过 4 个请求
对于 ID 为 103 资源的结果树发现每秒 5 个请求都通过了