我们的应用是整合外部现有产品和业务规则给用户展现一个友好界面的 UI。客户是一家 UWP App,后台有相应服务在第三方域和我们之间交换数据。
对第三方的依赖严重影响我们选择微服务。例如,应用经常要在不同域之间转换功能,使得第三方域看起来像是完全不同的一个域,如果在我们之间有一个单一服务情况还不算太糟。
然而,整个域交换在分解成多个微服务过程中就看起来很怪异了。
是我们的微服务跟第三方的分解不同吗?我们复制了所有服务的前后端需求吗?还是我们分解了自己的微服务,仍然需要一个微服务从第三方获取信息?所有这些问题看起来都跟微服务指南相背离。
我们和第三方合作很紧密,经常一起协作发布版本。微服务的好处在于每个团队都可以不受影响独立发行服务,而跨公司合作则失去了这种好处。
微服务另外一个好处在于,每个团队只需要完整设计自己的业务问题。而我们,作为一个和第三方完全独立的公司团队,这种重构看起来不可行。
我们实在找不出应该从哪个单体应用下手。于是我们在域模型之间连线,以决定要创建哪些微服务。
然而,一旦这么开始做,发现很多共享业务逻辑影响着微服务域的划分。如果将微服务划分的更细小,只能带来更多的耦合关系,到处都需要消息总线,消息可能会出现大爆炸。
原因在于我们的单体式应用是为一个业务逻辑服务的。我们为用户方便创建了跨域和组的很多工作流,本质上,UI 在过去四年中就是将各种东西整合到了一起。
另外,我们还误解了微服务如何被隔离,以及低估了服务之间正确边界选择的重要性。
唯一能做到的就是为了实现一个标准功能,从而需要将所有相关微服务同时升级,由此要求每个微服务都不能被某个单独团队拥有。
我们大约有 12 个开发人员分布在两个功能团队和一个支持团队。工作波动性很大,没有专职负责团队。所有团队同时接触同一批代码很正常,不能将某个微服务指定给一个团队。
考虑架构时候一定要记得 Conway's Law,其意思是软件架构会模仿组织和团队架构增长。
微服务架构对于不同团队负责不同业务逻辑是比较有效的,然而,共享代码功能的工作模式最好采用单体式架构。
各种问题意味着至少六个月内,需要在 IIS 内并行运行微服务和单体式应用。
我们不会访问与微服务相关的工具,如容器、Kubernetes、服务总线、API 网管等,也就意味着与其他微服务之间通讯有很大障碍。
因此,我们决定每个微服务都复制与存储层转换相关读服务的共享逻辑。因为不能正常拆分服务,也就意味着必须承担大量复制工作量。
例如,对于某个复杂而且基础的业务逻辑,必须复制黏贴并维护至少 4 个计划中的微服务。
开发团队只有六个月内粗略的构想,而且业务更改也很频繁(业务更改需求也是司空见惯的事情),这些让微服务化更加充满不确定性,因为即使在短期也无法预知会出现什么链接。
微服务之间的复杂性会增加吗?花了几个月分离的服务会回到过去吗?尽管我们今年早些时候做过一些 PoC,但是因为业务需求的更改不得不放弃。
我们只有一个很窄的时间窗口,刚好能把单体式应用分解成列出来的微服务,而且没有冗余时间应付可能出现的改变,也没有 Plan B,我们被自己给卡住了。
因为我们在计划阶段就发现了很多问题和挑战,更别说实施阶段了,开发团队非常有压力。
考虑到风险和时间压力,而且架构师和实施专家也都没有任何特殊经验,加上没有标准工具能用,我们只能靠自己来实施,这些都更加恶化了情况。
和其他微服务大拿沟通后,他们也都发出了很多警告,并给出了不少以前并没有的架构建议,指出了我们在域模型之间画线的顺序。
到目前为止,由于时间紧任务重,我们的计划包括了很多不同于标准微服务的妥协方案。
因为缺乏专家,这看起来更像一条不归之路,开发团队越来越焦虑。