最底层是系统服务,因为我们采用了H5和RN这样跨端的技术栈,使得iOS系统和Android系统成为了最底层。
系统服务之上是集团基于Native建设的基建,全公司通用,覆盖了研发工程中方方面面的基础服务。
在基建之上是我们定义的容器层。我们尝试用单一技术栈解决所有问题。但经过我们的探索,觉得不太可能实现。好的架构要匹配业务形态,业务的诉求决定了我们不能选择唯一的技术栈去解决所有问题,细分外卖的业务场景可得到以下3个方向的页面分类:
- 高PV主流程页面,例如首页、金刚页、商家页等,这类页面的PV远高于其他页面。这类页面的特点是,交互强、曝光度高、多团队参与建设和维护。针对这类页面,为了给用户提供极致的体验,是无法采用H5或RN实现的,即使性能上能够满足,但是这些页面是多团队共同参与建设,如果用H5或RN实现,那么单一团队改动,都会造成全页面受到无法预料的影响,其他未改动的业务方肯定是无法接受的。所以这类页面,我们采用的是局部动态化+页面模块化的方案,我们针对页面进行容器化改造,将页面变成容器,容器承载模块。每个模块归不同的业务方进行维护,从模块的维度进行解耦,每个模块都可以动态配置和下发。
- 低PV辅助页面,例如帮助、足迹、收藏等,这类页面的PV低,但胜在数量多,都用原生实现成本比较高,如果都用H5来实现,不少页面和原生的关联还是比较近,不是非常适合。针对这类页面,我们采用集团提供的MRN基建去承载,MRN作为跨端的技术栈,我们已经在之前的RN混合架构的时候,建设了较为丰富的组件,针对自定义的MRN容器做了比较丰富的建设。同时,MRN具备动态下发的能力,满足业务的诉求。
- 向外投放的运营活动页面,例如圣诞节活动,时效性比较强。这类页面由H5技术栈去完成,一方面可以满足时效性,另一方面H5的动态下发能力也是最强的,这样的特性能够充分的满足业务的诉求。我们使用集团提供的Titans基建,通过建设业务自定义的Titans容器,支撑业务的发展。
再往上,就是垂直的业务,外卖目前有流量业务、交易业务、商家业务、商品业务、广告业务、营销业务、闪购业务等。业务都是垂直向下依赖,直接可见容器,可见基建,能够很好地获取到各种已经建设的能力去完成业务的需求。
最上面是承载的App端,目前有四端,包括外卖、点评、美团、闪购等等。
右侧是测试发布和线上监控,相对于常规的移动端App架构而言,容器化架构的测试发布和监控是更为精细化的。不仅仅要关注端本身的可用性,还需要关注容器、容器承载的模块、模块展示的模板,模板里面的样式这些的可用性。
2.4 容器化的挑战
容器化架构相对常规的移动端架构而言,它从管理移动端的代码转变成管理移动端的容器建设代码和业务远端开发代码,多出了容器和业务远端下发。这不仅仅是对技术上的挑战,对长期做客户端开发同学,也需要一个思维转变的跳转。
一致性的挑战:容器需要在多个宿主应用之中运行,宿主应用的环境一致性直接影响了容器的一致性。我们的策略是两手准备,一方面利用外卖业务的优势推动宿主应用的环境对齐;另一方面将容器建设成SDK,通过SDK将长期保持容器的一致性,也通过SDK内部的设计屏蔽应用之间的差异;对于Android和iOS平台,我们通过分层的设计,尽可能屏蔽平台的差异。综上所述,一致性的挑战在于(1)容器运行的宿主应用的环境一致性;(2)不同应用不同版本容器的一致性;(3)Android和iOS平台容器的对业务的一致性。
动态发布的挑战:长期以来,客户端同学的开发概念里面只有App版本的概念,而当我们逐渐把业务代码做成远端下发时,将会新增一个线上动态发版的概念。当我们在发布业务的时候,相对以往的工作,多出需要去考虑这个业务的版本,可以运行的容器对应的App上下界版本。另外,发版的周期也会新增业务的发版周期,不仅仅是App的发版周期。这两者在一起将会产生新的火花,业务的版本和App的版本如何适配的问题,业务动态发版的周期和App的发版周期如何适配的问题。外卖这边的解决方式是建设主版本迭代+周迭代的模型。
监控运维的挑战:以往的移动端架构,我们更加关注的是端本身的可用性,然而当我们演进到容器化架构的时候,仅仅关注端的可用性已经远远不能确定业务是可用的了。我们需要从端的可用性延伸出下载链路、加载链路,使用链路上的可用性,针对每个重要的环境,都做好监控运维。
3. 外卖跨端容器建设
3.1 MRN容器
3.1.1 MRN容器简介
React Native框架本身只是一个运行时环境中的渲染引擎,可以将同一套JS代码分别在Android和iOS系统上最终以Native的方式渲染页面,从而为App提供了基础的跨端能力。但从工程化的角度来看,如果想在App中大规模地应用RN技术,除了RN框架本身外,还需要在开发、构建、测试、部署、运维等诸多方面的配合。MRN(Meituan React Native)是美团基于React Native框架改造并完善而成的一套动态化方案,在RN的基础上提供了容器化能力、动态化能力、多端复用能力和工程化保障。MRN在开发效率、稳定性、性能体验、动态化和监控运维等多方面进行了能力升级和扩展,满足了美团RN开发工程化的需要。目前,MRN已接入美团40多个App,核心框架及生态工具有超过100位内部代码贡献者,总PV超过4亿。
3.1.2 Roo组件库
下面再介绍一下外卖建设的两个UI相关的技术项目,Roo组件库和组件样式动态配置。
- Roo组件库:外卖在RN及MRN框架提供的UI组件基础之上,又扩展了适用于外卖业务的标准化UI组件库。UI组件库一方面统一了我们的设计规范和开发规范,提高了UI一致性;另一方面,组件封装也提升了RN页面的开发效率和质量。
- 组件样式动态配置:有了标准的Roo组件,我们进一步给标准组件的动态添加了样式动态配置能力。在使用组件时,很多样式是支持动态下发的,例如字体、圆角、背景色等,