什么是微应用架构?


在 2000 年代后期,Netflix亚马逊等网络企业面临着以巨大的规模构建软件的挑战。为了尽量减少数百名贡献者对巨大共享代码库进行更改的摩擦,他们将他们的软件拆分为可以在云中租用的硬件上单独部署和扩展的服务。将单体应用程序分解为一组独立的微服务,使团队能够以更少的运营冲突更快地行动:面向产品的团队可以拥有一个单独的服务,对其开发和运营进行细粒度的控制。 
今天,移动开发团队面临着这些网络巨头在早期经历的规模挑战。此外,他们必须克服一个额外的障碍:应用程序作为单个二进制文件提供,用户下载并在他们的设备上运行。随着移动应用程序代码库的增长,编译成越来越大的二进制文件所需的时间也越来越长。
为了应对这些扩展挑战,SoundCloudJust Eatrealestate.com.au等公司的移动团队一直在探索一种类似于微服务的方法来构建他们的应用程序。通过在专用代码库中隔离模块,他们发现他们可以避开冗长的构建时间,转而使用专用的、功能特定的应用程序来提供更快的反馈周期。
那就是微应用microapps架构。
 
什么是微应用?
微服务采用后端的隔离并单独部署它们。同样,移动开发人员可以将其应用程序的不同核心部分:单一功能、共享业务逻辑和低级功能,将这些功能转移到独立的模块库中。生成的模块彼此独立,独立于主应用程序代码库,团队可以自主地处理它们。
这种架构与其他强调模块化的方法的不同之处在于:微应用可作为快节奏开发和测试的工具,团队可以构建一个或多个针对其需求量身定制的面向内部的微应用程序,仅包括他们正在处理的功能所需的模块。
例如,一个从事电子商务应用程序结账组件的团队可以构建一个测试微应用程序,枚举付款方式、送货地址和购物车内容的组合。这将使他们能够比在主应用程序中手动重现每个组合更快地测试结账流程。
拥有针对特定功能的专用微应用程序有迭代速度的一大优势:
微应用程序的构建速度比面向用户的应用程序快得多,因为要编译的代码要少得多。此外,由于微应用仅供内部使用,因此它们不需要完善的用户体验,可以预先植入相关测试数据,并且可以避开客户体验的各个方面。这显着减少了验证更改时的摩擦,并与更快的构建时间相结合,以创建更快速、更高效的开发工作流程。 
因此,微应用架构由模块化设计组成,辅以用于开发和测试的专用应用程序(称为微应用),它们共同用于提高开发人员的速度。
与 MVC(模型-视图-控制器)或 MVVM(模型-视图-视图模型)等定义明确的框架相比,这更像是一种抽象模式,因为架构会因特定应用程序的功能而异。
 
微应用程序的基础
就其核心而言,微应用程序是一个由松散耦合、高度内聚的模块组成的网络,较高级别的功能模块依赖于较低级别的实用程序模块。它们由一个薄的协调层(面向用户的应用程序)联系在一起,并由高级工具的骨干支持。每个功能模块都可以有一个或多个专用的微应用程序,团队可以通过这些微应用程序在开发和测试更改时获得快速反馈。

  • 面向用户的应用程序

面向用户的应用程序的代码库围绕着孤立的模块并充当协调器,将它们整合到一个统一的用户体验中。它的实现应该是最小的,因为它的所有功能和业务逻辑都存在于专用模块中。它在启动时实例化功能模块,为模块提供它们所需的服务,将相关信息从一个模块传递到另一个模块,并传播操作系统和应用程序生命周期事件。
  • 功能模块

属于同一垂直业务的每个功能或功能集群都存在于一个专用模块中。例如,在电子商务应用程序中,浏览库存可能位于与购物车管理不同的模块中。模块的代码库中包含该功能所需的所有业务逻辑和自定义 UI。 
  • 用户界面模块

无论微应用程序是否具有设计系统,跨功能共享的所有 UI 元素和配置都应位于功能模块可以导入的专用库中。这极大地减少了 UI 代码重复,并有助于为用户提供一致的视觉体验。
  • 基础和实用模块

基础和实用程序模块为功能模块和面向用户的应用程序提供共享的较低级别的功能。 
基础模块集中实现功能,例如与远程 API 接口或从设备存储加载数据。聚合与低级功能相关的所有逻辑可以在进行更改时进行更好的本地推理:当不同的功能模块使用相同的低级逻辑时,每个模块都会从对其他模块的改进中受益。回到我们的电子商务应用程序示例,库存浏览团队的开发人员可能希望通过加快网络响应解码来提高销售额。由于网络解码是基础模块的一部分,因此开发者的更改将使应用程序中的所有请求更快,而不仅仅是浏览功能模块的请求。
实用程序模块包含标准库扩展等逻辑或定义明确的独立功能,如自定义日期格式。与基础或功能组件相比,此代码的更改速度往往要慢得多,因此将其存储在专用库中意味着在构建消费者应用程序时无需重新编译。
 
工具
在微应用应用程序中,CI 可以检查每个变更集,识别修改后的模块及其下游依赖项,并且只对代码库的较小子集运行测试,而忽略那些不受变更影响的。由于表面积较小,这些构建运行得更快,开发人员也能更快地收到有关其更改的反馈。
自动化,以脚本或 ​​Tuist 等高级代码生成工具的形式,使将新模块集成到面向用户的应用程序中成为一项不易出错的任务,开发人员无需编辑具有许多选项的配置文件,具有完整的心理表征应用程序的依赖树,或了解构建系统的神秘细节。微应用应用程序自动化基础的质量可能是花费在发布版本上的时间与任何人都可以触发的一步过程之间的差异。 
CI 和自动化对微应用程序不可或缺,确保测试和部署快速移动,模块无缝集成。