Alibaba Sentinel 中两个核心接口:SphResourceTypeSupport 和 Sph共同构成了 Sentinel 对资源进行流量控制、熔断降级、系统保护等规则校验与统计的核心入口。
我们从整体结构、设计目的、关键参数和使用方式几个方面来理解:
一、整体关系
Sph接口 继承了SphResourceTypeSupport。Sph是 Sentinel 的"主入口"接口("Sentinel Protection Helper"),提供对资源保护的各种方法。SphResourceTypeSupport则是对Sph的扩展,增加了 资源类型(resourceType) 的支持,用于更细粒度的分类管理(如 Web、RPC、DB 等)。
实际实现类通常是
CtSph(Core Template Sph),正如你在上一个Env类中看到的:
javapublic static final Sph sph = new CtSph();
二、核心概念解释
1. Entry / AsyncEntry
- 每次调用
entry(...)方法,会创建一个Entry对象。 - 它代表一次对受保护资源的访问。
- 必须在业务逻辑结束后调用
entry.exit()(或 try-with-resources 自动关闭),否则会导致统计错误、内存泄漏。 AsyncEntry用于异步场景(如 CompletableFuture、Reactor),需要手动调用exit()或通过回调完成。
2. BlockException
- 如果触发了限流、熔断、系统保护等规则,会抛出
BlockException(或其子类,如FlowException,DegradeException等)。 - 开发者需捕获该异常并做降级处理(如返回默认值、记录日志等)。
3. EntryType(trafficType)
- 表示流量类型:
IN(入站流量,如 HTTP 请求)OUT(出站流量,如调用下游服务)
- 重要用途 :
SystemRule(系统自适应保护规则)只对IN类型的流量生效 。- 例如:当 CPU 使用率过高时,只拒绝新进来的请求,不影响内部调用或出站调用。
4. batchCount
- 表示本次调用消耗的"令牌数"或"请求数量"。
- 默认为 1(一次调用 = 一个请求)。
- 批量操作时可设为 N(如一次插入 10 条数据,则
batchCount=10)。
- Sentinel 的 QPS、线程数等规则会基于此值进行判断。
5. resourceType
- 资源分类标识(整数常量),用于区分不同类型的资源(如 Web 接口 vs Dubbo 服务)。
- 可配合自定义 Slot 实现分类统计或差异化规则。
- 常见值由
ResourceTypeConstants定义(如COMMON_WEB = 0,RPC = 1等)。
6. prioritized(优先级)
- 若设置为
true,即使当前资源被限流,高优先级请求仍可能被放行(需配置支持优先级的流控规则)。 - 适用于核心业务(如支付) vs 普通业务(如日志上报)。
7. args(参数)
- 用于热点参数限流(Parameter Flow Control)。
- Sentinel 会根据传入的参数值(如用户 ID、商品 ID)进行细粒度限流。
- 也支持自定义 Slot 使用这些参数做扩展逻辑。
三、方法分类说明
A. 基础方法(Sph 接口)
java
Entry entry(String name) throws BlockException;
- 最简单用法:仅指定资源名(如
"GET:/api/user")。 - 默认
trafficType = EntryType.OUT,batchCount = 1。
B. 带流量类型的方法
java
Entry entry(String name, EntryType trafficType);
- 明确指定是入站(
IN)还是出站(OUT)流量。 - 影响
SystemRule是否生效。
C. 带批量计数的方法
java
Entry entry(String name, EntryType trafficType, int batchCount);
- 适用于批量操作。
D. 带参数的方法(支持热点限流)
java
Entry entry(String name, EntryType trafficType, int batchCount, Object... args);
args会被传递给 Parameter Flow Slot 进行热点识别。
E. 带优先级的方法(1.4.0+)
java
Entry entryWithPriority(String name, ..., boolean prioritized);
- 高优先级请求可突破部分限流限制(需规则支持)。
F. 异步入口(AsyncEntry)
java
AsyncEntry asyncEntry(String name, ...);
- 用于异步编程模型,需手动管理生命周期。
G. 带 resourceType 的方法(SphResourceTypeSupport)
java
Entry entryWithType(String name, int resourceType, EntryType trafficType, ...);
- 在基础信息之上,增加资源分类,便于监控和规则分组。
四、典型使用示例
同步调用(Web 接口)
java
try (Entry entry = SphU.entry("GET:/user/{id}", EntryType.IN, 1, userId)) {
// 业务逻辑
return userService.getUser(userId);
} catch (BlockException ex) {
// 降级处理
return defaultUser;
}
异步调用
java
AsyncEntry entry = null;
try {
entry = SphU.asyncEntry("asyncTask", EntryType.OUT, 1);
CompletableFuture.runAsync(() -> {
try {
// 异步任务
} finally {
entry.exit(); // 必须手动 exit
}
});
} catch (BlockException e) {
// 限流处理
}
五、设计思想总结
| 设计点 | 说明 |
|---|---|
| 统一入口 | 所有资源保护都通过 Sph 接口,便于插件化(Slot Chain) |
| 灵活扩展 | 通过 resourceType, args, prioritized 支持多种场景 |
| 语义清晰 | trafficType 区分流量方向,精准控制系统保护范围 |
| 异步支持 | 提供 AsyncEntry 适配现代异步编程 |
| 安全退出 | 强制要求 entry.exit(),避免统计错误 |
六、补充:SphU 工具类
实际开发中,你通常不会直接调用 Env.sph.entry(...),而是使用工具类:
java
import com.alibaba.csp.sentinel.SphU;
SphU.entry("myResource");
SphU 内部就是调用 Env.sph 的各种方法,提供了更简洁的静态 API。
✅ 总结一句话 :
Sph 接口是 Sentinel 的"守门人",所有受保护的资源都必须通过它登记(entry),Sentinel 会在此过程中执行规则检查、指标统计,并在必要时抛出 BlockException 实现流量控制。而 SphResourceTypeSupport 则为其增加了资源分类能力,使保护策略更精细化。