Spring Cloud Gateway 与负载均衡局部实验
公开入口,仓库根目录,JDK21/Maven3.9/Python3,外加一个已在本机运行的真实 Redis(限流用例的后端):
python3 labs/cloud-gateway/run.py --redis-port=6391不传 --redis-port 时读 U32_REDIS_PORT,默认 6379。入口先 PING,连不上直接退出且不写成功证据;它不启动、不重启、不改 Redis 配置。
教材:Cloud发现与负载均衡、Gateway路由、Gateway可靠性、Gateway多种形态。
公开工程:根 POM、runner、WebFlux 应用与路由、WebFlux HTTP 测试、受控上游、本地目录、JWT 材料、限流资源、Redis 链路、MVC 应用、Proxy MVC 应用、Proxy WebFlux 应用、运行证据。
四个模块是四个独立进程与独立 POM,只由根 POM 聚合;没有把 Server MVC 与 Server WebFlux 的 starter 混进同一个 classpath。
| 模块 | 真实运行入口 | 实际观察 |
|---|---|---|
webflux | Reactor Netty 随机端口 + 受控 loopback 上游 + 本机 Redis | 路由/谓词/过滤链顺序、路径与头改写、转发头清除、JWT 身份与下游二次校验、Redis 令牌桶限流与故障放行、响应头超时与流式 body、3 次重试=4 次尝试、健康探活与目录缓存、管理端点只读与指标计数 |
mvc | Tomcat 随机端口 + loopback 上游 | WebMvc.fn 路由、rewritePath、敏感头移除、after 响应头、无实例 503、上游 200→503→200 恢复 |
proxy-mvc | Tomcat + ProxyExchange 参数解析器 | 路径/查询/body 映射、skipped 头排除、forward 本地派发、坏前缀 400、上游 200→503→200 恢复 |
proxy-webflux | Reactor Netty + ProxyExchange(WebClient) | 路径/查询/body 映射、skipped 头排除、forward() 远端 POST、坏前缀 400、上游 200→503→200 恢复;body 改写与头策略不继承 Server 路由工厂 |
15 个测试全部为真实 socket HTTP:没有 MockServerWebExchange、没有对选择方法内部调用、没有用 stub 冒充 Redis。JWT 由本机 RSA 私钥签发,是资源服务器边界,不是 IdP;管理端点的 ops 权限是本地合成凭据。
本机环境(一次运行的实际值)
Oracle JDK 21.0.5(/usr/libexec/java_home -v21)、Maven 3.9.9、macOS 26.7.1 x86_64;Boot 4.0.9、Cloud 2025.1.4、Gateway 5.0.4;Redis 8.2.1(127.0.0.1:6391,--save '' --appendonly no,无持久化)。实际解析版本、退出码、观察行与文件 SHA-256 见入口生成的 evidence/u32-*.json。
webflux/pom.xml 的 macos-arm64 profile 只在 Apple Silicon 生效;x86_64 机器不激活它,也不影响本实验(Netty 使用 JDK 自带解析器)。
边界
- 发现数据源是可控合成目录(
LabDirectory+LabLoadBalancer),用于观察 supplier 链、缓存与探活分支;它不证明 Eureka/Consul/ZooKeeper/Kubernetes 的协议、集群或一致性。真实注册中心适配见 U35/U40。 - 限流后端是本机 Redis 单实例;没有集群、哨兵、故障转移或跨副本配额。每副本各自计数的事实由正文推导,不由本实验证明。
- 无生产网关、无压测、无网络分区、无 TLS;容量与恢复结论是模型和配置推导。
- 管理端点只读、指标计数、401/403/404 由真实 HTTP 观察;生产环境应另配网络隔离与独立管理端口。
- 只使用合成数据与 loopback;Redis 只写本实验独有的
request_rate_limiter.{<随机 routeId>.<用户>}键,并在用例内删除后逐键EXISTS复核。不扫描全库、不FLUSH、不改用户配置。
已知未运行
真实注册中心(Eureka/Consul/ZK/K8s/Vault)与集群摘流、Gateway 集群与配置中心动态路由、Redis 集群与限流跨副本、TLS/双向 TLS、WebSocket/gRPC 代理、Sentinel/Resilience4j 与 Gateway 的组合、MVC 与 Proxy 的压测与容量,均未在本实验运行;对应结论按各票教材标注为源码/配置推演或待验证。