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

深入剖析Spring Cloud Sentinel,如何实现熔断降级,请求限流

一、Spring Cloud Sentinel 整体架构

Spring Cloud Sentinel 是阿里巴巴开源的高可用流量防护组件 Sentinel 的 Spring Cloud 版本扩展,它通过自动装配和注解方式,让开发者更方便地在微服务架构中实现限流、熔断、降级等高可用控制。


1. Sentinel 核心目标

  • 流量控制:控制 QPS 或线程数,避免突发流量压垮服务。

  • 熔断降级:当调用链路中某服务不稳定,进行熔断,快速失败。

  • 系统自适应保护:基于系统负载(如 CPU 使用率)动态控制流量。

  • 实时监控:提供 Dashboard 支持运行时规则管理和实时流量监控。


2. Sentinel 架构总览(逻辑层)

                 ┌────────────┐│ Dashboard  │ ← Web 控制台└────┬───────┘│ 推送规则┌─────▼─────────┐│ Spring 应用实例│└─────┬─────────┘│┌──────────────┴────────────────┐│        Sentinel Java Core     │└──────────────┬────────────────┘│┌──────────────▼───────────────────────┐│ 插件机制(Transport、Cluster、Adapter)│└───────────────────────────────────────┘

3. Sentinel 核心模块(Java Core)

1. Slot Chain(插槽链)机制

Sentinel 的核心是基于责任链模式构建的 SlotChain,形成一条拦截链:

ProcessorSlotChain chain = SlotChainProvider.newSlotChain();
chain.entry(context, resourceWrapper, node, count, prioritized, args);
Slot 执行链条:

执行顺序如下:

插槽名作用描述
NodeSelectorSlot维护资源调用路径关系,生成调用树
ClusterBuilderSlot构建资源的 ClusterNode(统计信息、全局限流)
LogSlot日志记录(可扩展)
StatisticSlot记录线程数、QPS、RT 等指标
SystemSlot系统保护规则(如 CPU 使用率、系统负载)
AuthoritySlot黑白名单校验
FlowSlot限流控制(核心)
DegradeSlot熔断降级(RT、异常比率、异常数)

📌 每个 Slot 都是 ProcessorSlot 的实现,通过 DefaultSlotChainBuilder 构建链条。


2. 数据模型结构(核心类)

类名描述说明
Context表示一次调用上下文(入口资源 + 调用链)
ResourceWrapper封装资源名和资源类型
Node资源的统计信息结构,构成调用树结构
ClusterNode资源全局统计结构,所有上下文共享
StatisticNode实现统计逻辑,如 QPS、RT、线程数等
Entry表示一次资源访问,用于控制和清理

4. 规则控制逻辑

Sentinel 的规则均为内存规则,支持动态更新(从控制台拉取或本地配置):

1. 流控规则(FlowRule)

FlowRule rule = new FlowRule();
rule.setResource("order-service");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(100); // QPS限流
FlowRuleManager.loadRules(Collections.singletonList(rule));

核心算法:滑动窗口 + 令牌桶 / 漏桶 + 熔断控制

2. 熔断规则(DegradeRule)

支持三种熔断:

  • RT 模式

  • 异常比率

  • 异常数

3. 系统保护规则(SystemRule)

基于:

  • 系统 load

  • RT

  • QPS

  • 线程数

  • 内存使用率


5. Spring Cloud Sentinel 整合架构(Adapter)

Sentinel 在 Spring Cloud 中的核心整合模块是:

spring-cloud-starter-alibaba-sentinel

1. 入口适配层 Adapter(如 RestTemplate、Feign、Gateway)

Sentinel 为各类组件提供适配器,如:

场景适配器实现类
RestTemplateSentinelRestTemplateInterceptor
FeignSentinelFeign 动态代理 + fallbackFactory
GatewaySentinelGatewayFilter + SentinelGatewayBlockExceptionHandler

2. Spring Boot 自动装配

  • SentinelAutoConfiguration

  • 注册默认规则管理器、控制器、过滤器等


6. 调用流程全图(以 RestTemplate 为例)

客户端请求 → Controller → RestTemplate↓SentinelRestTemplateInterceptor↓SphU.entry(resourceName)   ← SlotChain 检查↓正常执行或 BlockException 异常

7. 自定义扩展机制

1. 自定义 Block 异常处理器

public class MyExceptionHandler implements BlockExceptionHandler {@Overridepublic void handle(HttpServletRequest request, HttpServletResponse response, BlockException ex) throws IOException {response.getWriter().write("系统繁忙,请稍后再试");}
}

注册:

spring.cloud.sentinel.filter.exception-handler-class: com.example.MyExceptionHandler

2. 自定义 Slot 插槽链

可以通过 SPI 扩展:

META-INF/services/com.alibaba.csp.sentinel.slotchain.SlotChainBuilder

8. 与 Dashboard 的通信机制

Sentinel 默认使用 Netty 启动一个本地服务,向 Dashboard 注册:

  • 启动:CommandCenterInitFunc,默认端口 8719

  • 与控制台通信:HeartbeatSender 定时心跳上报

  • 拉取规则:控制台推送 JSON → 应用端解析并加载入 RuleManager


9. 集群限流机制(扩展)

通过以下组件实现集群流控:

  • Token Server:中心化限流服务节点

  • Token Client:各微服务接入限流客户端

核心类:

  • ClusterFlowSlot

  • ClusterNodeManager


10. 总结

维度说明
架构核心SlotChain + 插槽机制 + 统计模型
Spring 整合方式Starter 自动配置,注解 + 配置驱动
控制粒度支持 QPS、线程数、RT、异常率等
动态规则Dashboard 或 Nacos/Redis/ZK 推送
扩展能力插槽、拦截器、异常处理器、日志等

二、深入剖析 Sentinel 熔断机制的完整执行流程

1. Sentinel 熔断降级机制

Sentinel 的熔断机制由 DegradeRule 控制,主要用于应对系统不稳定,如:

  • 响应时间过长(RT)

  • 异常比例过高

  • 异常数过多

触发后,对应资源在一段时间内拒绝请求(快速失败),避免请求雪崩。


2. 触发入口:客户端调用链路起点

以 Spring Cloud + RestTemplate 示例:

@RestController
public class OrderController {@GetMapping("/order")public String order() {// Sentinel 入口try (Entry entry = SphU.entry("orderService")) {return restTemplate.getForObject("http://user-service/user", String.class);} catch (BlockException e) {return "熔断了";}}
}

🔗 入口方法:

Entry entry = SphU.entry("orderService");

这是 Sentinel 的核心资源调用拦截点。


3. 核心机制:Slot Chain 执行链

Sentinel 使用责任链模式,每个资源被访问时,会经过一系列 ProcessorSlot

DefaultProcessorSlotChain:┌──────────────┬───────────────┬────────────┬─────────────┬──────────────┬────────────┐│ NodeSelector │ ClusterBuilder│ LogSlot    │ Statistic   │ SystemSlot   │ ...        │└──────────────┴───────────────┴────────────┴─────────────┴──────────────┴────────────┘↓DegradeSlot

其中最后一个用于熔断的是:DegradeSlot


4. DegradeSlot 逻辑详解(熔断执行核心)

路径:com.alibaba.csp.sentinel.slots.block.degrade.DegradeSlot

➤ 1. Slot 执行入口

public void entry(Context context, ResourceWrapper resource, ...)throws Throwable {// 获取资源配置的所有熔断规则List<DegradeRule> rules = DegradeRuleManager.getRules(resource.getName());for (DegradeRule rule : rules) {rule.passCheck(context, resource, ...); // 核心判断}fireEntry(context, resource, ...); // 继续传给下一个 slot
}

5. DegradeRule 判定机制分析

路径:DegradeRule#passCheck(...)

Sentinel 支持三种熔断策略(由 grade 控制):

grade类型触发条件
0RT(慢调用)平均响应时间 > count 且 QPS 达到最小请求数
1异常比例异常比例 > count 且请求数足够
2异常数异常次数 > count 且时间窗口内

➤ 以“异常比例熔断”为例:

if (grade == RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) {if (exceptionQps / totalQps > count) {// 熔断触发cut(); // 开启熔断throw new DegradeException(...);}
}
  • cut() 方法:

    this.pass = false;
    this.cutTime = currentTime;
    

    表示开启熔断,记录开始时间。

  • 熔断窗口时间 timeWindow
    例如设置为 10 秒,则在此期间,所有请求都会被拒绝。


6. 熔断触发后的行为

当熔断开启,后续调用会走下面的逻辑:

if (!pass && currentTime - cutTime < timeWindow) {throw new DegradeException(resource.getName());
}

即抛出 DegradeException → 被上层捕获


7. 熔断后请求流程(图示)

用户请求↓
SphU.entry("resourceName")↓
SlotChain 执行 → 到达 DegradeSlot↓
读取 DegradeRuleManager 中的规则↓
调用 passCheck()↓
判断异常比例、RT 或 异常数↓
满足熔断 → 调用 cut() → 抛出 DegradeException↓
上层捕获异常(BlockException)↓
执行 fallback 或返回默认值

8. 降级规则配置方式

动态规则推送(如 Dashboard / Nacos):

[{"resource": "orderService","count": 0.2,"grade": 1,"timeWindow": 10,"minRequestAmount": 5,"statIntervalMs": 1000,"slowRatioThreshold": 0.5}
]

或通过代码:

DegradeRule rule = new DegradeRule();
rule.setResource("orderService");
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);
rule.setCount(0.5); // 异常比例 50%
rule.setTimeWindow(10);
rule.setMinRequestAmount(10);
DegradeRuleManager.loadRules(Collections.singletonList(rule));

9. 降级恢复逻辑

当进入熔断后,过了时间窗口(timeWindow)后,会自动关闭熔断:

if (!pass && currentTime - cutTime >= timeWindow) {pass = true; // 恢复服务访问
}

即:自动恢复,无需人工干预


10. 总结:熔断完整流程回顾

阶段描述
请求入口使用 SphU.entry(...) 拦截资源访问
Slot 执行链最终进入 DegradeSlot,执行降级判断
降级判断三种策略:慢调用、异常比例、异常数
状态变更调用 cut() 标记资源熔断
拒绝请求抛出 DegradeException,上层 fallback
恢复机制熔断时间窗口后自动恢复(滑动时间窗)

三、深入剖析 Sentinel 如何完成降级(Degrade)机制

从客户端发起请求到 Sentinel 判断并执行降级的 整个底层流程,包括:

  • 客户端调用入口

  • Sentinel SlotChain 架构

  • DegradeSlot 插槽作用

  • 三种降级策略详解(慢调用、异常比例、异常数)

  • 统计数据结构(滑动窗口)

  • 降级状态切换和恢复机制

  • 异常抛出与 fallback 处理


1. 降级 vs 限流:区别简析

类型限流(Flow)降级(Degrade)
控制指标QPS / 并发数RT、异常比例、异常数
触发时机系统压力大系统异常增多或响应变慢
控制方式当前立即拒绝 / 排队等待在窗口期内,所有请求快速失败
插槽类FlowSlotDegradeSlot
抛出异常FlowExceptionDegradeException

2. 降级核心流程概览

客户端请求↓
SphU.entry("资源名")↓
SlotChain 执行 → DegradeSlot↓
DegradeRuleManager 查找所有规则↓
依策略判断是否熔断(passCheck)↓
触发熔断 → 抛出 DegradeException↓
上层处理 fallback

3. 客户端入口:资源访问调用

try (Entry entry = SphU.entry("orderService")) {// 正常调用
} catch (BlockException e) {// 降级触发 fallbackreturn "服务降级";
}

核心代码:

CtSph.entry(resource) → ProcessorSlotChain.entry() → DegradeSlot.entry()

4. SlotChain:DegradeSlot 插槽位置

NodeSelectorSlot→ ClusterBuilderSlot→ LogSlot→ StatisticSlot→ SystemSlot→ FlowSlot→ AuthoritySlot→ DegradeSlot ← 降级判断

5. DegradeSlot:执行降级逻辑

类路径:com.alibaba.csp.sentinel.slots.block.degrade.DegradeSlot

核心代码:

public void entry(Context context, ResourceWrapper resource, ...) throws Throwable {List<DegradeRule> rules = DegradeRuleManager.getRules(resource.getName());for (DegradeRule rule : rules) {rule.passCheck(context, resource, ...);}fireEntry(context, resource, ...); // 向下传递
}
  • 读取所有与资源匹配的降级规则

  • 执行 rule.passCheck() 进行判断

  • 若不满足 → 抛出 DegradeException


6. DegradeRule.passCheck(): 降级判断核心逻辑

类路径:com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule

public boolean passCheck(Context context, ResourceWrapper resource, ...) {if (cut) {if (currentTime - cutTime < timeWindow) {throw new DegradeException(...); // 降级中,直接拒绝} else {cut = false; // 时间窗结束,恢复}}// 根据 grade 选择不同策略switch (grade) {case DEGRADE_GRADE_RT: // 平均响应时间if (rt > count) && requestQps > minRequestAmountcut(); throw DegradeException;case DEGRADE_GRADE_EXCEPTION_RATIO: // 异常比例if (exceptionQps / totalQps > count) && totalQps > minRequestAmountcut(); throw DegradeException;case DEGRADE_GRADE_EXCEPTION_COUNT:if (exceptionQps > count)cut(); throw DegradeException;}return true;
}

7. 降级三种策略详解

类型grade 常量触发条件
慢调用比例降级DEGRADE_GRADE_RT最近统计窗口内,RT 超过阈值,且请求数达标
异常比例降级DEGRADE_GRADE_EXCEPTION_RATIO异常率 > 阈值,且总请求数达标
异常数降级DEGRADE_GRADE_EXCEPTION_COUNT统计窗口内,异常数大于阈值

示例:异常比例降级

if (exceptionQps / totalQps > count) {cut(); // 设置 cut = true, 进入熔断状态throw new DegradeException();
}

方法:cut()

this.cut = true;
this.cutTime = currentTime;

进入熔断状态,passCheck() 中将直接抛出异常。


8. 降级状态与恢复机制

  • 设置了 cut = true 时进入熔断状态

  • 每次请求会判断当前时间是否超过 cutTime + timeWindow

    • 若是:自动恢复

    • 否则:仍然抛出 DegradeException

Sentinel 不需要人工干预,自动判断恢复时机。


9. 上层 fallback 降级处理

手动处理:

try (Entry entry = SphU.entry("myService")) {return myRealCall();
} catch (DegradeException ex) {return "服务降级";
}

Spring 注解方式:

@SentinelResource(value = "myService", blockHandler = "handleBlock")
public String myService() {...
}public String handleBlock(BlockException ex) {return "降级返回";
}

10. 降级统计数据来源:Node + Metric

每个资源的 Node 中包含指标统计结构:

Metric metric = ClusterNode.metric;
metric.passQps();
metric.exceptionQps();
metric.avgRt();

底层使用 LeapArray 实现滑动窗口:

  • 将统计周期切分为 N 个窗口(如 1s 被分成 5 个 200ms 窗口)

  • 实时更新每个小窗口的统计值

  • 基于窗口聚合得出当前 avgRt, exceptionQps


11. 降级规则配置方式

代码方式配置:

DegradeRule rule = new DegradeRule();
rule.setResource("myService");
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);
rule.setCount(0.5); // 异常率 50%
rule.setTimeWindow(10); // 熔断 10s
rule.setMinRequestAmount(5); // 最小请求量
DegradeRuleManager.loadRules(Collections.singletonList(rule));

也可通过 Sentinel Dashboard / Nacos 推送 JSON 规则。


12. 全流程调用链总结

用户请求↓
SphU.entry("资源名")↓
SlotChain → DegradeSlot↓
DegradeRuleManager.getRules()↓
执行每条 rule.passCheck()↓是否 cut=true?↓           ↓是             否↓             继续策略判断抛异常          是否满足降级条件?↓         ↓是          否↓           ↓cut()        正常放行抛出异常

13. 关键类汇总

类 / 组件作用
SphU.entry()Sentinel 拦截入口
DegradeSlot降级判断插槽
DegradeRule单条降级规则
DegradeRuleManager管理和下发所有规则
ClusterNode指标统计器
LeapArray滑动窗口统计结构
DegradeException被降级时抛出的异常
SentinelResource注解式降级入口

14. 总结

Sentinel 降级机制通过:

  1. 客户端请求拦截(SphU.entry)

  2. Slot 链中的 DegradeSlot 执行降级判断

  3. 根据配置的 DegradeRule 判断是否进入熔断状态

  4. 若触发熔断,设置 cut=true,在 timeWindow 时间内拒绝所有请求

  5. 抛出 DegradeException,由上层 fallback 处理

  6. 熔断窗口过期后,自动恢复

四、深入剖析 Sentinel 如何完成限流

从客户端请求到限流生效的完整流程,包括:

  • 请求入口(如 Feign、RestTemplate)

  • 核心执行链(SlotChain)

  • 限流核心类(FlowSlot、FlowRule)

  • 令牌桶算法与统计结构

  • 异常处理与 fallback

  • 限流规则配置

  • 限流后的恢复机制


1. 总体流程图

客户端请求↓
Sentinel Resource Entry(SphU.entry("资源名"))↓
SlotChain(插槽链)执行↓
FlowSlot → FlowRuleManager↓
Token 校验(判断是否通过)↓        ↓
通过     不通过↓         ↓
正常执行   抛出 FlowException → fallback

2. 请求入口:SphU.entry()

Sentinel 使用 SphU.entry("resourceName") 作为资源调用的拦截入口。

例如:

try (Entry entry = SphU.entry("orderService")) {// 执行业务逻辑
} catch (BlockException e) {// 被限流
}

核心方法路径:

com.alibaba.csp.sentinel.SphU.entry()
→ CtSph#entry()
→ SlotChain.entry() ← 进入责任链执行

3. SlotChain 执行链

Sentinel 内部有一条 ProcessorSlotChain,每个资源调用会依次通过这些插槽。

NodeSelectorSlot → ClusterBuilderSlot → StatisticSlot → FlowSlot → ...

限流控制核心插槽是:FlowSlot


4. FlowSlot:限流执行核心

类路径:com.alibaba.csp.sentinel.slots.block.flow.FlowSlot

方法:

@Override
public void entry(Context context, ResourceWrapper resource, ...)throws Throwable {List<FlowRule> rules = FlowRuleManager.getRules(resource.getName());for (FlowRule rule : rules) {if (!rule.passCheck(...)) {throw new FlowException(...); // 被限流}}fireEntry(...); // 继续传递给下一个 slot
}

即:

  • 遍历所有限流规则(支持多个)

  • 调用 rule.passCheck(...)

  • 判断是否允许通过


5. FlowRule.passCheck(): 判断是否限流

类路径:com.alibaba.csp.sentinel.slots.block.flow.FlowRule

public boolean passCheck(...) {Node node = selectNodeByStrategy(...); // 根据限流策略选择 Node(统计节点)return controller.canPass(node, acquireCount);
}

限流控制核心接口:

FlowRule.setControlBehavior()

支持几种限流方式:

controlBehavior限流方式描述
0快速失败(默认)超过阈值立即拒绝
1排队等待类似漏桶算法,匀速通过
2WarmUp(预热)限流阈值逐步提升(冷启动)

6. FlowController.canPass(): 限流判断核心

每种限流行为都由一个 TrafficShapingController 实现,比如:

1. DefaultController(快速失败)

public boolean canPass(Node node, int acquireCount) {double curQps = node.passQps();return (curQps + acquireCount) <= count;
}
  • node.passQps():获取当前每秒通过的请求数(滑动窗口统计)

  • 如果超过设置的 QPS 阈值 count → 拒绝

2. RateLimiterController(排队等待)

public boolean canPass(...) {long waitTime = ...; // 计算等待时间if (waitTime > maxQueueingTimeMs) {return false; // 超过最大等待时间,拒绝}sleep(waitTime);return true;
}

7. 节点统计机制:如何知道 QPS?

Sentinel 中的 Node 是统计的核心:

  • 每个资源都有一个 ClusterNodeDefaultNode

  • Node.passQps() 是基于滑动时间窗口统计的:

class Metric {private long[] pass; // 每个时间窗口内通过请求数private long windowLengthInMs = 1000;
}

Sentinel 使用 滑动窗口(LeapArray) 实现:

  • 将 1s 分成若干小窗口(如 200ms × 5)

  • 统计每个小窗口的请求数

  • 实时计算 QPS


8. 被限流后如何处理?

如果 FlowSlot 抛出 FlowException,调用方可自定义 fallback。

示例(Spring Cloud):

@SentinelResource(value = "orderService", blockHandler = "handleBlock")
public String order() {return restTemplate.getForObject(...);
}public String handleBlock(BlockException ex) {return "系统繁忙,请稍后重试";
}

9. FlowRule 配置方式

可通过代码动态加载:

FlowRule rule = new FlowRule();
rule.setResource("orderService");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(100); // 100 QPS
FlowRuleManager.loadRules(Collections.singletonList(rule));

或通过 Dashboard / Nacos 推送 JSON 配置。


10. 限流恢复机制

限流并不持久存在,而是实时动态判断:

  • 每秒重新计算统计窗口(滑动时间窗)

  • 当前 QPS 低于阈值 → 自动放行


11. 全流程调用图

1. 客户端请求
2. 调用 SphU.entry("orderService")
3. 进入 SlotChain
4. 到达 FlowSlot
5. 读取 FlowRuleManager 中的规则
6. 执行 rule.passCheck()→ 获取当前 QPS(passQps)→ 判断是否超过 count
7. 如果超限:→ 抛出 FlowException→ 上层 fallback
8. 如果未超限:→ fireEntry() 执行后续逻辑

12. 总结对照表

模块说明
SphU.entry()请求入口
SlotChain插槽责任链
FlowSlot限流判断插槽
FlowRuleManager规则持有者
FlowRule每条规则定义(阈值、策略)
TrafficShapingController限流算法策略(令牌桶、漏桶等)
Node/ClusterNodeQPS 统计结构(滑动时间窗)
FlowException限流触发异常
fallback限流后的兜底处理

五、Sentinel 整合 Spring Boot 的完整案例

案例涵盖:

  • ✅ 基本接入 Sentinel

  • ✅ 定义资源并实现 限流

  • ✅ 配置 熔断降级(异常比例、慢调用)

  • ✅ 自定义 fallback 处理

  • ✅ 支持通过 Sentinel Dashboard 管理规则


1. 引入依赖(Maven)

<dependencies><!-- Sentinel 核心依赖 --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.6</version></dependency><!-- Sentinel 与 Spring Boot 集成适配 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId><version>2021.1</version></dependency><!-- 可选:用于 feign 支持 sentinel(如用 openFeign) --><!--<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel</artifactId><version>2021.1</version></dependency>-->
</dependencies>

💡 Sentinel 与 Spring Cloud Alibaba 的版本必须匹配你的 Spring Boot 版本。


2. application.yml 配置

server:port: 8080spring:application:name: sentinel-demo# Sentinel 配置
spring:cloud:sentinel:transport:dashboard: localhost:8080   # Sentinel Dashboard 地址port: 8719                  # 与 Dashboard 通信的端口(需开放)eager: true                   # 应用启动即注册资源(非懒加载)

3. 创建控制器并定义资源(限流 & 熔断)

@RestController
public class DemoController {/*** 示例 1:限流 + fallback*/@GetMapping("/hello")@SentinelResource(value = "hello", blockHandler = "handleHelloBlock")public String hello(@RequestParam(required = false) String name) {return "Hello " + name;}public String handleHelloBlock(String name, BlockException ex) {return "【限流】服务繁忙,请稍后再试";}/*** 示例 2:模拟异常触发降级*/@GetMapping("/degrade")@SentinelResource(value = "degradeTest", fallback = "degradeFallback")public String degradeTest(@RequestParam(required = false) Integer code) {if (code != null && code == 1) {throw new RuntimeException("模拟异常");}return "降级接口:正常访问";}public String degradeFallback(Integer code, Throwable ex) {return "【熔断降级】系统异常,请稍后再试";}
}

4. 启动 Sentinel Dashboard(可选)

如果你未运行 Dashboard:

  1. 下载:
    https://github.com/alibaba/Sentinel/releases

  2. 启动方式:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -jar sentinel-dashboard-1.8.6.jar
  1. 打开控制台:
    访问 http://localhost:8080,登录账号密码:sentinel/sentinel

  2. 添加你的应用:
    输入名称如 sentinel-demo,点击“新增应用”


5. 手动配置限流规则(代码方式)

@PostConstruct
public void initFlowRules() {// 限流规则FlowRule rule = new FlowRule();rule.setResource("hello");               // 资源名rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // QPS模式rule.setCount(2);                        // 每秒最多 2 次访问FlowRuleManager.loadRules(Collections.singletonList(rule));// 熔断规则(异常比例)DegradeRule degradeRule = new DegradeRule();degradeRule.setResource("degradeTest");degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);degradeRule.setCount(0.5);                // 异常比例阈值degradeRule.setTimeWindow(10);            // 熔断时间窗(秒)degradeRule.setMinRequestAmount(5);       // 最小请求数DegradeRuleManager.loadRules(Collections.singletonList(degradeRule));
}

✅ 可以用 DegradeRule.setGrade(DEGRADE_GRADE_RT) 实现慢调用降级。


6. 测试验证

  • 测试限流:连续访问 /hello?name=jeer 超过 QPS 限制 → 返回限流 fallback

  • 测试熔断:访问 /degrade?code=1 多次抛出异常 → 触发熔断

  • 控制台中可以查看 QPS、异常统计、规则配置


7. 项目结构清单(示例)

src
└── main├── java│   └── com.example.sentinel│       ├── SentinelDemoApplication.java│       └── controller│           └── DemoController.java└── resources└── application.yml

8. Sentinel 注解能力小结

注解说明
@SentinelResource定义资源名、异常处理方法
blockHandler限流、熔断、系统负载时的处理方法
fallback调用异常时的兜底方法
defaultFallback全局 fallback

9. 可扩展项(进阶建议)

  • ✅ 限流支持:热点参数限流、URL 分组限流

  • ✅ 降级策略:支持异常数、响应时间等

  • ✅ 整合 Feign:FeignClient + Sentinel 支持 fallback

  • ✅ 支持动态规则推送:基于 Nacos、Apollo

六、Sentinel + Nacos 实现动态规则配置的完整案例

案例包括:

  • ✅ Spring Boot 整合 Sentinel

  • ✅ Sentinel Dashboard 配置说明

  • ✅ Sentinel 与 Nacos 的动态规则持久化集成

  • ✅ 在 Nacos 中维护限流、降级等规则

  • ✅ 动态推送规则实时生效


1. 技术栈版本要求

技术组件版本建议
Spring Boot2.3.x / 2.6.x 等
Sentinel1.8.6+
Sentinel Dashboard1.8.6+
Nacos2.x
Spring Cloud Alibaba2021.x 或 2022.x

2. Maven 依赖

<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.1</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><!-- Sentinel Starter --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- Sentinel Nacos DataSource 支持 --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId><version>1.8.6</version></dependency>
</dependencies>

3. application.yml 配置

spring:application:name: sentinel-nacos-democloud:nacos:server-addr: 127.0.0.1:8848config:namespace: publicdiscovery:namespace: publicsentinel:transport:dashboard: localhost:8080  # Sentinel Dashboard 地址port: 8719                 # 与 Dashboard 通讯端口datasource:flow:nacos:server-addr: ${spring.cloud.nacos.server-addr}data-id: sentinel-demo-flow-rulesgroup-id: DEFAULT_GROUPdata-type: jsonrule-type: flow

4. 控制器示例(定义限流资源)

@RestController
public class DemoController {@GetMapping("/hello")@SentinelResource(value = "hello", blockHandler = "handleHello")public String hello() {return "Hello Sentinel + Nacos";}public String handleHello(BlockException ex) {return "限流啦~";}
}

5. 配置中心:Nacos 中创建限流规则

打开 Nacos 控制台:

地址:http://localhost:8848/nacos

新建配置项:

  • Data IDsentinel-demo-flow-rules

  • GroupDEFAULT_GROUP

  • 内容格式:JSON

示例内容(限流规则):

[{"resource": "hello","limitApp": "default","grade": 1,"count": 1.0,"strategy": 0,"controlBehavior": 0}
]
字段说明:
字段含义
resource资源名,对应 @SentinelResource(value)
grade阈值类型:1=QPS,0=并发
count阈值(如 QPS = 1)
controlBehavior控制行为:0=直接拒绝
limitApp限制来源:default = 所有
strategy流控模式:0=直接

✅ 支持流控、降级、热点参数、系统规则等类型的配置(rule-type 决定)


6. Dashboard 配置 Sentinel 动态规则数据源(可选)

如果你需要 Sentinel 控制台推送规则到 Nacos:

修改 sentinel-dashboard 的 application.properties

# 配置控制台自身访问地址
server.port=8080# 配置 Nacos 数据源
sentinel.datasource.ds1.nacos.server-addr=127.0.0.1:8848
sentinel.datasource.ds1.nacos.data-id=sentinel-demo-flow-rules
sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
sentinel.datasource.ds1.nacos.data-type=json
sentinel.datasource.ds1.nacos.rule-type=flow

启动 dashboard:

java -Dserver.port=8080 -jar sentinel-dashboard-1.8.6.jar

7. 结果验证

1. 启动 nacos → dashboard → spring boot 应用

确保:

  • nacos: http://localhost:8848

  • dashboard: http://localhost:8080

  • 应用:http://localhost:8081/hello

2. 压测访问 /hello

超过 1 QPS 之后返回:

限流啦~

说明配置从 Nacos 下发并生效。


8. 支持的动态规则类型

rule-type功能示例配置(data-id 可配)
flow流控限流sentinel-demo-flow-rules
degrade熔断降级sentinel-demo-degrade-rules
param-flow热点参数sentinel-demo-param-rules
system系统规则sentinel-demo-system-rules
authority黑白名单sentinel-demo-authority-rules

每种类型都支持通过 spring.cloud.sentinel.datasource.XXX 进行接入。


9. 完整项目结构(参考)

sentinel-nacos-demo
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com.example.sentinel
│   │   │       ├── SentinelNacosDemoApplication.java
│   │   │       └── controller
│   │   │           └── DemoController.java
│   │   └── resources
│   │       └── application.yml
http://www.xdnf.cn/news/14599.html

相关文章:

  • C++ 学习 网络编程 2025年6月17日19:56:47
  • MySQL的Sql优化经验总结
  • 浅谈开发者重构的时机选择
  • 如何确定驱动480x320分辨率的显示屏所需的MCU主频
  • DBeaver数据库管理工具的简介、下载安装与优化配置
  • [IMX][UBoot] 02.源码目录
  • Python格式化工具推荐
  • Java中final修饰符
  • 第五章:执行计划分析 - 读懂MySQL的执行策略
  • 一款完美适配mobile、pad、web三端的博客网站UI解决方案
  • 《单光子成像》第六章 预习2025.6.15
  • 【驱动设计的硬件基础】I²C
  • 数据质量-如何构建高质量的大模型数据集
  • Understanding Human Hands in Contact at Internet Scale
  • Python基于Flask的医疗问句中的实体识别算法的研究(附源码,文档说明)
  • 【Dify系列】【Dify 核心功能】【应用类型】【五】【工作流】
  • C++ new知识点详解
  • 调和级数 敛散性
  • 一些杂想20250615
  • SAP顾问职位汇总(第24周)
  • 【Lean4编程入门】 Lean 4 中的 `inductive` 类型定义注解例子解析
  • 电商数据采集的技术分享
  • 【Bug:docker】--docker的wsl版本问题
  • 人工智能-准确率(Precision)、召回率(Recall) 和 F1 分数
  • 1、Java基础语法通关:从变量盒子到运算符魔法
  • NGINX Google Performance Tools 模块`ngx_google_perftools_module`
  • Mkdocs 阅读时间统计插件
  • 【第四十周】眼动追踪基础
  • 【C/C++】内核开发之进程调度大纲
  • Claude Code 是什么?