Sentinel 规则语义与适配实验(U37)
仓库根目录的公开入口:
python3 labs/sentinel/run.py需要 Python 3.8+、JDK 21 和 Maven 3.9.x。可用 JAVA_HOME 指定 JDK、MAVEN_BIN 指定 Maven 可执行文件;macOS 未设置 JAVA_HOME 时通过 /usr/libexec/java_home -v 21 选择 JDK。首次解析 Maven 依赖需要网络(本机 ~/.m2 无 Sentinel 1.8.9,从 Maven Central 拉取)。不连接 Sentinel Dashboard、Nacos、Redis 或任何外部服务。
本目录是一个 Maven 模块:pom.xml、公开 runner、规则语义测试、数据源与注解测试、SCA starter 集成测试。对应 Issue 74 与 PRD L07/E。
教材:Sentinel 规则与隔离边界。
组件与观察边界
12 个测试全部运行在单个 Surefire fork(一个 JVM)内,直接调用 Sentinel 1.8.9 的公开 API(SphU、ContextUtil、*RuleManager、FileRefreshableDataSource、SentinelResourceAspect)并观察返回的 Entry/Node/异常类型与状态机。没有启动任何进程、容器或外部依赖服务;规则通过内存 API 或本地临时文件装载,不是 Dashboard 或配置中心推送。
| 组件 | 实际实现与用途 |
|---|---|
| Sentinel core | 1.8.9 固定 tag(commit d75a6687);slot 链、滑动窗口、流控/熔断行为全部来自该版本真实字节码 |
| parameter-flow-control | 1.8.9 扩展模块,经 SPI 把 ParamFlowSlot(order -3000)插入默认链 |
| 数据源 | FileRefreshableDataSource 读取真实临时文件,热更新周期缩到 100ms,观察属性监听器收到新值 |
| 注解 | 真实 SentinelResourceAspect + Spring AOP CGLIB 代理,blockHandler/fallback/exceptionsToIgnore 三条路径 |
| SCA starter | spring-cloud-starter-alibaba-sentinel 2025.1.0.0 与 spring-cloud-circuitbreaker-sentinel 2025.1.0.0(groupId com.alibaba.cloud),在 Boot 4.0.9 上启动最小无 Web ApplicationContext |
通过只说明固定版本下这些测试输入的行为。Dashboard 推送、Nacos/Apollo/ZooKeeper 数据源、token server、集群流控、Web 容器拦截器与 Feign/网关适配均未运行。
用例与预期观察
以下是用例要求的行为;本次是否通过以 runner 生成的运行证据为准。测试名称固定在 runner 的 EXPECTED_CLASSES,观察行固定在 MARKERS,两者均与 Surefire/进程输出核对。
| 测试方法 | 操作与预期结果 | 观察行 |
|---|---|---|
entryAndContextPairing | 两个 Context 对同一资源各产生 1 个 DefaultNode、共享 1 个 ClusterNode;乱序 exit 抛 ErrorEntryFreeException | U37 entryContext=PASS |
slotChainOrderAndSilentOverflow | 默认链顺序 NodeSelector→ClusterBuilder→Log→Statistic→Authority→System→ParamFlow→Flow→DefaultCircuitBreaker→Degrade;MAX_CONTEXT_NAME_SIZE=2000、MAX_SLOT_CHAIN_SIZE=6000 | U37 slotChain=PASS |
slidingWindowAndTracerAccounting | Tracer.trace 后 exit 计异常;不 trace 的异常不计入(负控) | U37 slidingWindow=PASS |
flowQpsFastRejectAndPrioritized | QPS>阈值默认快拒(毫秒级);entryWithPriority 占用下一窗口排队后放行 | U37 flowQps=PASS |
threadIsolationWithoutQueueing | THREAD 级在并发数达阈值时立即拒绝,无排队舱语义;退出后恢复 | U37 flowThread=PASS |
warmUpRampAndThrottlingSpacing | WarmUp coldFactor=3 冷启动拒高负载、桶冷却后放行;ThrottlingController 6 次通过间隔约 500ms,超 maxQueueingTimeMs 拒绝 | U37 warmupThrottle=PASS |
degradeStrategiesAndHalfOpenProbe | RT/异常比例两种策略按默认 minRequestAmount=5 打开;半开期只放 1 个探测,探测成功关闭、并发第二请求被拒(对照 R4j N 次窗口) | U37 degrade=PASS |
paramFlowItemThresholdsAndBurst | 热点参数阈值按值隔离、exclusive item 覆盖规则级 count、burstCount 扩容、负索引换算、越界索引与无参放行 | U37 paramFlow=PASS |
systemRuleInOnlyAndAuthorityList | SystemRule 仅拦 EntryType.IN;Authority WHITE/BLACK 按逗号列表与空 origin 放行 | U37 systemAuthority=PASS |
fileDataSourceHotReload | 修改临时文件后 100ms 轮询周期内监听器收到新值,连续两次修改各产生一次更新 | U37 fileDatasource=PASS |
sentinelResourceAnnotation | QPS=0 规则下 blockHandler 接管 BlockException;业务异常经 fallback;exceptionsToIgnore 直抛不走 fallback | U37 annotation=PASS |
starterDependencyResolution | SCA starter 在 Boot 4.0.9 可解析,最小无 Web 上下文启动并注册 sentinelResourceAspect/sentinelDataSourceHandler | U37 starterBoot4=PASS(启动失败则 INCOMPATIBLE-DEDUCED) |
starterBoot4 允许两种取值:最小上下文真实启动成功记 PASS;启动抛异常时测试不失败,而打印 INCOMPATIBLE-DEDUCED 由 runner 按唯一性核对——此时结论只能由依赖树推演,README 与证据的 limits 会保留该边界。
版本与运行记录
固定组合为 Boot 4.0.9、Cloud release train 2025.1.4、Cloud Alibaba BOM 2025.1.0.0、Sentinel 1.8.9、aspectjweaver 1.9.25.1。runner 同时核对 POM 声明与 Maven 解析结果;任何 com.alibaba.csp:sentinel-* 工件不是 1.8.9(尤其是 1.8.6)即失败。
Surefire 的 argLine 把 Sentinel 日志重定向到 target/sentinel-logs;runner 验证 ~/logs/csp 没有本次新增文件,把日志复制进运行目录后删除 target/sentinel-logs。
runner 执行单模块 clean test,随后核对三个测试类的本轮 Surefire 报告、12 个测试名称/总数、失败/错误/跳过计数,以及 11 条固定 U37 …=PASS 观察行加 1 条 U37 starterBoot4=。报告缺失/陈旧、测试数减少、测试跳过、观察行缺失/重复、依赖版本不符、命令超时、进程清理失败或运行期间源码改变,均不得产生成功状态。
证据固定写入 evidence/u37-2026-10-28.json,包含开始/结束时间、输入、每条命令与退出码、观察行、实际依赖版本、Surefire 名称/计数、实验文件与日志的 SHA-256。只有 status=passed 且 exitCode=0 的完整记录表示该次验证通过;README 和预期观察本身不代表已经实跑。
原始日志、命令状态、Surefire XML 副本、Sentinel 日志副本及依赖清单保存在仓库外:
~/.cache/software-engineering-study/java-depth-impl/u37/run-<随机目录>/每次执行先将证据标为 running,完成后原子替换为 passed 或 failed;失败会覆盖上一轮成功状态,保留该轮日志路径。强杀 runner 时可能只留下 running,也不能视为成功。测试阶段和依赖解析各限时 600 秒,超时返回 124;SIGINT/SIGTERM 分别返回 130/143。runner 对自己创建的进程组先发 TERM,再在有界宽限后发 KILL。
未运行范围
- Sentinel Dashboard、规则推送/拉取通道、生产 token server 与集群流控。
- Nacos、Apollo、ZooKeeper、Redis 等外部数据源;只运行本地文件数据源。
- WebMvc/WebFlux 容器拦截器、Feign 适配、Spring Cloud Gateway 适配(SCG 4.x adapter 与基线 5.0.4 错配,属推演)。
- SCA starter 在 Servlet/Reactive Web 应用中的完整装配;starterBoot4 只覆盖最小无 Web 上下文。
- 多节点一致性与生产容量/压测;所有阈值均为合成小数值,时序断言留有余量但不构成性能承诺。
规则与观察全部使用合成数据与本地临时文件;上述项目均未在本实验运行,也不因单 JVM 内测试通过而获得验证。