Spring Cloud 微服务项目实战
姚秋辰(姚半仙)
PayPal 研发经理
15862 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
结束语 (1讲)
Spring Cloud 微服务项目实战
15
15
1.0x
00:00/00:00
登录|注册

18 | Sentinel 实战:如何实施流量整形与限流策略?

你好,我是姚秋辰。
今天我们来学习 Sentinel 组件最为核心的功能:流量整形(也可以叫流控)。
在这节课,我会通过项目实战将优惠券系统集成到 Sentinel 中,对用户领券和查找优惠券两个场景添加流控规则。在这个过程中,我会带你了解 Sentinel 的三种流控模式,以及对应的流控效果。此外,我还会针对 Sentinel 框架做一个小扩展,对特定的调用来源做流控。掌握了这些内容之后,你就可以清楚如何用流控手段来降低高并发场景下的系统压力。
在进行实战项目之前,我需要带你搭建 Sentinel 控制台。你可以把它看作一个中心化的控制中心,所有的应用程序都会接入这个控制台,我们可以在这里设置各种流控规则,这些规则也会在应用程序中实时生效。

运行 Sentinel 控制台

我们可以从Sentinel 官方 GitHub的 Release 页面下载可供本地执行的 jar 文件,为了避免版本不一致导致的兼容性问题,我推荐你下载 1.8.2.Release 版本。在该版本下的 Assets 部分,你可以直接下载 sentinel-dashboard-1.8.2.jar 这个文件。
下载好文件之后,你可以使用命令行进入到这个 jar 包所在的目录,然后就可以直接执行下面这行命令启动 Sentinel 控制台了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

文章介绍了如何在实际项目中使用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-05
    4
  • 扶幽
    老师请教下,在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-21
    2
    1
  • 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
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部