微服务架构设计
微服务架构设计
项目概述
本章将通过一个完整的电商微服务应用,实践 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)。