云与设计模式
IaC、容器、CI/CD、Mesh。
云与设计模式
这一课你将能做到
- 写出本站的 Dockerfile 和 K8s Deployment 清单,理解每个字段的作用
- 设计一条完整的 CI/CD 流水线:代码提交到生产发布的全部环节
- 说出至少 5 个云设计模式(熔断、重试、舱壁等)并说明本站哪里用得上
为什么要学
云原生改变了架构的边界条件:以前「加服务器」要采购流程几个月,现在一条命令扩容 10 台。架构师必须理解云的能力边界,才能设计出「弹得起、挂不了、回得去」的系统。
人话:传统部署像自己盖房子——一砖一瓦都自己管;云像住酒店——房间随便换、保洁有人做,但你得遵守酒店的规矩(无状态、可中断、声明式配置)。
先建立图像
本站上云演进路线:
【阶段一:单机部署】 【阶段二:容器化】
一台 ECS: Dockerfile → 镜像仓库
├── java -jar app.jar K8s 集群:
├── MySQL ├── Deployment(app) × 3 副本
├── Redis ├── Service(负载均衡)
└── Nginx ├── HPA(CPU>70% 自动扩容)
└── RDS + 云 Redis(托管)
【阶段三:完整云原生】
GitHub Push → CI(测试/构建镜像) → CD(金丝雀发布)
→ 监控(Prometheus) → 告警 → 自动回滚
跟着做
步骤 1:容器化本站应用
# 多阶段构建:编译和运行分离,镜像从 500MB 降到 200MB
FROM maven:3.9-eclipse-temurin-21 AS build
COPY pom.xml .
COPY src ./src
RUN mvn package -DskipTests
FROM eclipse-temurin:21-jre-alpine
WORKDIR /app
COPY --from=build target/app.jar app.jar
# 关键:非 root 运行 + JVM 容器感知
USER 1000
ENTRYPOINT ["java", "-XX:MaxRAMPercentage=75", "-jar", "app.jar"]
步骤 2:K8s 部署清单
apiVersion: apps/v1
kind: Deployment
metadata:
name: course-service
spec:
replicas: 3 # 3 副本保证高可用
strategy:
rollingUpdate:
maxSurge: 1 # 滚动更新:先多启 1 个
maxUnavailable: 0 # 全程不减少可用实例
template:
spec:
containers:
- name: app
image: registry/course-service:v1.2.0
resources:
requests: # 调度依据:保证分到的资源
cpu: 500m
memory: 512Mi
limits: # 上限:防止吃光节点
cpu: "1"
memory: 1Gi
readinessProbe: # 就绪探针:没就绪不接流量
httpGet:
path: /actuator/health/readiness
port: 8080
livenessProbe: # 存活探针:挂了自动重启
httpGet:
path: /actuator/health/liveness
port: 8080
步骤 3:CI/CD 流水线
代码 Push
→ 阶段1 构建:编译 + 单元测试(失败即终止)
→ 阶段2 质检:SonarQube 扫描 + 依赖漏洞检查
→ 阶段3 打包:docker build + 推镜像仓库(tag 用 commit hash)
→ 阶段4 部署测试环境:自动部署 + 接口自动化测试
→ 阶段5 生产金丝雀:先发布 1 个副本 → 观察 10 分钟指标
→ 阶段6 全量:无异常则滚动更新全部;有异常自动回滚