目录

微服务架构设计模式

微服务架构将单体应用拆分为多个独立服务,本文介绍常用的设计模式和最佳实践。

服务拆分原则

  • 单一职责:每个服务专注于一个业务领域
  • 独立部署:服务可以独立构建、部署和扩展
  • 去中心化:每个服务有自己的数据库
  • API 优先:通过明确定义的 API 通信

API 网关模式

API 网关作为所有客户端请求的入口:

yaml
# Kong API Gateway 配置示例
services:
  - name: user-service
    url: http://user-service:3001
    routes:
      - paths: ["/api/users"]

  - name: order-service
    url: http://order-service:3002
    routes:
      - paths: ["/api/orders"]

plugins:
  - name: rate-limiting
    config:
      minute: 100
  - name: jwt

服务发现

服务注册

go
// 使用 Consul 进行服务注册
package main

import "github.com/hashicorp/consul/api"

func registerService() {
    config := api.DefaultConfig()
    config.Address = "consul:8500"
    client, _ := api.NewClient(config)

    registration := &api.AgentServiceRegistration{
        ID:   "user-service-1",
        Name: "user-service",
        Port: 3001,
        Check: &api.AgentServiceCheck{
            HTTP:     "http://user-service:3001/health",
            Interval: "10s",
        },
    }
    client.Agent().ServiceRegister(registration)
}

断路器模式

防止级联故障,快速失败:

typescript
import { CircuitBreaker } from 'opossum';

const options = {
  timeout: 3000,       // 超时3秒
  errorThresholdPercentage: 50,  // 错误率50%触发
  resetTimeout: 30000  // 30秒后尝试恢复
};

const breaker = new CircuitBreaker(callExternalService, options);

breaker.fallback(() => ({ cached: true, data: getCachedData() }));

const result = await breaker.fire(params);

断路器状态

状态 说明
Closed 正常调用,记录失败率
Open 失败率超阈值,直接返回错误或降级
Half-Open 尝试恢复,放行部分请求

Saga 分布式事务

Saga 模式通过一系列本地事务实现分布式事务:

javascript
// 编排式 Saga
class OrderSaga {
  async execute(order) {
    try {
      // 1. 创建订单
      await this.orderService.create(order);

      // 2. 扣减库存
      await this.inventoryService.deduct(order.items);

      // 3. 扣款
      await this.paymentService.charge(order.total);

    } catch (error) {
      // 补偿事务(反向操作)
      await this.compensate(order);
    }
  }

  async compensate(order) {
    await this.paymentService.refund(order.total);
    await this.inventoryService.restore(order.items);
    await this.orderService.cancel(order.id);
  }
}

CQRS 模式

读写分离,提升查询性能:

typescript
// 写模型
class UserCommandHandler {
  async createUser(data) {
    const user = await User.save(data);
    // 发布事件
    await eventBus.publish('UserCreated', user);
    return user;
  }
}

// 读模型(使用单独的查询数据库或缓存)
class UserQueryHandler {
  async getUser(id) {
    return await readStore.findOne({ id });
  }

  async searchUsers(keyword) {
    return await searchEngine.search(keyword);
  }
}

总结

微服务架构设计模式的核心在于:用 API 网关统一入口、服务发现实现动态路由、断路器保障系统韧性、Saga 处理分布式事务、CQRS 优化读写性能。合理运用这些模式可以构建高可用、可扩展的微服务系统。