← 返回首页
🏗️

微服务架构模式

📂 devops ⏱ 2 min 342 words

微服务架构模式

核心模式

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

最佳实践

  1. 服务自治
  2. API版本控制
  3. 分布式追踪
  4. 熔断降级
  5. 数据最终一致性

总结

微服务架构模式提供了构建可扩展、可维护系统的蓝图。选择合适的模式组合,可以成功实施微服务架构。