云原生与系统架构

第一章:云计算基础

1.1 服务模式

模式全称提供内容典型产品
IaaS基础设施即服务虚拟机、存储、网络AWS EC2, 阿里云 ECS
PaaS平台即服务运行时、数据库、中间件Heroku, Google App Engine
SaaS软件即服务完整应用Gmail, Slack, 飞书
FaaS函数即服务事件驱动计算AWS Lambda, 阿里云函数计算

1.2 核心架构原则

  • 弹性伸缩:根据负载自动扩缩容
  • 高可用:多副本、多区域容灾
  • 松耦合:微服务独立部署、独立扩展
  • 无状态:计算节点不保存会话状态
  • 不可变基础设施:容器镜像代替手工配置

第二章:容器与 Kubernetes

2.1 Docker 核心概念

# 多阶段构建
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
EXPOSE 3000
HEALTHCHECK CMD wget -q --spider http://localhost:3000/health || exit 1
CMD ["node", "dist/main.js"]
# 常用命令
docker build -t myapp:1.0 .
docker run -d -p 3000:3000 --name myapp myapp:1.0
docker compose up -d
docker logs -f myapp
docker exec -it myapp sh

2.2 Kubernetes 架构

┌─────────────────────────────────────────────────┐
│                 Control Plane                    │
│  ┌──────────┐ ┌──────────┐ ┌──────────────────┐ │
│  │ API      │ │ Scheduler│ │ Controller Manager│ │
│  │ Server   │ │          │ │                   │ │
│  └──────────┘ └──────────┘ └──────────────────┘ │
│  ┌──────────┐                                    │
│  │ etcd     │  (集群状态存储)                      │
│  └──────────┘                                    │
└─────────────────────────────────────────────────┘
         │
    ┌────┴────┐
    │ Worker  │  ┌──────┐ ┌──────┐ ┌──────┐
    │  Node   │  │ Kubelet│ │kube- │ │Container│
    │         │  │       │ │proxy │ │Runtime │
    │  ┌────┐ │  └──────┘ └──────┘ └──────┘
    │  │Pod │ │
    │  │Pod │ │
    │  │Pod │ │
    │  └────┘ │
    └─────────┘

2.3 K8s 核心资源

# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:1.0
        ports:
        - containerPort: 3000
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"
        livenessProbe:
          httpGet:
            path: /health
            port: 3000
          initialDelaySeconds: 10
          periodSeconds: 30
---
# Service
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  selector:
    app: myapp
  ports:
  - port: 80
    targetPort: 3000
  type: ClusterIP
---
# Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-svc
            port:
              number: 80

2.4 Helm 包管理

# 安装应用
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install my-redis bitnami/redis --set auth.password=secret

# 自定义 values
helm install myapp ./charts/myapp -f values-prod.yaml

# 升级与回滚
helm upgrade myapp ./charts/myapp --set image.tag=2.0
helm rollback myapp 1
helm history myapp

第三章:微服务架构

3.1 服务拆分原则

  • 单一职责:每个服务只负责一个业务领域
  • 业务边界:按 DDD 限界上下文划分
  • 数据自治:每个服务拥有独立数据库
  • 接口契约:通过 API 契约通信

3.2 API 网关

# Kong / Nginx 网关配置
upstream user_service {
    server user-svc:8080;
    server user-svc:8081;
}

server {
    listen 443 ssl;
    server_name api.example.com;
    
    location /api/users/ {
        proxy_pass http://user_service;
        proxy_set_header X-Request-ID $request_id;
        rate_limit 100r/s;
    }
    
    location /api/orders/ {
        proxy_pass http://order_service;
    }
}

3.3 服务通信

方式协议适用场景
RESTHTTP/JSON外部 API、CRUD
gRPCHTTP/2 + Protobuf内部服务、高性能
消息队列AMQP/Kafka异步解耦、事件驱动
WebSocketWS实时推送

3.4 分布式事务

Saga 模式:

订单服务 → 创建订单 → 库存服务 → 扣减库存
                                  ↓ 失败
订单服务 ← 取消订单 ← 库存服务 ← 回滚库存

第四章:可观测性

4.1 三大支柱

支柱工具说明
日志 (Logging)ELK, Loki事件记录
指标 (Metrics)Prometheus + Grafana时序数据监控
追踪 (Tracing)Jaeger, Zipkin请求链路追踪

4.2 Prometheus 监控

# prometheus.yml
scrape_configs:
  - job_name: 'myapp'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
# 应用指标暴露
from prometheus_client import Counter, Histogram, generate_latest

REQUEST_COUNT = Counter('http_requests_total', 'Total requests', ['method', 'status'])
REQUEST_LATENCY = Histogram('http_request_duration_seconds', 'Request latency')

@app.middleware("http")
async def metrics_middleware(request, call_next):
    start_time = time.time()
    response = await call_next(request)
    REQUEST_COUNT.labels(request.method, response.status_code).inc()
    REQUEST_LATENCY.observe(time.time() - start_time)
    return response

@app.get("/metrics")
def metrics():
    return Response(content=generate_latest(), media_type="text/plain")

4.3 日志最佳实践

import structlog

logger = structlog.get_logger()

# 结构化日志
logger.info(
    "order_created",
    order_id="ORD-123",
    user_id="U-456",
    amount=99.9,
    items=3,
)
# 输出: {"event": "order_created", "order_id": "ORD-123", ...}

第五章:CI/CD 流水线

5.1 GitHub Actions

name: CI/CD Pipeline
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'
      - run: pip install -r requirements.txt
      - run: pytest --cov=app --cov-report=xml
      
  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-buildx-action@v3
      - uses: docker/build-push-action@v5
        with:
          push: true
          tags: registry.example.com/myapp:${{ github.sha }}
          
  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - run: |
          kubectl set image deployment/myapp \
            myapp=registry.example.com/myapp:${{ github.sha }}

学习资源