Spring Cloud vs 云原生:两种架构对比
1. 核心差异
| 维度 | Spring Cloud 模式 | 云原生模式 |
|---|
| 网关职责 | 网关大包大揽:路由 + JWT + 授权 + 身份透传 | 网关只做入口安全:路由 + JWT 验签 + 限流 |
| 授权位置 | 网关统一授权(GatewayAuthorizationManager) | 各服务自行授权(从 JWT 取身份,自己判断) |
| 服务间通信 | Feign(HTTP/1.1 + JSON) | gRPC(HTTP/2 + Protobuf) |
| 服务发现 | Nacos(Java,几百 MB) | etcd(Go,几十 MB,K8s 标准) |
| 消息队列 | RocketMQ(Java,几百 MB) | NATS(Go,~20MB,CNCF 标准) |
| 部署方式 | JAR + JVM(~300MB) | 原生二进制(~15MB) |
| 可观测性 | Spring Actuator + 自建 | Prometheus + Loki + OpenTelemetry(CNCF 标准) |
| 安全模型 | 边界信任(内网安全) | 零信任(每次请求都验证) |
2. 两种模式没有绝对好坏,取决于场景
什么时候 Spring Cloud 好?
| 场景 | 原因 |
|---|
| 团队全是 Java 工程师 | 零学习成本,Spring 生态成熟 |
| 大公司,已有完善基础设施 | 服务器管够,不在乎几百 MB 内存 |
| 业务复杂,需要快速迭代 | Spring Cloud Gateway + Spring Security 开箱即用 |
| 不需要弱设备 | 只在云服务器上跑 |
什么时候云原生好?
| 场景 | 原因 |
|---|
| 盒子/弱设备部署 | Go 二进制 ~15MB,内存 1GB 够用 |
| 多语言团队(Go + Java) | gRPC 跨语言,各自独立 |
| 追求资源利用率 | 内存从 2GB+ 降到 600MB |
| 面试/简历需要 | CNCF 标准,面试官认可 |
3. 为什么你的场景不适合 Spring Cloud
你当前 Spring Cloud 的架构放在云服务器上完全没问题,问题在于你要跑盒子:
| 组件 | 内存 | 盒子 1GB 能跑? |
|---|
| Nacos | ~300MB | ❌ |
| RocketMQ | ~300MB | ❌ |
| ES | ~500MB | ❌ |
| 网关(JVM) | ~200MB | ❌ |
| 每个 Java 服务 | ~200MB | ❌ |
| 合计 | 2GB+ | ❌ |
换成云原生后:
| 组件 | 内存 | 盒子 1GB 能跑? |
|---|
| etcd | ~50MB | ✅ |
| NATS | ~20MB | ✅ |
| Redis | ~100MB | ✅ |
| Traefik | ~30MB | ✅ |
| 每个 Go 服务 | ~15MB | ✅ |
| 业务合计 | ~230MB | ✅ |
4. 结论
Spring Cloud 没有错,只是不适合你的场景。
你现在做的事就是从"一个正确的架构"迁移到"另一个正确的架构",因为你的部署目标变了(从云服务器变成了盒子设备)。