微服务架构模式
微服务架构模式
核心模式
API网关
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: api-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: api-gateway-cert
hosts:
- "api.example.com"
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: api-gateway
spec:
hosts:
- "api.example.com"
gateways:
- api-gateway
http:
- match:
- uri:
prefix: /api/users
route:
- destination:
host: user-service
- match:
- uri:
prefix: /api/orders
route:
- destination:
host: order-service
服务发现
# Consul服务注册
{
"service": {
"name": "user-service",
"port": 8080,
"check": {
"http": "http://localhost:8080/health",
"interval": "10s"
}
}
}
断路器
# Istio断路器
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: user-service
spec:
host: user-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
http1MaxPendingRequests: 100
http2MaxRequests: 1000
outlierDetection:
consecutive5xxErrors: 5
interval: 30s
baseEjectionTime: 3m
maxEjectionPercent: 100
数据管理模式
数据库每服务
# User Service数据库
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-db
spec:
replicas: 1
selector:
matchLabels:
app: user-db
template:
metadata:
labels:
app: user-db
spec:
containers:
- name: mysql
image: mysql:8
env:
- name: MYSQL_DATABASE
value: users
---
# Order Service数据库
apiVersion: apps/v1
kind: Deployment
metadata:
name: order-db
spec:
replicas: 1
selector:
matchLabels:
app: order-db
template:
metadata:
labels:
app: order-db
spec:
containers:
- name: postgres
image: postgres:14
env:
- name: POSTGRES_DB
value: orders
事件溯源
// 事件存储
const events = [];
function storeEvent(event) {
events.push({
...event,
timestamp: Date.now(),
version: events.length + 1
});
}
function getEvents(aggregateId) {
return events.filter(e => e.aggregateId === aggregateId);
}
// 重放事件
function rebuildState(aggregateId) {
const events = getEvents(aggregateId);
return events.reduce((state, event) => {
return applyEvent(state, event);
}, {});
}
通信模式
同步通信
// REST API调用
const response = await fetch('http://user-service/api/users/123');
const user = await response.json();
异步通信
// Kafka事件发布
await kafka.producer.send({
topic: 'user-events',
messages: [{
key: userId,
value: JSON.stringify({
type: 'USER_CREATED',
data: userData
})
}]
});
实践:完整微服务架构
# docker-compose.yml
version: '3.8'
services:
# API网关
api-gateway:
image: nginx
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
# 用户服务
user-service:
build: ./user-service
environment:
- DB_HOST=user-db
- KAFKA_BOOTSTRAP_SERVERS=kafka:9092
depends_on:
- user-db
- kafka
user-db:
image: mysql:8
environment:
MYSQL_DATABASE: users
MYSQL_ROOT_PASSWORD: secret
# 订单服务
order-service:
build: ./order-service
environment:
- DB_HOST=order-db
- KAFKA_BOOTSTRAP_SERVERS=kafka:9092
depends_on:
- order-db
- kafka
order-db:
image: postgres:14
environment:
POSTGRES_DB: orders
# 消息队列
kafka:
image: confluentinc/cp-kafka
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
zookeeper:
image: confluentinc/cp-zookeeper
# 缓存
redis:
image: redis:alpine
最佳实践
- 服务自治
- API版本控制
- 分布式追踪
- 熔断降级
- 数据最终一致性
总结
微服务架构模式提供了构建可扩展、可维护系统的蓝图。选择合适的模式组合,可以成功实施微服务架构。