2.5 实战演练:多语言微服务应用的全栈部署与多环境治理
1. 引言:从理论到实战的“最后一公里”
前面几节我们学习了 Dockerfile、ConfigMap、Helm、MySQL Operator 等零散的知识点。现在,是时候把它们串起来了。
本节我们将模拟一个真实的电商场景:Sock Shop(袜子商店)。
这是一个经典的多语言微服务 Demo,包含:
- Frontend(Node.js): 面向用户的 Web 页面。
- Catalogue(Go): 商品目录服务,通过 MySQL 存储数据。
- Cart(Java): 购物车服务,通过 Redis 存储数据。
我们将挑战全栈部署:从源代码开始,构建镜像,编写 Helm Chart,配置 Ingress,并实现 Dev/Prod 的多环境治理。
2. 架构设计与环境规划
2.1 应用架构图
2.2 环境规划
我们遵循“基于目录”的环境治理策略(参考 1.4 节)。
Dev 环境:
- Namespace:
sock-shop-dev - DB: 使用轻量级 SQLite (Go 服务内置) 或 共享开发库。
- Replicas: 1
- Ingress:
dev.sock-shop.com
- Namespace:
Prod 环境:
- Namespace:
sock-shop-prod - DB: 独立的 MySQL 集群。
- Replicas: 3 (开启 HPA)
- Ingress:
www.sock-shop.com
- Namespace:
3. 第一步:应用容器化 (Polyglot Dockerizing)
我们需要为三个服务分别编写 Dockerfile。
3.1 Catalogue Service (Go)
使用多阶段构建,极致精简。
FROM golang:1.19 AS builder WORKDIR /src COPY . . RUN CGO_ENABLED=0 go build -o catalogue FROM scratch COPY --from=builder /src/catalogue /app/catalogue EXPOSE 8080 CMD ["/app/catalogue"]3.2 Frontend Service (Node.js)
注意处理node_modules缓存。
FROM node:16-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --only=production # 仅安装生产依赖 COPY . . EXPOSE 8079 CMD ["npm", "start"]3.3 Cart Service (Java Spring Boot)
使用 OpenJDK 和非 root 用户。
FROM maven:3.8-openjdk-11 AS builder # ... mvn package ... FROM openjdk:11-jre-slim USER 1000 COPY --from=builder /app/target/cart.jar /app.jar CMD ["java", "-jar", "/app.jar"]4. 第二步:编写通用 Helm Chart
我们将创建一个名为sock-shop-microservice的通用 Chart,适用于这三个服务。
为什么要通用?因为它们的 K8s 结构大同小异(Deployment + Service)。
templates/deployment.yaml:
apiVersion:apps/v1kind:Deploymentmetadata:name:{{