微服务架构设计

微服务架构设计

项目概述

本章将通过一个完整的电商微服务应用,实践 Kubernetes 的各种特性。这是一个真实的生产级应用架构,包含前后端分离、数据库、缓存、API 网关等完整组件。

系统架构

┌─────────────┐
│   Frontend  │  ← 用户界面(React/Vue)
└──────┬──────┘
       │
┌──────▼──────┐
│ API Gateway │  ← Nginx 反向代理
└──────┬──────┘
       │
   ┌───┴────┬────────────┬─────────────┐
   │        │            │             │
┌──▼──┐  ┌─▼───┐  ┌────▼────┐  ┌─────▼─────┐
│User │  │Order│  │ Product │  │  Payment  │
│Svc  │  │ Svc │  │   Svc   │  │    Svc    │
└──┬──┘  └──┬──┘  └────┬────┘  └─────┬─────┘
   │        │          │             │
   └────────┴──────────┴─────────────┘
              │              │
         ┌────▼────┐    ┌───▼───┐
         │ MongoDB │    │ Redis │
         └─────────┘    └───────┘

技术栈选型

后端服务

  • 语言: Node.js / Go / Java(可选)
  • 框架: Express / Gin / Spring Boot
  • 协议: REST API / gRPC

数据存储

  • 数据库: MongoDB(文档数据库)
  • 缓存: Redis(内存数据库)
  • 持久化: PersistentVolume

基础设施

  • 容器编排: Kubernetes 1.28+
  • 服务网格: Istio(可选)
  • API 网关: Nginx / Kong
  • 配置管理: ConfigMap / Secret

微服务拆分原则

1. 按业务领域拆分

用户服务(User Service)

  • 用户注册、登录
  • 用户信息管理
  • 认证和授权

商品服务(Product Service)

  • 商品列表查询
  • 商品详情
  • 库存管理

订单服务(Order Service)

  • 订单创建
  • 订单查询
  • 订单状态管理

支付服务(Payment Service)

  • 支付接口对接
  • 支付状态查询
  • 退款处理

2. 服务间通信

同步通信(REST API):
Frontend → API Gateway → Microservices

异步通信(消息队列):
Order Service → Message Queue → Payment Service
                                → Inventory Service

3. 数据隔离

  • 每个服务独立的数据库/Schema
  • 避免跨服务直接访问数据库
  • 通过 API 进行数据交互

Kubernetes 资源规划

Namespace 设计

environments:
  - dev        # 开发环境
  - staging    # 测试环境
  - production # 生产环境

资源配额

# 开发环境
CPU: 10 cores
Memory: 20Gi
Pods: 50

# 生产环境
CPU: 100 cores
Memory: 200Gi
Pods: 500

标签规范

labels:
  app: product-service           # 应用名称
  version: v1.2.3               # 版本号
  environment: production       # 环境
  team: backend                 # 团队
  tier: api                     # 层级

准备工作

创建 Namespace

apiVersion: v1
kind: Namespace
metadata:
  name: ecommerce
  labels:
    environment: production
    team: platform
kubectl apply -f namespace.yaml

# 设置默认命名空间
kubectl config set-context --current --namespace=ecommerce

配置 Secret

apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
  namespace: ecommerce
type: Opaque
stringData:
  # MongoDB 连接
  mongo-uri: "mongodb://admin:password@mongodb:27017/ecommerce?authSource=admin"
  
  # Redis 连接
  redis-host: "redis"
  redis-password: "redis-password"
  
  # JWT 密钥
  jwt-secret: "your-secret-jwt-key-here"
  
  # 第三方 API Key
  payment-api-key: "payment-api-key-here"
kubectl apply -f secrets.yaml

# 验证
kubectl get secrets -n ecommerce

ConfigMap 配置

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
  namespace: ecommerce
data:
  # 应用配置
  app.json: |
    {
      "port": 8080,
      "logLevel": "info",
      "corsOrigins": ["https://example.com"]
    }
  
  # Nginx 配置
  nginx.conf: |
    events {
      worker_connections 1024;
    }
    http {
      upstream backend {
        server product-service:8080;
        server order-service:8080;
      }
      server {
        listen 80;
        location / {
          proxy_pass http://backend;
        }
      }
    }

网络策略设计

默认拒绝策略

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-deny
  namespace: ecommerce
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  - Egress

允许内部通信

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-internal
  namespace: ecommerce
spec:
  podSelector:
    matchLabels:
      tier: api
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          tier: gateway
    ports:
    - protocol: TCP
      port: 8080

部署策略

滚动更新策略

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1        # 最多额外创建 1 个 Pod
    maxUnavailable: 0  # 最多 0 个 Pod 不可用

金丝雀发布

# 生产版本 - 90%
replicas: 9
version: v1.0

# 金丝雀版本 - 10%
replicas: 1
version: v2.0

蓝绿部署

# 蓝色环境(当前生产)
Service → Deployment-blue (v1.0)

# 绿色环境(新版本)
Deployment-green (v2.0)

# 切换流量
Service → Deployment-green (v2.0)

可观测性设计

日志收集

annotations:
  fluentd.io/parser: "json"
  prometheus.io/scrape: "true"
  prometheus.io/port: "8080"
  prometheus.io/path: "/metrics"

健康检查

livenessProbe:
  httpGet:
    path: /health
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 10

readinessProbe:
  httpGet:
    path: /ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 5

分布式追踪

集成 Jaeger/Zipkin:

// 在应用中集成
const opentelemetry = require('@opentelemetry/api');
const { JaegerExporter } = require('@opentelemetry/exporter-jaeger');

安全加固

Pod Security Context

securityContext:
  runAsNonRoot: true
  runAsUser: 1000
  fsGroup: 2000
  readOnlyRootFilesystem: true

RBAC 配置

apiVersion: v1
kind: ServiceAccount
metadata:
  name: app-sa
  namespace: ecommerce
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: app-role
rules:
- apiGroups: [""]
  resources: ["configmaps", "secrets"]
  verbs: ["get", "list"]

小结

本节我们设计了完整的微服务架构:

架构设计:前后端分离、微服务拆分、数据隔离
技术选型:MongoDB + Redis + Node.js
Kubernetes 规划:Namespace、标签、资源配额
安全策略:NetworkPolicy、RBAC、Security Context
可观测性:日志、监控、追踪

下一节我们将部署数据库层(MongoDB 和 Redis)。