前言

由本章节开始,我们将从支付宝客户端的架构设计方案入手,细分拆解客户端在“容器化框架设计”、“网络优化”、“性能启动优化”、“自动化日志收集”、“RPC 组件设计”、“移动应用监控、诊断、定位”等具体实现,带领大家进一步了解支付宝在客户端架构上的迭代与优化历程。

本节将介绍支付宝 iOS 容器化框架设计的基本思路。

容器化实现概览

在 mPaaS 开篇介绍中已经和大家分享过《模块化与解耦式开发在蚂蚁金服 mPaaS 中的实践》:通过容器化开发框架将业务隔离成相对独立的模块,并着力追求模块与模块之间高内聚、低耦合,因此我们实现了灵活的插件式开发,并得以将业务划分为上千个独立工程。

mPaaS iOS 框架源自于支付宝客户端,为了实现这种上千个工程之间的低耦合和相关依赖调用,mPaaS 框架直接接管了 App 的生命周期,负责整个 App 启动托管、App 生命周期管理、处理与分发 UIApplication 的代理事件。

mPaaS 框架提供了容器化环境,业务开发人员在这个容器化环境中使用 微应用 和 服务 进行具体的业务需求开发。

微应用 和 服务 是 mPaaS 框架内定义的概念,主要是用来进行业务模块间的划分。按照是否有 UI 界面作为标准,mPaaS 框架将不同的业务模块划分为 微应用 和 服务。 微应用 是 APP 运行期间带有用户界面的业务模块; 服务 是 APP 运行期由业务提供的轻量级抽象服务。在 mPaaS 框架中,通过 框架上下文Context 进行 微应用 与 服务 的生命周期管理。

应用生命周期管理

通过修改 main.m 函数的实现,mPaaS 框架使用ClientDelegate 类接管了 UIApplicationDelegate中各种 APP 生命周期。mPaaS 框架接入之后, ClientDelegate 完全替代了一般工程中的 AppDelegate 的角色,从而实现了整个应用的生命周期都是由框架进行管理。

为了方便用户获取 APP 生命周期来开发自定义功能,mPaaS 框架提供了 DTFrameworkInterface 类里面实现了 UIApplicationDelegate 中所有代理方法的等价接入方式。

只需要在 DTFrameworkInterface 的 Category 中覆盖对应的方法即可。

例如下面常见的 UIApplicationDelegate 代理方法:

在 DTFrameworkInterface 中都提供了对应的方法:

由于 mPaaS 框架有一些自己的初始化逻辑需要实现,在 DTFrameworkInterface 中额外提供了 beforeDidFinishLaunchingWithOptions 和 afterDidFinishLaunchingWithOptions 方法,方便用户在 APP 启动时确定的时间执行自己的初始化代码。

DTFrameworkInterface 在 afterDidFinis

LaunchingWithOptions 之前会启动 BootLoader,执行 mPaaS 框架的初始化逻辑。在嵌入式操作系统中, BootLoader 的作用是初始化硬件设备,以便为最终调用操作系统内核准备好正确的环境。类似的在 mPaaS 框架中, BootLoader用来初始化整个 mPaaS 框架环境,默认实现为依次执行下面的流程:

  • 创建 window
  • 创建主 NavigationController
  • 运行那些只运行一次就可以,并且需要率先启动的服务
  • 启动其它所有非 lazyload 的服务
  • 启动在 ServicesMap 的 "[AUTOSTART]" 数组中指定需要自动启动的服务分组
  • 显示主 Window
  • 启动 Launcher 微应用,显示出首页

这样就完成了 mPaaS 框架的初始化和首页的显示。

后面将详细介绍其中关键的3个概念: 微应用、 服务、 框架上下文Context。

微应用

微应用就是带 UI 界面的独立业务模块,其中最特殊的一个微应用是 Launcher 微应用, Launcher 作为 APP 启动之后第一个打开的微应用,一般用来创建 App 首页。在 mPaaS 框架中,各个微应用之间是高度独立、不相互依赖的。

微应用 通过 plist 配置来进行注册。配置微应用时需要指定 delegate 对应的类名、微应用的描述 description 以及打开微应用时使用的 name。这样 框架上下文Context 通过微应用的 name就可以打开指定的微应用。

为了方便业务开发,每个 微应用 也存在生命周期。微应用的生命周期,是模仿 iOS APP 的生命周期来做的。每个微应用需要实现自己的 DTMicroApplicationDelegate 代理,这个类似于 iOS App 中实现的 Appdelege 类。

对于具体业务开发而言 微应用 的开发和一个完整的 APP 一样,每个 微应用 负责控制自己应用内的页面堆栈,并根据 微应用 的生命周期执行相应的操作。在 mPaaS 框架中,所有的 微应用 都是运行在 mPaaS 框架提供的容器中,其不需要关注 APP 的生命周期。对于一些特殊的业务场景,mPaaS 支持创建微应用的多个实例。

服务

服务 与 微应用 不同地方在于其没有 UI 界面,是在后台执行。一旦服务启动后,其在整个客户端的生命周期中一直存在,因此服务一般用于给微应用提供通用服务,比如执行某个功能或者获取数据等。

一个常见的服务是用户登陆状态服务,每个微应用可以通过这个服务来获取到用户的登录状态和用户信息。

服务 也是通过 plist 配置来进行注册。服务注册时需要提供服务的唯一标识 name 和对应的实现类 class 类名。框架在创建 服务 时会利用 Objective-C 语言的运行时机制创建 服务 实现类的实例。 lazyLoading 用来控制是否延迟加载该类。如果是延迟加载,在框架启动时该 服务 并不会实例化,只有在用到该 服务 时才会实例化并启动。如果是非延迟加载,则在框架启动时会启动该服务。

由于服务的特殊性,在 mPaaS 中同时提供了 ServicesMap 来批量注册类, ServicesMap 中的 [AUTOSTART] 用来说明哪些组的 服务需要在 App 启动的时候最先启动。

这种分级启动服务的特点可以有效控制 APP 的启动时间,从而提供很好的用户体验。

每个服务都需要实现 服务 接口:

在增加了 服务 之后,整个 App 的结构如下图所示。后台的服务成为各个 微应用 之间沟通的桥梁。

框架上下文 Context

通过前面的介绍,大家已经对 微应用 和 服务 有了深入的了解。在 mPaaS 框架中, 框架上下文Context 承担了一个调度员的角色,负责各个 微应用 和 服务 的调度、通信管理,这样就实现了每个 微应用 的打开、页面推栈以及关闭不影响 APP 的其他 微应用 模块。

通过 mPaaS 框架提供的 DTContext * DTContextGet() 函数可以获取到框架上下文Context 对象 Context。

一个简化的 Context 类实现如下:

对于业务开发人员,可以通过 框架上下文Context 获取到主 window、启动指定的 微应用、获取一个 服务、动态注册与反注册 服务,从而实现业务之间的连接。

小结

通过本节内容,我们初步了解了 mPaaS 在 iOS 端容器化框架的设计思路,通过 微应用 和 服务 的方式完成业务模块之间的解耦和调用。 框架上下文Context 作为一个迷你的容器操作系统,为 微应用 和 服务 的运行提供了所需的容器化环境,保证了独立的业务开发流程和流畅的用户体验。

由于篇幅限制,很多技术要点我们无法一一展开。欢迎大家上手体验 mPaaS:https://tech.antfin.com/docs/2/49549

关于 iOS 端容器化框架的设计思路和具体实践,同样期待你们的反馈,欢迎一起探讨交流。

支付宝客户端架构解析:iOS 容器化框架初探相关推荐

  1. 支付宝客户端架构分析:自动化日志收集及分析

    小蚂蚁说: <支付宝客户端架构解析>系列将从支付宝客户端的架构设计方案入手,细分拆解客户端在"容器化框架设计"."网络优化"."性能启动优 ...

  2. 支付宝客户端架构分析:自动化日志收集及分析 1

    小蚂蚁说: <支付宝客户端架构解析>系列将从支付宝客户端的架构设计方案入手,细分拆解客户端在"容器化框架设计"."网络优化"."性能启动优 ...

  3. Atlas:手淘Native容器化框架和思考

    在刚刚过去的云栖大会上,手淘宣布其移动容器化框架Atlas将于2017年年初开源,对这个框架,在过去团队对外部做过一些分享,外界也一直对其十分关注,到现在它终于即将开源了. 本文将介绍Atlas的设计 ...

  4. Atlas:手淘Native容器化框架和思考-玄黎

    在刚刚过去的云栖大会上,手淘宣布其移动容器化框架Atlas将于2017年年初开源,对这个框架,在过去团队对外部做过一些分享,外界也一直对其十分关注,到现在它终于即将开源了. 本文将介绍Atlas的设计 ...

  5. 淘宝开源Android容器化框架Atlas开发者指南

    Atlas 由阿里巴巴移动团队自研,以容器化思路解决大规模团队协作问题,实现并行开发.快速迭代和动态部署,适用于 Android 4.x 以上系统版本的大小型 App 开发. 该框架于2017年3月1 ...

  6. 「第二部:容器和微服务架构」(2) 容器化单体应用

    您可能需要构建一个单独的.整体部署的web应用程序或服务,并将其部署为一个容器.应用程序本身可能不是内部单一的,而是由几个库.组件甚至层(应用程序层.域层.数据访问层等)构成.但是,在外部,它是一个容 ...

  7. 开源Android容器化框架Atlas开发者指南

    课程介绍 随着手机淘宝业务的快速增长,协作研发团队的不断扩大,技术也面临着更多挑战:一方面代码量快速上升导致方法过多,限制打包的正常输出:另一个方面各业务线的开发和集成都需要到一个 apk上,业务间相 ...

  8. 美团外卖前端容器化演进实践

    背景 提单页的位置 提单页是美团外卖交易链路中非常关键的一个页面.外卖下单的所有入口,包括首页商家列表.订单列表页再来一单.二级频道页的今日推荐等,最终都会进入提单页,在确认各项信息之后,点击提交订单 ...

  9. 海航生态科技舆情大数据平台容器化改造

    本文转载自微信公众号Docker(账号:dockerone),作者为海航生态科技技术研究院大数据开发工程师高颜. 文章介绍了海航生态科技舆情大数据平台的容器化改造经验,包括初期技术架构.应用容器化.架 ...

最新文章

  1. 开源 软件测试自动化工具,开源Web自动化测试工具Selenium IDE
  2. Intel Realsense D435 rs.rs2_deproject_pixel_to_point()函数(获取实际空间坐标)
  3. 我在STM32单片机上跑神经网络算法
  4. Kubernetes持续交付-Jenkins X的Helm部署
  5. Android 抖动提示动画
  6. ConcurrentHashMap笔记
  7. JUNIT Hello World
  8. 五邑大学计算机组成原理试卷,2017年五邑大学信息工程学院807微机原理与应用[专业硕士]之计算机组成原理考研强化模拟题...
  9. 利用github协作开发步骤
  10. 【渝粤题库】陕西师范大学292081 管理学基础 作业(高起专)
  11. 三菱plc编程软件怎么用c语言,各种三菱PLC编程软件的用途介绍
  12. java实现接口必须实现所有方法吗_我们是否必须在实现Java接口的类中实现所有方法?...
  13. K3 CLOUD组织间结算取价指引
  14. ue4 c++绘线 DrawLine
  15. 滴滴2023秋招笔试 老张的美数课 (C++ DP)
  16. MSI(Message Signaled Interrupt)/MSI-X
  17. Spring源码学习第四天==>初识Refresh()
  18. 工业平板手持PDA的功能有哪些?
  19. IDEA2016 license server 激活
  20. 【Photoshop 教程系列第 2 篇】如何将 PS 中字体单位由点改为像素

热门文章

  1. 心形尺寸比例图解_标识牌尺寸大小及空间比例关系示意图与人体工程学
  2. 商品数据结构之什么是SPU和SKU?
  3. 实验三:CART分类决策树python实现(两个测试集)(一)|机器学习
  4. Centos7+LAMP+owncloud+数据库读写分离
  5. Linux运维常用知识(1)
  6. moveit和gazebo的联合抓取仿真
  7. 开奶茶店,哪里学奶茶的制作配方?
  8. 逆水寒服务器维护公告,《逆水寒》2018年11月29日更新公告
  9. pppoe服务器账号和密码是什么,路由器的PPPOE拨号宽带账号和密码是多少?
  10. java Mail使用SSl,端口465加密发送邮件配置