18 | Sentinel 实战:如何实施流量整形与限流策略?
运行 Sentinel 控制台
- 深入了解
- 翻译
- 解释
- 总结
文章介绍了如何在实际项目中使用Sentinel组件实施流量整形与限流策略。作者首先详细介绍了搭建Sentinel控制台,并将微服务接入到Sentinel控制台中。然后,作者针对三种流控模式进行了详细讲解,并演示了如何在控制台上为微服务添加流控规则。此外,还介绍了如何对调用源进行限流,需要对Sentinel源代码做一些改造。整体而言,通过实战项目的方式,帮助读者了解了Sentinel的核心功能和使用方法,使读者能够清楚如何用流控手段来降低高并发场景下的系统压力。同时,还介绍了Sentinel支持的三种流控效果,包括快速失败、预热和排队等待。文章还提到了基于热点规则的限流以及将流控规则应用到特定来源的服务的方法。下节课将继续介绍Sentinel的另一个常用的稳定性保障手段:降级熔断规则。
《Spring Cloud 微服务项目实战》,新⼈⾸单¥59
全部留言(16)
- 最新
- 精选
- 海布里王力宏“第二种流控效果 Warm Up 则实现了“预热模式的流控效果”,这种方式可以平缓拉高系统水位,避免突发流量对当前处于低水位的系统的可用性造成破坏。举个例子,如果我们设置的系统阈值是 QPS=10,预热时间 =5,那么 Sentinel 会在这 5 秒的预热时间内,将限流阈值从 3 缓慢拉高到 10。为什么起始阈值是 3 呢?因为 Sentinel 内部有一个冷加载因子,它的值是 3,在预热模式下,起始阈值的计算公式是单机阈值 / 冷加载因子,也就是 10/3=3。我截了一张图,你可以参考一下,看看 Warm Up 配置项是如何填写的。” 新年快乐,对预热还是不理解,如果设置了预热,是不是意味着QPS达到阈值的时候,会降为1/3的QPS,然后再拉升。还是这个预热只是针对系统的启动阶段?
作者回复: 同学理解的没错,预热其实就是给系统一段慢慢热身的时间段,不过发生阶段并非是在系统启动的时候,而是在系统长期处于低水位运行下突然接到大并发访问量的时候。
2022-02-054 - 扶幽老师请教下,在warm-up的模式下,阈值在不断的攀升过程中,其它超过当前时间节点的请求是通过快速失败的方式被拒绝了吗?还是进入队列了呢?
作者回复: 可以fast-fail也可以等待一段时间,这个是可以配置的。但一般在实践中绝大部分场景下我们还是采用简单粗暴的fast fail更多一些
2023-06-11归属地:湖北1 - wake配置应该是: spring: cloud: sentinel: transport: # sentinel api端口,默认8719 port: 8719 # dashboard地址 dashboard: localhost:8080
作者回复: 多谢同学提醒,copy的时候删错了一行
2022-01-2121 - Dean老师好,想咨询一下熔断限流的阈值如何确定具体的值,是拍脑袋想的吗?还是有一定的策略去定义
作者回复: 咱也不藏着掖着了,没错,一开始确实是拍脑袋哈,但会在业务过程中逐渐对这个值进行调整。 打个比方,像阿里双11之类的大项目会有一个“稳定性团队”,专门搞大促全链路压测之类的,在这个过程里,就可以观察到不同流量下系统的表现情况,结合压测报告对每个环节的服务进行熔断限流方案的微调
2023-06-09归属地:湖北 - Believe关联流控规则不得行,也不报错,在直接流控规则生效的前提下,直接修改为关联流控,添加关联资源都不行
作者回复: 这个就需要分析sentinel的运行日志了,同学把log级别调低,抓一个留控请求跟一下日志。 还有一个更彻底的方法,本地启动sentinel开启debug端口,拉对应版本源码用remote debug方式去跟一个请求,能彻查具体哪个步骤问题的同时,还能了解一下底层逻辑。
2023-05-18归属地:四川 - 王志成我在coupon-calculation-serv 项目中集成Sentinel 的时候,报了Could not bind properties to 'SentinelProperties' 。 说是 让我Add an implementation, such as Hibernate Validator, to the classpah 为什么 Sentinel 会需要添加 Hibernate 呢,客户端在使用 Sentinel还需要持久化数据吗?
作者回复: 同学有没有往项目里添加示例代码以外的依赖项呢?这个error也有可能是依赖冲突。建议先用gitee上的原样代码去执行一下,如果可以顺利启动,那么再打印dependency tree,看下是否有依赖项的版本不同或者额外dependency加入到了项目中
2022-11-11归属地:北京 - Ronnie热点规则配置怎么存储呢,比如用户id=1的限流20,用户id=2的限流30,这些配置不可能一个一个去控制台配置吧
作者回复: Sentinel的热点规则是入门版,现实场景里更多的挑战来自于不可提前预测的热点,比如重磅微博之类,比较常见的做法是用stream技术,汇总分析链路/网关流量特征,对热点做实时打标之后,运行期创建热点限流规则
2022-08-29归属地:上海 - next station姚老师,请教个问题:流控规则--链路流控,无效;也百度了一下,配置spring.cloud.sentinel.web-context-unify=false无效。麻烦老师指导一下 代码如下: ``` // 读取优惠券 @GetMapping("/getTemplate") // @SentinelResource(value = "getTemplate") public CouponTemplateInfo getTemplate(@RequestParam("id") Long id){ log.info("Load template, id={}", id); return couponTemplateService.loadTemplateInfo(id); } @GetMapping("/getTemplate1") // @SentinelResource(value = "getTemplate1") public CouponTemplateInfo getTemplate1(@RequestParam("id") Long id){ log.info("Load template, id={}", id); return couponTemplateService.loadTemplateInfo(id); } 资源 public interface CouponTemplateService { // 通过模板ID查询优惠券模板 @SentinelResource(value = "loadTemplateInfo") CouponTemplateInfo loadTemplateInfo(Long id); } ```
作者回复: 同学在页面上配置的链路流控策略也截图看一下,我猜想应该是参数的“入口资源”没有指定对,导致sentinel没有识别到上游流量入口
2022-06-22 - 勤奋的樂请问添加流控规则,sentinel控制台直接弹窗显示失败,报错日志如下,是什么原因呢? 2022-05-06 15:37:21.357 ERROR 61049 --- [nio-8081-exec-1] c.a.c.s.d.controller.FlowControllerV1 : Failed to add new flow rule, app=coupon-template-serv, ip=localhost com.alibaba.csp.sentinel.dashboard.client.CommandFailedException: 2022-05-06 15:37:22.724 ERROR 61049 --- [Worker-thread-6] c.a.c.s.dashboard.metric.MetricFetcher : fetch metric http://localhost:8081:8719/metric?startTime=1651822634000&endTime=1651822640000&refetch=false error org.apache.http.client.ClientProtocolException: URI does not specify a valid host name: http://localhost:8081:8719/metric?startTime=1651822634000&endTime=1651822640000&refetch=false at org.apache.http.impl.nio.client.CloseableHttpAsyncClient.determineTarget(CloseableHttpAsyncClient.java:121) [httpasyncclient-4.1.3.jar!/:4.1.3] at org.apache.http.impl.nio.client.CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:102) [httpasyncclient-4.1.3.jar!/:4.1.3] at org.apache.http.impl.nio.client.CloseableHttpAsyncClient.execute(CloseableHttpAsyncClient.java:92) [httpasyncclient-4.1.3.jar!/:4.1.3] at com.alibaba.csp.sentinel.dashboard.metric.MetricFetcher.fetchOnce(MetricFetcher.java:214) [classes!/:na] at com.alibaba.csp.sentinel.dashboard.metric.MetricFetcher.lambda$doFetchAppMetric$3(MetricFetcher.java:282) [classes!/:na] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_312] at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_312] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_312] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_312] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_312]
作者回复: ClientProtocolException是一个通用错误,在很多项目里都会碰到,通常是在url里没有指定protocol (比如http, https)导致的
2022-05-06 - Geek_e93c48姚老师请教个问题,Sentinel限流的排队模式下,会将所有QOS都排队吗?还是只是创建一个固定大小的队列存储固定的QPS,超过部分直接抛弃。
作者回复: 队列是有超时时间的,可以在控制台设置,其实很像我们用MQ时候设置TTL,如果队列中的请求留存时间超出设置,那么就会被限流掉
2022-02-21