微服务架构设计模式
微服务架构将单体应用拆分为多个独立服务,本文介绍常用的设计模式和最佳实践。
服务拆分原则
- 单一职责:每个服务专注于一个业务领域
- 独立部署:服务可以独立构建、部署和扩展
- 去中心化:每个服务有自己的数据库
- 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 优化读写性能。合理运用这些模式可以构建高可用、可扩展的微服务系统。


评论 2