微服务架构设计核心要点
微服务架构将单体应用拆分为一组小型、独立的服务,每个服务专注于一个业务能力。这种架构风格带来了更好的可扩展性和独立部署能力,但也引入了分布式系统的复杂性。本文将介绍微服务架构设计的核心要点。
一、服务拆分原则
// 领域驱动设计(DDD)指导服务拆分
// 限界上下文(Bounded Context)
// 用户上下文 - 用户注册、认证、权限管理
// 订单上下文 - 下单、支付、发货
// 商品上下文 - 商品管理、库存、分类
// 拆分原则:
// 1. 高内聚 - 相关业务放在一起
// 2. 低耦合 - 服务间最小化依赖
// 3. 单一职责 - 每个服务只做一件事
// 4. 独立部署 - 服务可以独立发布
二、服务间通信
// 同步通信 - REST/gRPC
// 适合需要即时响应的场景
// GET /api/users/123
// POST /api/orders
// 异步通信 - 消息队列
// 适合解耦和削峰填谷的场景
// 订单创建后发布事件
var orderCreatedEvent = {
type: "order.created",
data: { orderId: "12345", userId: "u001", amount: 99.9 },
timestamp: "2024-01-01T10:00:00Z"
}
// 用户服务订阅事件处理积分
consumer.on("order.created", function(event) {
userService.addPoints(event.data.userId, event.data.amount);
});
三、分布式事务处理
// Saga模式 - 编排式
class OrderSaga {
async execute(order) {
try {
await this.createOrder(order); // 步骤1: 创建订单
await this.deductStock(order.items); // 步骤2: 扣减库存
await this.processPayment(order); // 步骤3: 处理支付
} catch (error) {
await this.compensate(order); // 补偿事务
}
}
async compensate(order) {
// 反向执行已完成的步骤
if (order.paymentProcessed) await this.refund(order);
if (order.stockDeducted) await this.restoreStock(order.items);
if (order.orderCreated) await this.cancelOrder(order.id);
}
}
四、服务注册与发现
// Consul服务注册
{
"ID": "user-service-1",
"Name": "user-service",
"Address": "10.0.0.1",
"Port": 8080,
"Check": {
"HTTP": "http://10.0.0.1:8080/health",
"Interval": "10s",
"Timeout": "1s"
}
}
// 客户端服务发现
var instances = await consul.health.service("user-service");
var target = loadBalancer.choose(instances);
var response = await fetch("http://" + target.Address + ":" + target.Port + "/api/users");
五、API网关
// 网关路由配置
{
"routes": [
{
"path": "/api/users/**",
"service": "user-service",
"methods": ["GET", "POST", "PUT"],
"rateLimit": { "rpm": 1000 }
},
{
"path": "/api/orders/**",
"service": "order-service",
"methods": ["GET", "POST"],
"rateLimit": { "rpm": 500 },
"auth": true
}
]
}
微服务架构不是万能药,它解决了单体应用的某些问题,但也带来了分布式系统的复杂性。在选择微服务架构时,要充分考虑团队规模、技术能力和业务需求。很多时候,一个良好设计的单体应用比一组设计糟糕的微服务更好。