第 17 章 · PaaS 衔接与框架选型结业
本章目标:回顾 gin-web 全 17 章知识地图;对比 Go/Gin vs Python/FastAPI vs Java/Spring Boot 选型;说明与 paas ch17 gin-shop、xiaozi-cloud 的衔接;完成 100 分结业验收表;明确 Go 在云原生路径中的定位;对标 fastapi-web ch19 结业深度。
学时建议:4~6 小时(含 1 小时复盘 + 1 小时 paas ch17 导读)
前置:完成 gin-web ch16;选修 paas ch02~ch05、go-dev ch09~ch10。
17.1 全模块学习路径
go-dev(语言 + 并发 + 错误 + toolkit-go CLI)
↓
gin-web(api-go-demo:REST + JWT + Redis + Docker + metrics)
↓
paas ch17(K8s 内 gin-shop + NestJS:MySQL/Redis/Kafka/Nacos…)
↓
xiaozi-cloud / ops-deploy(集群发布、HPA、告警)
↓
architecture / spring-cloud-web(微服务对照,选修)
你已具备:从 main.go 到 /metrics 到 Dockerfile 的完整 Go API 交付能力。
17.2 gin-web 全章节知识地图
| 章 | 主题 | api-go-demo 产出 |
|---|---|---|
| ch01 | Gin 入门 | 项目骨架、/health |
| ch02 | 路由与中间件 | RequestID、分组 |
| ch03 | 配置 | Viper、十二要素 |
| ch04 | GORM | Product slug + is_published + price 分 |
| ch05 | 分层 | Handler/Service/Repository |
| ch06 | JWT | Bearer、bcrypt |
| ch07 | 校验与 Envelope | validator、统一 JSON |
| ch08 | zap 日志 | access、panic recovery |
| ch09 | Redis 缓存 | Cache-Aside、击穿/穿透 |
| ch10 | 消息队列 | Redis Stream、Worker |
| ch11 | swaggo | /swagger/index.html |
| ch12 | 性能 | 连接池、pprof、N+1 |
| ch13 | Prometheus | /metrics RED |
| ch14 | 测试 | httptest、testify、sqlmock |
| ch15 | Docker | 多阶段、nonroot、HEALTHCHECK |
| ch16 | 毕业 MVP | 逐文件 walkthrough、100 分 |
| ch17 | 结业 | 选型、paas 衔接(本章) |
17.3 与 paas ch17 分工
| 内容 | gin-web(本模块) | paas ch17 gin-shop |
|---|---|---|
| Gin 路由、中间件、分层 | ✅ ch02~ch05 | 工程结构对照 |
| GORM / JWT / Redis | ✅ ch04~ch09 | 集群 DNS + Secret 注入 |
| Kafka / RabbitMQ | 概念 + Redis Stream ch10 | Sarama / amqp091-go 完整代码 |
| Nacos / MinIO / Keycloak | 选型提及 | 完整集成清单 |
| Elasticsearch / MongoDB | — | NestJS/Gin 双栈示例 |
| Dockerfile | ✅ ch15 | K8s Deployment / Ingress YAML |
| Prometheus | ✅ ch13 应用埋点 | ServiceMonitor、告警路由 |
| 域名 | api.example.com | *.svc.cluster.local |
原则:gin-web 教会「怎么写 Go API」;paas ch17 教会「怎么在 K8s 里接全部 PaaS 组件」。
paas ch17 集群 DNS(必读)
mysql.data.svc.cluster.local:3306
redis.data.svc.cluster.local:6379
rabbitmq.middleware.svc.cluster.local:5672
kafka.middleware.svc.cluster.local:9092
nacos.middleware.svc.cluster.local:8848
minio.data.svc.cluster.local:9000
keycloak.security.svc.cluster.local:8080
api-go-demo 本地 DATABASE_URL 改一行 DSN 即可迁移到 gin-shop——代码结构无需重写。
衔接练习(1 小时)
- 阅读 paas ch17 17.1 工程结构对照
gin-shop/ - 找出
go-redis与gorm初始化与 gin-web ch04/ch09 差异(仅配置来源) - 列出 paas 比 gin-web 多接的 3 个组件(如 Kafka、Nacos、Keycloak)
17.4 三语言 Web 栈全面对照
| 维度 | Gin(api-go-demo) | FastAPI(svc-demo) | Spring Boot(shop-spring) |
|---|---|---|---|
| 语言 | Go 静态编译 | Python | Java/Kotlin JVM |
| 部署单元 | 单二进制 | uvicorn + venv | fat JAR |
| 内存占用 | 低 | 中 | 中高 |
| 启动速度 | 毫秒级 | 秒级 | 秒~十秒级 |
| HTTP 性能 | 高(原生 goroutine) | 高 async IO | 中高(线程池) |
| 类型 | 编译期 static | Pydantic 运行时 | 静态 + Bean Validation |
| API 文档 | swaggo → /swagger/index.html | 内置 /docs | SpringDoc OpenAPI |
| ORM | GORM | SQLAlchemy async | JPA/Hibernate |
| 依赖注入 | 手工 wiring / wire 选修 | Depends | @Autowired |
| 商品字段 | slug, is_published, price 分 | 同(ch12 演进) | 同(shop-spring) |
| 缓存 | go-redis | fastapi-cache2 | Spring Cache + Redis |
| 消息 | Stream / 概念 Kafka | Celery | @KafkaListener |
| 可观测 | zap + Prometheus | structlog + instrumentator | Logback + Micrometer |
| 容器镜像 | < 30MB distroless | 200MB+ | 200MB+ JRE |
| 典型场景 | 网关、BFF、高 QPS | AI/ML API、脚本快迭代 | 企业域模型、Spring Cloud |
真实瓶颈多在 DB/缓存/N+1,非语言本身。三栈教学项目使用同一商品契约便于横向对比。
17.5 选型决策树
需要最高 QPS / 最小镜像 / 单文件部署?
└─► Go + Gin(api-go-demo)
否则主要是 JSON API 微服务?
├─ 团队 Python + 要快 OpenAPI + async IO → FastAPI(svc-demo)
├─ 团队 Java + 复杂域 + Spring 生态 → Spring Boot(shop-spring)
└─ 需内置 Admin + 全家桶 → Django(django-web)
L3 实战 / 多栈联调?
└─ 任选其一 + paas ch17 集群组件(cert-l3)
| 选 Gin | 选 FastAPI | 选 Spring |
|---|---|---|
| 云原生 Sidecar | ML/AI 服务 | ERP/电商存量 Java |
| 资源敏感 K8s | 快速 MVP | Spring Cloud 微服务 |
| api-go-demo 类 | svc-demo 类 | shop-spring 类 |
17.6 面试常问与回答要点
| 面试题 | 要点 |
|---|---|
| Gin vs FastAPI 性能? | 两者 IO 都快;Go 内存更低;Profile DB 先 |
| 为什么 price 用分? | int64 避免 float;支付/对账行业惯例 |
| JWT 无状态如何注销? | 短 TTL + refresh;Redis 黑名单 |
| 缓存一致性? | Cache-Aside 写后 Del;可选延迟双删 |
| N+1 怎么查? | GORM Preload;SQL 条数审计 |
| /metrics 为何不能公网? | 信息泄露;Nginx 白名单 |
| Gin 还要学 Spring Cloud 吗? | 微服务治理 Java 主流;Go 常做网关/高性能服务 |
| 与 paas 关系? | gin-web 写代码;paas 接 K8s 全组件 |
17.7 api-go-demo 能力复盘清单
完成 ch16 后,你应能不看代码回答:
| # | 问题 | 期望答案关键词 |
|---|---|---|
| 1 | 创建商品谁可以? | admin JWT |
| 2 | 列表为何看不到 draft? | is_published=true |
| 3 | 6800 含义? | 68.00 元,int64 分 |
| 4 | slug 详情缓存 key? | product:slug:{slug} |
| 5 | PATCH 后缓存? | Del key |
| 6 | 上架异步? | Redis Stream + worker |
| 7 | 文档 URL? | /swagger/index.html |
| 8 | 健康与指标? | /health /metrics |
| 9 | 容器用户? | nonroot |
| 10 | 调用链? | handler → service → repo |
17.8 100 分结业验收表
复制到 docs/GRADUATION_REVIEW.md(全模块选修,不影响 ch16 答辩):
| # | 维度 | 检查项 | 分值 | 自评 |
|---|---|---|---|---|
| 1 | 语言基础 | 能读 go-dev 并发章节的 channel 示例 | 8 | /8 |
| 2 | Gin 核心 | 中间件顺序、路由分组 | 8 | /8 |
| 3 | 数据模型 | slug + is_published + price 分 | 10 | /10 |
| 4 | 分层架构 | handler/service/repo 职责 | 10 | /10 |
| 5 | 安全 | JWT + RBAC 两角色 | 10 | /10 |
| 6 | Redis | Cache-Aside + TTL + 失效 | 10 | /10 |
| 7 | 异步 | Stream 或说出 Kafka 差异 | 6 | /6 |
| 8 | 文档 | Swagger 可交互 | 6 | /6 |
| 9 | 性能 | 连接池 + 知 N+1 | 8 | /8 |
| 10 | 可观测 | RED + /health | 8 | /8 |
| 11 | 测试 | go test 通过 ≥5 用例 | 6 | /6 |
| 12 | 交付 | Docker nonroot + compose | 10 | /10 |
| 选修 | paas ch17 | 说出 3 个 K8s 组件 DNS | +5 | +__/5 |
| 选修 | 三栈对比 | 5 分钟口述 Gin/FastAPI/Spring | +5 | +__/5 |
| 选修 | xiaozi-cloud | 读懂 Deployment YAML | +5 | +__/5 |
- ≥80 分:gin-web 模块结业合格
- ≥90 分:优秀
- 选修加分封顶 +15,汇报封顶 115
17.9 与 xiaozi-cloud / ops-deploy 衔接
| 阶段 | 你已有能力 | 云原生课补充 |
|---|---|---|
| 镜像 | Dockerfile push 到 registry.example.com | Harbor / 镜像扫描 |
| 编排 | docker compose 五服务内网 | K8s Deployment + Service |
| 配置 | .env / Secret 概念 | ConfigMap + Secret 挂载 |
| 入口 | Nginx 反代 | Ingress + TLS cert-manager |
| 伸缩 | — | HPA CPU / 自定义 metrics |
| 监控 | /metrics 应用埋点 | Prometheus Operator、告警 |
推荐路径:gin-web ch16 答辩通过 → paas ch17 在集群部署 gin-shop → xiaozi-cloud 生产模拟。
17.10 三栈同端点对照(商品详情)
| 栈 | 路径 | 标识字段 | 价格 |
|---|---|---|---|
| Gin api-go-demo | GET /api/v1/products/:slug | slug | int64 分 |
| FastAPI svc-demo | GET /api/v1/products/{id} 或 slug | slug(ch12+) | Decimal / 分 |
| Spring shop-spring | GET /api/v1/products/{slug} | slug | BigDecimal / 分 |
| Django shop-demo | GET /api/products/{slug}/ | slug | DecimalField |
前端 user-demo 只需切换 API_BASE 即可联调不同后端——契约对齐是 L3 核心。