用途
该技能用于在设计或评审微服务架构时提供判断依据,典型触发场景包括出现“microservices”“should we split this service”“service boundaries”“bounded context”等表述。其核心主张是:将系统分解为可独立部署的服务,每个服务拥有自己的数据,并与业务能力对齐;服务之间通过网络通信;以承担运维成本为代价,换取自治与独立伸缩能力。
何时使用
- 多个团队在单一代码库或部署单元中相互干扰。
- 系统不同部分需要不同的伸缩特征(如一个受 CPU 限制、一个受 I/O 限制、一个具有突发性)。
- 不同部分有不同的发布节奏,一个团队的部署不应阻塞另一个团队。
- 不同部分有不同的可靠性要求(如关键支付路径与非关键分析看板)。
何时不应使用
- 一个团队、一个产品、没有伸缩压力——不具备微服务要解决的问题,应保留单体。
- 领域理解不足,无法划定服务边界——过早拆分极难回退。
- 缺乏运维成熟度(无 CI/CD、无可观测性、无值班机制)——微服务会放大运维痛苦。
- 出于简历驱动开发的目的。
主要能力与核心内容
服务边界跟随业务能力,而非技术分层。customer-service、orders-service、pricing-service 是正确的;database-service、api-service、cache-service 是反模式。边界通常与 DDD 限界上下文对齐(参见 ddd-bounded-context)。
每个服务拥有自己的数据,不共享数据库。若服务 B 需要服务 A 的数据,B 要么调用 A 的 API,要么订阅 A 发布的事件。两个“微服务”底层共享同一数据库,会使它们成为分布式单体——兼具两者之弊。
通信模式:
- 同步(REST、gRPC):直接、易于推理,但存在延迟耦合。适用于调用方需要立即得到答案的查询密集型场景。
- 异步(事件,参见 arch-event-driven):时间上解耦,最终一致。适用于跨服务的工作流。
多数生产系统混合使用两者。
边缘模式:
- API 网关:外部客户端的单一入口,处理认证、限流、路由、响应组合,使客户端与内部服务拓扑解耦。
- Backend for Frontend(BFF):按客户端类型(移动端、Web、合作伙伴 API)定制的网关,避免“一个网关必须满足所有客户端”的陷阱。
- 服务网格(Istio、Linkerd):由边车代理处理流量、mTLS、重试、可观测性,将横切基础设施从服务中移出。在规模化时才有理由使用;约 10 个服务以下属于过度设计。
反模式警示:分布式单体——服务虽独立部署但耦合紧密(共享数据库、同步调用链、锁定式发布),承担了微服务的全部运维成本,却得不到自治收益,且最难摆脱。
使用方式(决策启发式)
- 默认选择单体。微服务解决特定问题(团队自治、独立伸缩、故障隔离);若没有这些问题,就不需要这种风格。
- 服务边界与限界上下文对齐。先使用 ddd-bounded-context,让上下文决定拆分,而非反过来。
- 不拥有自己数据的服务是一种坏味道——通常是适配器或协调者,应放在别处。
- 单个用户请求经过超过 2–3 个服务的同步调用链,说明分解有问题,应改用事件或重新思考边界。
- 客户端类型差异显著时用 BFF;差异不大时用带内容协商的网关。
适用场景与限制
适用于多团队协作、需要独立伸缩、独立发布节奏或差异化可靠性要求的系统设计评审。限制在于:领域未理解清楚时不应拆分;缺乏 CI/CD、可观测性与值班能力时不应采用;不应因 Netflix 等公司采用而跟风——它们解决的是自身问题。
反模式
- 分布式单体:必须一起发布的服务,兼具两者之弊。
- 纳米服务:小到按类发布,协调成本超过分解收益。
- 共享数据库:两个服务读写同一批表,它们并非独立。
- 同步调用链:A 调 B、B 调 C、C 调 D,每一环都增加延迟与故障面,任一环失败则整链失败。
- 因为 Netflix 这么做而选择微服务。
参见
ddd-bounded-context(服务边界应跟随限界上下文)、arch-event-driven(标准异步通信风格)、arch-saga(协调分布式事务)、arch-circuit-breaker(服务间故障隔离)、arch-strangler-fig(从单体迁移到微服务)。
参考资料
Richards & Ford, Fundamentals of Software Architecture, 第 17 章(Microservices);Sam Newman, Building Microservices(O'Reilly);Sam Newman, Monolith to Microservices(O'Reilly);Khononov, Learning DDD, 第 14 章(Microservices)。