当前位置: 首页 > news >正文

Sentinel:阿里云高并发流量控制

Sentinel 是阿里开源的分布式流量治理组件,核心目标是通过流量控制、熔断降级等机制,让系统获得 “自适应免疫力”,解决高并发下的服务稳定性问题(如流量击穿、雪崩效应)。适配 Spring Cloud、Dubbo 等主流框架,支持动态规则配置与实时监控。

一 Sentinel的三大核心概念

概念

通俗解释

举例

资源

要保护的 “目标”(接口、方法、代码块)

订单接口/api/order/create、Feign 调用user-service

规则

保护资源的 “策略”(限流、熔断等)

“订单接口 QPS 超 100 就限流”“调用超时超 3 秒就熔断”

簇点链路

资源的 “调用关系图”(展示谁调用了这个资源)

前端→订单服务→库存服务(库存服务是订单服务的下游资源)

核心逻辑:先定义 “资源”,再给资源加 “规则”,通过 “簇点链路” 查看资源调用情况。

二 Sentinel的安装与使用

1、Sentinel控制台的下载
下载地址:https://github.com/alibaba/Sentinel/releases/tag/1.8.3

直接下载jar包

建议放在单独目录(如 D:\sentinel 或 /home/user/sentinel),避免路径含中文 / 空格。

启动(防止8080端口被占用,从而使用18080):

java -Dserver.port=18080 -Dcsp.sentinel.dashboard.server=localhost:18080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar

2、访问Sentinel

浏览器输入:localhost:18080
账号密码 默认都是 sentinel

三 集成SpringCloud

1 引入依赖

​<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>${spring-cloud-alibaba.version}</version></dependency>​<!-- sentinel + nacos -->
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

2 添加配置

spring:application:name: mdx-shop-user # 服务名(注册到Nacos)cloud:nacos:discovery:server-addr: localhost:8848 # Nacos地址namespace: mdx # 环境隔离(如dev/test)group: mdx # 服务分组sentinel:transport:dashboard: localhost:18080 # Sentinel控制台地址datasource: # 规则持久化(存Nacos,避免重启丢失)flow: # 流控规则nacos:server-addr: localhost:8848dataId: ${spring.application.name}-flow-rulesgroupId: SENTINEL_GROUPrule-type: flow # 规则类型(flow=流控,degrade=熔断)degrade: # 熔断规则nacos:server-addr: localhost:8848dataId: ${spring.application.name}-degrade-rulesgroupId: SENTINEL_GROUPrule-type: degrade
feign:sentinel:enabled: true # 开启Feign+Sentinel整合(Feign调用失败触发降级)

3 定义资源

@RestController
@RequestMapping("/api/user")
public class UserController {// 资源名:userGetById,降级方法:getUserFallback@SentinelResource(value = "userGetById", blockHandler = "getUserFallback")@GetMapping("/{id}")public String getUserById(@PathVariable String id) {// 业务逻辑:查询用户信息return "用户ID:" + id + ",姓名:张三";}// 降级方法:参数、返回值必须和原方法一致,最后加BlockExceptionpublic String getUserFallback(String id, BlockException e) {// 限流/熔断时返回的提示return "当前访问人数过多,请稍后重试(用户查询服务)";}
}

4 Nacos中配置Sentinel

打开 Nacos 控制台(localhost:8848/nacos),新建配置:​

  • 数据 ID:mdx-shop-user-flow-rules(对应 yml 中的 dataId);​
  • 分组:SENTINEL_GROUP;​
  • 配置格式:JSON;​
  • 配置内容(流控规则示例):​
    [{"resource": "userGetById", // 资源名"grade": 1, // 阈值类型:1=QPS,0=并发线程数"count": 10, // 阈值:每秒10次请求"controlBehavior": 0, // 流控效果:0=快速失败,1=Warm Up,2=排队等待"strategy": 0, // 流控模式:0=直接,1=关联,2=链路"clusterMode": false // 是否集群:默认false}
    ]

    同理,新建熔断规则配置(数据 ID:mdx-shop-user-degrade-rules):​

[{"resource": "mdx-shop-order#/api/order/{userId}(String)", // Feign自动生成的资源名"grade": 0, // 熔断策略:0=慢调用比例,1=异常比例,2=异常数"count": 3000, // 最大RT:3000ms"slowRatioThreshold": 0.5, // 慢调用比例阈值:50%"statIntervalMs": 10000, // 统计时长:10秒"timeWindow": 5 // 熔断时长:5秒}
]

四 核心规则精讲(一):流控规则(控制 “流量”,避免服务被冲垮)​

流控 =“流量控制”,核心是:当资源的请求量超过设定阈值时,如何 “拦截” 多余请求。​

需重点掌握 3 个配置维度,每个维度都对应实际业务场景:​

1. 第一步:选 “阈值类型”(按什么维度限流?)​

决定 “用 QPS 还是并发线程数” 作为限流标准,二选一:​

阈值类型​

定义​

适用场景​

QPS(每秒请求数)​

每秒访问资源的请求次数​

接口抗并发能力有限(如秒杀接口)​

并发线程数​

同时处理该资源请求的线程数量​

资源调用耗时久(如数据库慢查询)​

举例:秒杀接口用 “QPS=100”(每秒最多 100 人抢);查询订单详情(查数据库)用 “并发线程数 = 20”(同时最多 20 个线程查库,避免数据库连接耗尽)。​

2. 第二步:选 “流控模式”(对谁限流?)​

决定 “限流作用在哪个调用链路”,3 种模式对应不同业务需求:​

流控模式​

逻辑​

场景举例​

直接模式(默认)​

资源自身超阈值,直接限流该资源​

订单接口自身 QPS 超 100,直接拦截订单请求​

关联模式​

当 “关联资源” 超阈值,限流当前资源​

支付接口(关联资源)超负载,限流订单创建(当前资源),避免更多支付请求​

链路模式​

只限制 “特定调用链路” 的请求,其他链路不限​

商品详情接口有 2 个调用方:APP 端和管理端,只限流 APP 端的请求(管理端需优先访问)​

关键提醒:用 “链路模式” 时,需在配置文件加一行:spring.cloud.sentinel.web-context-unify=false(关闭 Web 上下文统一,才能识别不同调用链路)。​

3. 第三步:选 “流控效果”(限流后怎么处理?)​

决定 “拦截请求后,给用户返回什么 / 怎么处理”,3 种效果各有侧重:​

流控效果​

逻辑​

适用场景​

快速失败(默认)​

超阈值直接抛异常(BlockException),返回自定义提示​

非核心接口(如商品推荐),允许快速失败​

Warm Up(预热)​

初始阈值低,逐渐升高到目标阈值(默认 30 秒)​

秒杀 / 活动启动场景(避免瞬间流量冲垮服务)​

排队等待(匀速)​

用 “漏桶算法” 让请求匀速通过,超时丢弃​

核心接口(如支付),需保证请求不丢失,匀速处理​

举例:秒杀活动用 Warm Up:初始阈值 30(前 30 秒每秒 30 人),30 秒后升到 100(正常阈值),避免启动瞬间 100QPS 冲垮服务;支付接口用排队等待:QPS=50,超时时间 500ms,超过 50QPS 的请求排队,500ms 内没处理完就丢弃,保证支付请求有序处理。​

流控规则配置实操(控制台版,最直观)​

  1. 启动 Sentinel 控制台(java -jar sentinel-dashboard-1.8.6.jar),访问localhost:8080(账号 sentinel);​
  1. 先调用一次资源(如访问/api/order/create),让簇点链路显示该资源;​
  1. 点击资源后的 “流控” 按钮,按需求配置:​
  • 示例 1(秒杀接口):阈值类型 = QPS,阈值 = 100,流控模式 = 直接,流控效果 = Warm Up;​
  • 示例 2(支付关联限流):资源选 “订单创建”,阈值类型 = QPS,阈值 = 50,流控模式 = 关联,关联资源选 “支付接口”。​

五 核心规则精讲(二):熔断规则(“断尾”,避免级联崩溃)​

熔断 =“服务故障时自动断开调用”,核心是:当下游资源(如 A 调用 B,B 是下游)故障时,A 不再调用 B,而是直接返回降级结果,避免 A 被 B 拖垮。​

需先理解熔断的 “3 个状态”,再学 “3 种熔断策略”:​

1. 先懂熔断的 “状态机”(核心逻辑)​

熔断规则的本质是让资源在 3 个状态间切换,确保故障时 “快速断连”,恢复时 “谨慎试探”:​

状态​

行为​

切换条件​

关闭(默认)​

正常调用下游资源,统计异常 / 慢调用情况​

满足 “熔断策略”(如慢调用超 50%)→ 切换到 “开启”​

开启(熔断中)​

不调用下游资源,直接返回降级结果​

熔断时长到(如 5 秒)→ 切换到 “半开”​

半开(试探)​

允许少量请求调用下游,验证是否恢复​

若请求正常→ 切换到 “关闭”;若仍异常→ 切回 “开启”​

举例:A 服务调用 B 服务,B 挂了→A 的熔断状态从 “关闭”→“开启”(5 秒内 A 不调用 B)→5 秒后到 “半开”(A 发 1 个请求给 B)→若 B 恢复(请求成功)→A 切回 “关闭”(正常调用);若 B 还没好(请求失败)→A 切回 “开启”(再等 5 秒)。​

2. 3 种熔断策略(触发熔断的 “条件”)​

决定 “什么情况下,触发熔断(从关闭→开启)”,按业务场景选:​

熔断策略​

触发条件(需同时满足)​

适用场景​

慢调用比例​

1. 统计周期内,请求 RT(响应时间)> 设定 “最大 RT”;2. 慢调用占比 > 设定 “比例阈值”(如 50%);3. 统计周期内请求数 ≥ 5(避免少量请求误判)​

下游服务响应慢(如数据库查大表超时)​

异常比例​

1. 统计周期内,业务异常数(如抛 Exception)占比 > 阈值;2. 统计周期内请求数 ≥ 5​

下游服务报错多(如 B 服务抛 500 错误)​

异常数​

1. 统计周期内,业务异常总数 ≥ 设定 “异常数阈值”;2. 统计周期内请求数 ≥ 5​

下游服务突发故障(如 B 服务连不上,瞬间抛 10 个异常)​

配置示例(慢调用比例):​

给 “订单调用库存” 资源配熔断:最大 RT=3000ms(超过 3 秒算慢调用),比例阈值 = 0.5(50% 是慢调用),统计时长 = 10 秒,熔断时长 = 5 秒。​

→ 10 秒内,若 “订单调用库存” 的请求中,50% 以上 RT>3 秒,且请求数≥5→触发熔断,5 秒内不再调用库存服务,直接返回 “库存服务繁忙”。​

熔断规则配置实操(控制台版)​

簇点链路找到目标资源(如 “订单调用库存”),点击 “降级” 按钮;​
选择熔断策略(如 “慢调用比例”),配置参数:​

  • 最大 RT:3000(单位 ms);​
  • 比例阈值:0.5(50%);​
  • 统计时长:10(单位秒);​
  • 熔断时长:5(单位秒);​
    故意让下游服务慢(如库存服务加Thread.sleep(4000)),触发熔断后,查看是否返回降级结果。
http://www.dtcms.com/a/499057.html

相关文章:

  • 从技术到商业:电商返利平台的核心指标设计(GMV、佣金率、留存率)与技术支撑体系
  • ShardingSphere 源码解析之分片引擎(下)
  • winxp下做网站网店设计美工培训
  • 【论文学习】大语言模型(LLM)论文
  • 做网站ssl证书必须要吗如何黑掉jsp做的网站
  • CLICKHOUSE分布式表初体验
  • 学习周报十八
  • 《Kubernetes 集群搭建全指南:从核心概念到环境部署!》
  • 找工作哪个网站好58同城做网站最简单的
  • 携程网站用js怎么做淄博哪家网络公司做网站好
  • Linux Shell 正则表达式中的 POSIX 字符集:用法与实战
  • MQTT协议,EMQX自建服务器
  • 力扣1287. 有序数组中出现次数超过25%的元素
  • Linux网络与路由配置完全指南
  • 【高并发服务器】六、日志宏的实现
  • 什么是网络割接
  • 中山网站建设文化报价个人网站设计结构图
  • 专业简历制作网站推荐渭南网站建设网站排名优化
  • Electron学习(一):创建第一个应用并打包成功
  • EF Core FromExpression 方法
  • 工厂方法模式
  • 做装机u盘那个网站好市桥做网站
  • SAP MM采购对账功能分享
  • 网页设计与网站建设考试名词解释2019网站建设工作的作用
  • 【有源码】基于Python与Spark的火锅店数据可视化分析系统-基于机器学习的火锅店综合竞争力评估与可视化分析-基于用户画像聚类的火锅店市场细分与可视化研究
  • Linux: perf: sched latency,周期性抓取看趋势,做对比
  • 统计学重要思想
  • Android 本地存储方案深度解析:SharedPreferences、DataStore、MMKV 全面对比
  • 网站开发前后端中山做外贸网站
  • ElastiCache Redis 内存告警深度分析与运维实战指南