云原生架构设计模式

系列导读:本篇将深入讲解云原生架构的核心设计模式与最佳实践。


文章目录

    • 一、云原生概述
      • [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

相关推荐
Elastic 中国社区官方博客14 小时前
我们如何在 Elasticsearch Serverless 上将向量搜索吞吐量提升一倍
大数据·数据库·人工智能·elasticsearch·搜索引擎·云原生·serverless
张忠琳17 小时前
【kubernetes v1.21】(一)Kubernetes 总览架构深度分析
云原生·架构·kubernetes
IT策士18 小时前
第 20 篇 搭建 Kubernetes 实验环境:Minikube 与 kubectl
云原生·容器·kubernetes
Elastic 中国社区官方博客20 小时前
Kibana 仪表板即代码:在 Elastic 9.4 中用于 Kibana 仪表板的 GitOps、漂移检测与 Terraform
大数据·人工智能·elasticsearch·搜索引擎·云原生·kibana·terraform
小哈里21 小时前
【K8S】云原生时代的GitOps最佳实践 —— ArgoCD
云原生·kubernetes·云计算·argocd·基础设施
张忠琳21 小时前
【kubernetes v1.21】(kube-apiserver 1)kube-apiserver 核心架构与启动流程超深度分析
云原生·架构·kubernetes
IT策士21 小时前
第 24 篇 k8s之健康检查:探针机制详解
云原生·容器·kubernetes
IT策士1 天前
第 21 篇 k8s之Pod:最小调度单元与 YAML 详解
云原生·容器·kubernetes
IT策士1 天前
第 22 篇 k8s 之 Pod: 生命周期与重启策略
云原生·容器·kubernetes
Shan12051 天前
浅谈:无服务器WebSocket解决方案
云原生·flask·serverless