微前端需要微服务吗?
不需要。微前端并不要求后端必须是微服务。
微前端和微服务首先回答的是两个不同的问题。前者讨论前端如何拆分与集成,后者讨论后端如何拆分。两项决策当然可以相互协调,但它们既不必须拥有完全相同的边界,也不需要同时引入。
多个微前端背后可以是传统 Backend Monolith,也可以是模块化 Monolith、多个共享 Service、每个 Remote 自己的 API Facade,或者拥有独立业务逻辑和数据职责的完整自治系统。
共同 Backend 并不会否定微前端。它只是决定了自治能够延伸到什么位置。
例如,患者 Remote、日历 Remote 和结算 Remote 可以分别代表不同业务区域,由不同团队开发、构建和发布,甚至被集成进不同 Host。它们依然完全可能使用同一个 Backend。
此时,团队的独立可变更性可能在共同 Backend Boundary 处结束。这并不会让前端拆分失去价值,只说明自治并不是一个“有或没有”的二元属性。团队可以独立修改并发布自己的 Remote,但一旦业务逻辑需要变化,仍然依赖由中心团队负责的 Backend。
这可以是一种有意识、而且经济上完全合理的切分。
两项彼此独立的架构决策
Section titled “两项彼此独立的架构决策”Frontend 和 Backend Topology 可以看成两条独立的轴:
Frontend:Monolith ───────────────────────── 微前端
Backend:Monolith ─ 模块化 Monolith ─ Services ─ 自包含系统(SCS)在其中一条轴上的位置,并不会强迫另一条轴采取某个特定位置。
一个 Monolithic Frontend 可以访问很多 Microservice;反过来,多个微前端也可以共享同一个 Backend:
患者 Remote ──┐日历 Remote ──┼── 共同 Backend结算 Remote ──┘这依然是微前端架构。不同前端区域仍然可以拥有各自的代码、Build Process、Release Cycle 和职责。
当然,并不是每一种组合都能提供相同范围的自治。只拥有 Remote 的团队,与同时拥有 Backend Contract、业务逻辑以及相关数据的团队,能够独立做出的决策不同。但这并不构成一条“架构成熟度阶梯”,更不意味着终点必然是微服务。
模块化 Monolith 并不是“尚未完成的微服务架构”。共同 Backend 也不自动意味着架构缺陷。反过来,一个拥有很多 Deployment 的系统,也并不自动意味着边界切得好。
评估 Backend Topology 时,更重要的是:哪些职责真的需要被独立承担,以及为了这种独立性,系统值得支付多少运维成本。

Backend Monolith 也可以拥有清晰边界
Section titled “Backend Monolith 也可以拥有清晰边界”Monolith 并不必然意味着所有前端都必须通过一套全局 API 读取和修改同一组模型。
即使 Backend 统一构建、统一部署,也完全可以提供按业务划分的 Contract:
日历 Remote → 日历 API患者 Remote → 患者 API结算 Remote → 结算 API三套 API 可以运行在同一个进程中,并且一起发布。对于 Consumer 来说,首先重要的是 Contract 是否清晰、稳定并符合业务含义,而不是 Deployment 之后究竟运行了多少个 Container。
如果前端团队已经独立工作,而 Backend 仍然由中心团队统一维护,这种结构尤其合理。渐进式迁移也是如此。现实中的应用几乎不可能在所有 Layer 上同时重新切边界。因此,先拆分前端职责、继续受控地使用现有 Backend,完全可能是更合理的顺序。
同样,一个稳定且很少需要修改的 Backend 区域,也没有理由仅仅为了“架构更纯粹”就拆成多个 Service。额外 Deployment、网络接口、Monitoring 和故障类型都是真实成本,它们应该解决真实问题。
Monolith 的问题并不在于“共同部署”。真正的问题是它没有提供可靠边界:所有 Remote 使用同一批全局 DTO,直接依赖内部数据结构,或者一个很小的修改却必须触碰很多业务归属不清的区域。
这种情况下,缺少的首先不是另一个 Service,而是一个合理的 Contract。
模块化 Monolith 是很强的选择
Section titled “模块化 Monolith 是很强的选择”模块化 Monolith 可以让 Backend 内部的业务边界更清楚,同时不必立刻承担分布式系统的全部运维成本。
日历 Remote → 日历模块患者 Remote → 患者模块结算 → 结算模块这些模块可以共享 Build 和 Deployment,但仍然拥有不同 Owner、各自的内部模型,以及清晰定义的接口。
它把微前端讨论中经常被错误对立起来的两件事结合在一起:业务上的分离与运行上的统一。
日历团队可以负责日历 Remote、对应 API Contract 和 Backend 中的日历模块,而不需要自己的 Cluster,也不一定需要自己的 Database。同时,它也无需因为每一次修改都去协调一个全局 Backend Model。
共同 Deployment 的确意味着改动会一起发布。但这并不自动意味着所有改动必须一起开发、一起决策,或者由所有人共同承担业务责任。
模块化 Monolith 还可以简化系统内事务和一致性变更。与大量独立部署的 Service 相比,它拥有更少的分布式故障模式,也需要更少的运行基础设施。这些并不是未来必须“克服”的缺点,它们可能恰好非常适合当前问题。
微前端不一定需要独立 Backend Deployment。很多时候,它们首先需要的是清晰分离的 Backend 职责。
Contract 比 Service 数量更重要
Section titled “Contract 比 Service 数量更重要”真正的问题不是:
Backend 到底有多少个 Service?
而是:
负责这个 Remote 的团队,能否理解、修改并稳定维护它所依赖的 Contract,而不必每一次变化都启动一次整个组织的 Release Train?
Backend Monolith 可以提供优秀的 Contract。微服务系统即使拥有大量 Deployment,也可能高度耦合。
当一个 Remote 直接访问很多内部 Service 时,这一点尤其明显:
Remote├── 用户 Service├── 日历 Service├── 地点 Service├── 权限 Service└── 结算 Service架构图看起来切得很细,但对 Remote 来说,一张页面可能因此拥有五个同步依赖,需要合并多种错误状态,并同时考虑多个 Service Version。
如果新的日历视图需要额外的用户数据、地点信息和权限规则,可能一下就要涉及三个或四个 Backend 团队。Frontend Team 虽然拥有一个独立部署的 Remote,却依然无法独立交付这个 Feature。
集成复杂度没有消失,只是被移动到了 Browser。
如果 Remote 还直接采用内部 Backend Model,问题会更严重。全局的用户、地点或权限 DTO 表面上像是复用,实际上却把多个 Service 的内部设计决策变成 Frontend Contract 的一部分。任何业务变化都可能波及大量 Consumer。
微服务并不会自动防止这种依赖。如果内部接口未经边界转换就直接暴露成 Frontend API,反而可能把这种依赖成倍放大。
因此,Service 数量并不是 Boundary 质量的可靠指标。
一个好的 Contract 会隐藏对 Remote 无关的内部 Topology。Frontend 不应该需要知道一个 View 最终由几个 Service 拼出来。它需要的是一个符合自身任务、并且有明确 Owner 的模型。
同时,Contract 也不仅仅是 Endpoint 和 DTO Schema。它还包括业务语义、错误行为、兼容性规则,以及谁负责它今后的演进。
Contract 必须能够演进
Section titled “Contract 必须能够演进”一个 Contract 不会因为旁边写了一个 Team Name 就自动变得可靠。真正重要的是它能否持续演进。
好的 Contract 有清晰 Owner,也知道自己的 Consumer。它可以向后兼容地扩展,对 Breaking Change 做有意识的处理,并且不会让一次普通调整强迫所有相关应用同步 Release。
这要求 Contract 不能只是把内部 Backend Model 原样映射到外面。内部结构变化的原因,与 Remote 的需求变化并不相同。如果两者被当成同一个模型,Backend 内部任何重构都可能变成 Frontend Migration。
知道 Consumer 是谁同样重要。如果没有人掌握一个 Contract 到底被哪些系统使用,它只能“看起来可以独立修改”。为了避免未知影响,旧字段会永远留着,或者每次变化都需要全组织协调。
自动化 Contract Test 可以让这些关系更可见,也能发现意外的不兼容。但它既不能替代清晰 Ownership,也不能把一个糟糕接口变成好接口。坏 Contract 加上更多测试,只会更可靠地保持糟糕。
只有当一个有明确 Owner 的 Contract 可以变化,而不需要所有 Consumer 同时升级时,它才是真正可靠的边界。
Ownership 才是核心问题
Section titled “Ownership 才是核心问题”架构讨论很容易集中在可见的技术边界上:Repository、Deployment、Container、Database、API Endpoint。这些东西容易计数,也容易画在图上。
Ownership 没那么显眼,却往往更加关键。业务边界与 Ownership 并不是架构的对立面,而是架构的战略部分。
如果没有任何团队能够负责一次业务修改的完整路径,那么 Remotes、BFF 和 Microservice 再多也没有太大帮助。如果多个团队都能修改同一个模型、故障在职责之间来回转交,或者每一次改动都必须由中心 Backend Team 批准并实施,情况也是一样。
在这种结构里,技术拆分甚至可能增加 Handover。一个原本只影响一个业务区域的需求,最后变成多个团队之间的 Ticket 链。
因此,需要回答的不只是技术问题:
- 谁拥有这个 Contract?
- 谁决定它如何继续演进?
- 谁负责 Boundary 上的故障?
- 哪些其他团队必须同意一次修改?
- 团队的业务职责到哪里结束?
模块化 Monolith 完全可以给出很好的答案:
日历团队├── 负责日历 Remote├── 拥有日历 Contract└── 拥有共同 Backend 中的日历模块Backend 可以统一发布,但业务责任并不因此必须共同承担,更不必变得模糊。
反过来,也可能出现这样的情况:日历 Microservice 由中心 Platform Team 运维,日历 Remote 属于 Product Team,而 API Contract 又要由第三个委员会批准。即使这里存在三条技术 Deployment Boundary,依然没有任何团队真正拥有端到端变化。
Deployment Boundary 可以支持 Ownership,却无法代替 Ownership。
BFF 什么时候有意义
Section titled “BFF 什么时候有意义”Remote 专用的 Backend for Frontend(BFF)或 API Facade,可以在不重新切整个 Backend 的情况下修正不合适的 Backend Boundary。
日历 Remote │ ▼日历 BFF │ ├── Backend Monolith ├── 用户 Service └── 地点 ServiceBFF 可以聚合多个来源,为 Remote 提供专门针对自身任务设计的模型。它可以隐藏内部 Service Boundary、统一错误,并让 Backend Topology 的变化不直接传到 Frontend。
这样,日历 Remote 不需要知道用户名来自哪个 Service、地点在哪里维护,或者权限在技术上怎样解析。它只消费一个为日历业务设计的 Contract。
BFF 也可以让职责更具体。如果日历团队同时拥有 Remote 和它的 BFF,那么即使底层系统仍属于其他团队,它也能够独立演进 Frontend Contract。
但这并不是自动发生的。
一个只把全局 DTO 原样转发的薄 Proxy 并没有建立业务边界。BFF 同样可能同步耦合多个内部 Service,把它们的错误直接泄漏出来,并且每次变更仍然需要多个团队参与。
BFF 是设计 Contract 的工具,不是“真正微前端”的认证标签。
如果现有 Backend 已经提供了合适且有明确 Owner 的 Contract,再加一层 BFF 可能只是增加一个没有额外价值的 Deployment。
什么时候 Microservice 或自包含系统(SCS)更合理
Section titled “什么时候 Microservice 或自包含系统(SCS)更合理”当期望的职责确实要继续延伸进 Backend 时,Microservice 或完整的自包含系统(SCS)才开始真正有意义。
Remote │ ▼自己的 API │ ▼自己的业务逻辑 │ ▼自己的数据职责团队由此不仅能够修改 UI 和 Frontend Contract,也能独立演进并发布底层业务逻辑。它对中心 Backend Team 的依赖更少,可以自己决定 Release Cycle、Scaling,甚至在一定程度上决定 Fault Isolation。
对于真正独立的业务区域,这种范围的 Ownership 很有价值。尤其当 Backend 经常需要调整、中心团队长期成为瓶颈,或者不同区域对 Scaling 和 Availability 有明显不同要求时,这种切分更值得考虑。
但更大的自治也有价格。
每个独立 Backend 区域都需要 Build 与 Deployment、Runtime Environment、Monitoring、Logging,以及负责运行的人。原来的本地方法调用变成网络调用,故障可能只发生在部分系统,数据要跨系统边界传递,而且 Contract 不再只存在于 Frontend 与 Backend 之间,还会出现在不同 Backend 区域之间。
因此,拥有完整 Vertical Slice 的团队不仅得到更多自由,也承担更多责任。
微服务不是微前端的前提。它只是当所需 Ownership 真正要延伸到 Backend 和数据时的一种可能答案。
独立数据不是前提
Section titled “独立数据不是前提”微前端不需要自己的 Database。
即使团队拥有自己的 Backend Module 或 Service,也可以暂时继续访问共同管理的数据。关键仍然是:哪些修改需要独立完成,以及共同 Ownership 的规则是什么。
真正的 End-to-End Autonomy 会在多个业务区域可以随意修改同一批业务数据结构、却没有清晰 Owner 的地方终止。因此,共享 Database 本身不一定是问题;共享但归属不清才是问题。
数据职责只是自治的另一条可能边界。只有当业务和组织收益足以支付额外成本时,才应该把它进一步拆开。

选择合适的 Backend Boundary
Section titled “选择合适的 Backend Boundary”合适的 Topology 不取决于哪种架构名称看起来更现代,而取决于团队的独立职责需要延伸多远。
对于 UI 自治,团队主要拥有 Remote:
Remote → 共同 API → 共同 Backend如果 Backend 很少变化,现有 API 足够稳定,而且共同 Backend Release 并不会形成实际阻碍,这完全可能已经足够。
对于 Contract 自治,团队还拥有自己的 API Facade 或 BFF:
Remote → 自己的 BFF → 共同 Backend如果现有 Backend 无法提供适合 Frontend 的模型,或者 Remote 本来需要自己整合多个内部来源,这种方式尤其有价值。团队可以控制自己的 Contract,而无需立刻接管全部业务逻辑和数据。
对于 End-to-End 自治,职责从 Remote、Contract 一直延伸到业务逻辑,甚至数据:
Remote → 自己的 Backend 区域 → 自己的业务逻辑 → 自己的数据这允许完整的 Vertical Slice,但也带来最高的运维和组织成本。
没有哪一种方案天然更高级。更大的自治范围只有在真正被使用时才有价值。一个“自己的 Service”如果仍由中心团队修改,并且必须和所有系统一起 Release,收益很有限;反过来,一个在共同 Backend 中归属清晰的模块,可能非常有效。
所以,比架构名词更有帮助的是一些具体问题:Remote 多久需要一次 Backend 修改?中心团队是否经常成为瓶颈?负责团队是否真的需要独立交付到底层业务逻辑?共同 Release 是问题,还是业务上本来就希望如此?模块化 Monolith 是否已经能提供足够 Ownership?Remote 是否正在直接编排多个内部 Service?最重要的是:谁拥有 Contract,以及谁负责它的演进?
微前端不需要微服务。它需要的是一条 Backend Boundary,让团队想要获得的自治不会在每一次修改时重新丢失。
不是每个 Remote 都需要自己的 Backend,但每个 Remote 都需要一个由负责团队真正能够掌控变化的 Contract。