前端微服务化的反思
在才云我实践了前端微服务化,解决了部分问题,又引入了更多问题。
反思:为什么要微服务化
在才云的场景下,推行前端微服务化的原因有三点:可组装,模块化,独立的开发流程。
可组装是指,产品功能模块可以随时增减,达到灵活交付的目的。模块化是开发者追求可长期维护的软件产品的目标之一。独立的开发流程是指一个功能模块可以单独地开发测试和部署,达到快速迭代的目的。
微服务化是这三点诉求的充分条件,并不是必要条件。微服务化可能并不是唯一解,也不一定是最优解。
repo 管理问题
拆分太多前端 repo 后面临三大问题:
1. PR 提交多
一个修改常常需要提交代码到多个 repo,这在模块边界还有些模块化的前期尤为明显。目前情况下,i18n 文件和 graphql schema 需要提交到“中心 repo”,业务代码提交到“业务 repo”。
2. oem 分支多
多个 repo 会带来多个 oem 分支。对于二次开发来说,管理多个 repo 的分支就是一个很大的挑战,稍不注意就会出现 PR 漏提或错提的错误。
学习成本
现在微服务化已成为产品开发的“必修课”。不学习则无从下手,理不清模块是如何加载的,api 是如何路由的。由于前端微服务并没有通用的方法,对现有产品实施微服务化也不太可能套用“通用方法”,导致“必修课”的知识的可迁移性较低。可能会让新同学提不起干劲学习,甚至被复杂的逻辑“劝退”。
开发复杂性
初期模块解耦不彻底,开发一些模块可能需要启动相关联的模块,操作过程比较麻烦,占用资源也比较多。
由于没有采用业界广泛提倡的“技术无关,框架无关”理念,我们针对产品特性实现了适用于 React 的微服务化方案,产生了“技术基座” —— 公共库依赖。基座包含的内容可以有微前端基础库、核心库版本(React 和 apollo-client 等)、状态管理方案等。每个模块的技术自由度非常有限,只能接收框架注入的公共库版本,不能随意选择。
总结和展望
- repo 的管理方式可以优化,可以参考 monorepo;
- 可以将方案往通用化上演进,优化学习成本;
- 利用 graphql 作为统一 api 网关,降低模块之间的 api 依赖
- 出于性能的考虑,技术基座会长期存在。