微服务

微服务架构的定义、核心特征、常见模式与挑战

#tech / dev / backend #type / concept #status / growing

微服务 Microservices

一句话定义

微服务是一种架构风格,将应用拆分为一组小型、独立部署的服务,每个服务围绕一个业务能力构建,通过轻量级 API 通信。

核心机制 / 工作原理

核心特征

  1. 单一职责 — 每个服务只负责一个业务能力(如订单服务、支付服务、库存服务)
  2. 独立部署 — 每个服务可以独立编译、测试、部署,不影响其他服务
  3. 去中心化数据管理 — 每个服务拥有自己的数据库,不共享数据存储
  4. API 通信 — 服务间通过 HTTP/gRPC/消息队列通信,而非直接方法调用
  5. 技术异构 — 不同服务可以使用不同的语言、框架、数据库

微服务 vs 单体

维度单体微服务
部署整体部署独立部署
扩展整体扩展按需扩展单个服务
技术栈统一可异构
数据库共享每个服务独立
复杂度代码层面架构/运维层面
团队大团队协调小团队自治

常见模式

  • API Gateway — 统一入口,路由请求到对应的微服务,处理认证、限流、负载均衡
  • 服务发现 — 服务实例动态注册/发现(如 Consul, Eureka, Nacos)
  • 断路器 (Circuit Breaker) — 当下游服务故障时快速失败,防止级联崩溃(如 Hystrix, Resilience4j)
  • 事件驱动 — 通过消息队列(Kafka, RabbitMQ)实现异步通信和最终一致性
  • Saga 模式 — 管理跨服务的分布式事务,通过编排或协调一系列本地事务
  • Sidecar 模式 — 将通用功能(日志、监控、认证)抽到独立代理进程中

最小例子

客户端
  |
  v
[API Gateway :8080]
  |         |         |
  v         v         v
[订单服务] [用户服务] [库存服务]
  |         |         |
  v         v         v
[订单DB]  [用户DB]  [库存DB]

订单服务创建订单时:

  1. 通过 API Gateway 接收请求
  2. 调用库存服务扣减库存(同步 HTTP)
  3. 发送”订单已创建”事件到消息队列(异步)
  4. 用户服务订阅该事件,发送通知

边界与常见误解

  • “微服务总是更好” — 错。微服务引入分布式系统的复杂性。对于小团队/早期项目,单体往往是更务实的选择。
  • “每个服务很小就是微服务” — 关键不是代码量小,而是边界清晰、独立部署、团队自治
  • “微服务 = 容器化” — 容器(Docker)和编排(K8s)是实现微服务的常见工具,但不是定义的一部分。
  • 分布式事务难题 — 跨服务的强一致性很难实现,通常采用最终一致性 + Saga 模式。
  • 可观测性挑战 — 需要分布式追踪(Jaeger, Zipkin)、集中日志(ELK)、服务网格(Istio)来排查问题。
  • 数据一致性 — 每个服务独立数据库意味着不能用传统 ACID 事务,需要事件溯源或补偿机制。
  • 所属 MOC: 后端开发MOC
  • [[api-gateway|API 网关]]
  • [[service-discovery|服务发现]]
  • [[circuit-breaker|断路器模式]]
  • [[ddd-bounded-context|限界上下文]]
  • 事件驱动架构
  • [[distributed-system|分布式系统]]
创建于 2025/1/1 更新于 2026/5/27