系列导读:本篇将深入讲解云原生架构的核心设计模式与最佳实践。
文章目录
-
- 一、云原生概述
-
- [1.1 云原生定义](#1.1 云原生定义)
- [1.2 云原生架构特征](#1.2 云原生架构特征)
- 二、核心设计模式
-
- [2.1 Sidecar 模式](#2.1 Sidecar 模式)
- [2.2 Ambassador 模式](#2.2 Ambassador 模式)
- [2.3 Adapter 模式](#2.3 Adapter 模式)
- 三、弹性设计模式
-
- [3.1 重试模式](#3.1 重试模式)
- [3.2 断路器模式](#3.2 断路器模式)
- [3.3 舱壁模式](#3.3 舱壁模式)
- [3.4 限流模式](#3.4 限流模式)
- 四、数据设计模式
-
- [4.1 CQRS 模式](#4.1 CQRS 模式)
- [4.2 事件溯源模式](#4.2 事件溯源模式)
- [4.3 Saga 模式](#4.3 Saga 模式)
- 五、最佳实践
-
- [5.1 12-Factor App](#5.1 12-Factor App)
- [5.2 健康检查](#5.2 健康检查)
- [5.3 优雅关闭](#5.3 优雅关闭)
- 总结
一、云原生概述
1.1 云原生定义
┌─────────────────────────────────────────────────────────────┐
│ 云原生核心要素 │
├─────────────────────────────────────────────────────────────┤
│ 📦 容器化:Docker、containerd │
│ 🔄 编排调度:Kubernetes │
│ 🌐 服务网格:Istio、Linkerd │
│ ⚡ 不可变基础设施:基础设施即代码 │
│ 📊 声明式 API:YAML 配置 │
└─────────────────────────────────────────────────────────────┘
1.2 云原生架构特征
| 特征 | 说明 |
|---|---|
| 弹性伸缩 | 自动扩缩容 |
| 故障自愈 | 自动恢复 |
| 可观测性 | 监控、日志、追踪 |
| 持续交付 | 自动化部署 |
| 松耦合 | 服务独立 |
二、核心设计模式
2.1 Sidecar 模式
yaml
# Sidecar 容器示例
apiVersion: v1
kind: Pod
metadata:
name: app-with-sidecar
spec:
containers:
- name: app
image: myapp:v1
ports:
- containerPort: 8080
- name: sidecar
image: log-collector:v1
volumeMounts:
- name: logs
mountPath: /var/log
volumes:
- name: logs
emptyDir: {}
2.2 Ambassador 模式
┌─────────────────────────────────────────────────────────────┐
│ Pod │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Application │◄──►│ Ambassador │ │
│ │ Container │ │ (代理) │ │
│ └─────────────┘ └─────────────┘ │
│ │ │
│ ▼ │
│ 外部服务连接 │
└─────────────────────────────────────────────────────────────┘
2.3 Adapter 模式
yaml
# Adapter 容器示例
containers:
- name: app
image: myapp:v1
ports:
- containerPort: 8080
- name: adapter
image: metrics-adapter:v1
# 将应用指标转换为标准 Prometheus 格式
三、弹性设计模式
3.1 重试模式
java
// 重试配置
@Retryable(
value = {ServiceUnavailableException.class},
maxAttempts = 3,
backoff = @Backoff(delay = 1000, multiplier = 2)
)
public Order getOrder(String orderId) {
return orderClient.getOrder(orderId);
}
3.2 断路器模式
java
// 断路器配置
@CircuitBreaker(
name = "orderService",
fallbackMethod = "getOrderFallback"
)
public Order getOrder(String orderId) {
return orderClient.getOrder(orderId);
}
public Order getOrderFallback(String orderId, Exception e) {
return new Order(orderId, "默认订单", 0);
}
3.3 舱壁模式
yaml
# 线程池隔离
resilience4j:
threadpool:
orderService:
coreThreadPoolSize: 10
maxThreadPoolSize: 20
queueCapacity: 100
3.4 限流模式
java
// 限流配置
@RateLimiter(name = "orderService")
public Order createOrder(OrderRequest request) {
return orderService.create(request);
}
四、数据设计模式
4.1 CQRS 模式
┌─────────────────────────────────────────────────────────────┐
│ CQRS 架构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ Command (写) Query (读) │
│ ┌─────────┐ ┌─────────┐ │
│ │ Command │ │ Query │ │
│ │ Handler │ │ Handler │ │
│ └────┬────┘ └────┬────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────┐ ┌─────────┐ │
│ │ Write DB│ │ Read DB │ │
│ └─────────┘ └─────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
4.2 事件溯源模式
java
// 事件存储
public class EventStore {
public void append(String aggregateId, List<Event> events) {
events.forEach(event -> {
EventEntry entry = new EventEntry(
aggregateId,
event.getType(),
JSON.toJSONString(event),
LocalDateTime.now()
);
eventRepository.save(entry);
});
}
}
4.3 Saga 模式
Saga 编排模式:
订单服务 ──► 支付服务 ──► 库存服务 ──► 物流服务
│ │ │ │
│ │ │ │
▼ ▼ ▼ ▼
成功 成功 失败 回滚
│ │ │ │
│ │ └─── 补偿 ───┘
│ └─── 补偿 ───┘
└─── 补偿 ───┘
五、最佳实践
5.1 12-Factor App
| 原则 | 说明 |
|---|---|
| Codebase | 一份代码,多次部署 |
| Dependencies | 显式声明依赖 |
| Config | 配置与代码分离 |
| Backing Services | 后端服务作为资源 |
| Build, Release, Run | 严格分离构建和运行 |
| Processes | 无状态进程 |
| Port Binding | 端口绑定服务 |
| Concurrency | 并发扩展 |
| Disposability | 快速启动和优雅关闭 |
| Dev/Prod Parity | 开发生产环境一致 |
| Logs | 日志作为事件流 |
| Admin Processes | 管理任务作为一次性进程 |
5.2 健康检查
yaml
# Kubernetes 健康检查
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
startupProbe:
httpGet:
path: /health/startup
port: 8080
failureThreshold: 30
periodSeconds: 10
5.3 优雅关闭
java
// Spring Boot 优雅关闭
@Bean
public GracefulShutdown gracefulShutdown() {
return new GracefulShutdown();
}
public class GracefulShutdown implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {
private Connector connector;
@Override
public void customize(Connector connector) {
this.connector = connector;
}
@Override
public void onApplicationEvent(ContextClosedEvent event) {
connector.pause();
try {
Thread.sleep(30000); // 等待请求处理完成
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
总结
✅ 云原生概述 :容器化、编排、服务网格
✅ 核心设计模式 :Sidecar、Ambassador、Adapter
✅ 弹性设计模式 :重试、断路器、舱壁、限流
✅ 数据设计模式 :CQRS、事件溯源、Saga
✅ 最佳实践:12-Factor、健康检查、优雅关闭
本系列完结
作者 :刘~浪地球
系列 :云原生与容器(五)
更新时间:2026-04-15