微服务架构
经典架构模式
把应用拆成可独立部署的小服务,服务围绕业务能力、通过网络协作。
结构示意
flowchart TB
G[API 网关]
G --> U[用户服务]
G --> O[订单服务]
G --> P[支付服务]
O --> MQ[消息]
P --> MQ
知识说明
微服务强调:按业务边界拆分、独立进程与数据、独立发布。好处是团队自治、弹性扩缩、技术异构。代价是分布式事务、网络故障、运维与可观测性成本。
它常与 API 网关、服务发现、容器编排一起出现,但「拆成很多 JAR」本身不是微服务——没有独立部署与清晰边界只是分布式单体。
对比单体分层:不是替代分层,每个微服务内部仍常采用分层/MVC。
特点
- 独立部署
- 围绕业务能力
- 去中心化数据
- 轻量通信(HTTP/消息)
优点
- 故障隔离
- 按服务扩容
- 技术栈可并存
局限
- 分布式复杂度
- 数据一致性难
- 运维与测试成本高
适用
大型电商 多团队并行的平台型系统
例子展示 —— 电商:订单与库存拆分
问题
单体里下单、库存、支付同一数据库事务;流量高峰时只能整站扩容,库存团队发版会拖住交易团队。
做法
订单服务与库存服务分开部署、分开库。下单通过接口或消息扣减库存,接受最终一致,并用超时与补偿处理失败。
sequenceDiagram
participant App as 客户端
participant Ord as 订单服务
participant Inv as 库存服务
App->>Ord: 下单
Ord->>Inv: 预留库存
Inv-->>Ord: OK
Ord-->>App: 下单成功
// 订单服务
class OrderService {
InventoryClient inventory;
public String place(Order o) {
inventory.reserve(o.sku, o.qty);
return save(o);
}
}
// 库存服务独立进程
class InventoryController {
@PostMapping("/reserve")
public void reserve(String sku, int qty) { /* 本库扣减 */ }
}
# 订单服务调用库存 HTTP API
import requests
def place_order(order, inventory_url):
r = requests.post(inventory_url + "/reserve", json=order)
r.raise_for_status()
save_order(order)