摘要: 支付寶做爲國民級應用,當前全球用戶已經超過 10 億,提供了超過 200 項以上的服務,而崩潰率始終維持在萬分之五如下,並且天天支付寶都上線新的功能和改進。作到今天這樣的成績,並不容易,是通過長時間的實踐經驗積累下來的。
本文基於重嶽在 2018 年 Arch Summit 北京站的分享內容進行總結,但願經過本篇文章介紹近些年來支付寶在移動端架構的上演進和思考,期冀能給讀者們帶來些許幫助。小程序
支付寶做爲國民級應用,當前全球用戶已經超過 10 億,提供了超過 200 項以上的服務,而崩潰率始終維持在萬分之五如下,並且天天支付寶都上線新的功能和改進。作到今天這樣的成績,並不容易,是通過長時間的實踐經驗積累下來的。
支付寶的架構演進主要經歷了三個階段,若是用比喻的話,能夠分爲獨木舟、戰列艦和航空母艦三個階段。後端
支付寶剛推出移動端時,它的結構很是之簡單,除了一些工具組件被劃分爲模塊,業務代碼都是糅合在一塊兒。剛開始並無太大問題,可是當咱們的研發人員迅速增加時,問題開始變得棘手起來,僅僅舉幾個例子即可見一斑。瀏覽器
這些嚴重的問題讓咱們的產品研發迭代變得沒法持續下去,所以咱們決定來一次完全的重構,因而步入了戰列艦時代。安全
當設計新一代的客戶端架構時,咱們從三個方向進行思考:團隊協做、研發效率、性能與穩定。性能優化
團隊協做方面,咱們但願整個架構分層合理,基礎層面,將通用能力下沉,爲更多的上層業務服務,避免重複創造輪子;業務層面,各個業務團隊可以獨立開發管理,不會對不相關的業務形成影響。基於這個初衷,咱們造成了下圖這樣的架構:網絡
整個客戶端架構總共分紅四層:業務層、服務層、組件層、框架層。架構
咱們將服務層、組件層和框架層合稱爲 mPaaS,即移動端上的 PaaS 服務。這些 PaaS 服務能夠複用,咱們不只在支付寶裏使用它們,也在其餘集團應用,如螞蟻財富、網商銀行等中使用。併發
要實現業務分治,最好的方式就在代碼上可以進行隔離,你們沒必要在同一個 Codebase 中開發,避免代碼合併衝突的現象,這個一般在 Android 上一般能夠 aar 的方式來實現,可是惋惜的是咱們重構的時候 aar 還沒出來,並且即便有 aar,也存在打包時間隨代碼體積增大線性增加的問題。框架
咱們的解決方案借鑑 OSGi 的概念,將整個客戶端以 Bundle 爲單位劃分,每一個 Bundle 能夠包含本身的代碼、頁面和資源。讀者可能會想,這究竟和 aar 有什麼分別呢?其實區別很大!前後端分離
首先,Bundle 裏的代碼部分是已編譯的 dex,當編譯 apk 時,咱們只須要合併 dex 便可,不須要像 aar 那樣將 class 編譯成 dex 再進行合併,這樣大大節省了打包時間;其次,Bundle 是能夠獨立運行於本身的 ClassLoader 中的,而且咱們能夠經過殼代理的方式加載 Activity 等基礎組件,使得動態下發業務成爲可能;最後,Bundle 裏還包含微應用、服務和 Pipeline 相關的配置信息,框架會根據這些信息啓動相應的組件。
mPaaS 的服務,即 Service 相似於 Spring 框架中的 Service,它對外提供接口服務,而使用者不須要知道如何初始化服務的實例以及生命週期管理,這些徹底由框架來託管。使用者只須要知道目標服務接口類的方法參數便可,調用時經過框架提供的 API 來獲取實例。
對於服務的發佈者來講,他在本身的 bundle 中聲明接口類以及實現接口類派生的實例類,並註冊相關信息到 bundle 的 manifest 文件中。這種作法的本質思想是 Inversion of Control,減小類之間的複雜依賴,避免繁瑣的初始化工做。以依賴接口的方式進行開發,可以解除服務使用者對服務提供者的依賴,在服務提供者還沒有徹底開發完成時,使用者能夠徹底以 mock 的方式來模擬服務,而不須要修改本身的業務代碼,固然,前提是雙方協商好服務接口的協議。
支付寶中的頁面很是多,直接啓動 Activity 或者 ViewController 對咱們來講遠遠不夠,咱們選擇在它們上面增長 MicroApp,即微應用的概念。微應用具有惟一的應用 ID,在框架中標識本身的存在。微應用具備統一的入口,根據使用方傳入的字典參數來管理 Activity 或 ViewController。這樣可以帶來不少好處:
綜上所述,微應用化和服務接口所賦予的特性極大提升團隊間協做效率,各研發小組之間的依賴更加簡單,能夠各行其道,更關注於自身服務的打造建設。
咱們一方面在架構上做出重大改變來提升研發效率,另外一方面也在不斷的進行性能優化,改善用戶體驗。咱們主要從三個層面來着手:
框架層面
基礎指標
對於經常使用指標,如閃退、ANR、內存、存儲、電量、流量等,進行長期追蹤。咱們可以明確獲悉每一個版本之間這些指標上的差別,並進行採樣分析,定位並解決問題。
向下突破
咱們不只僅在應用層面進行優化,同時也向下探索性能提高的可能性。在這方面,咱們也收穫頗豐,好比在 Android 上某些系統版本,經過在啓動階段禁用 GC 的方式得到 20%~30% 的啓動時間縮減;在 iOS 上,利用系統自己的 Background Fetch 機制提升進程活躍時間,實現應用秒起。
隨着移動支付的不斷普及,面對海量的用戶和業務需求,高可用、彈性動態成爲支付寶客戶端更爲艱鉅的挑戰。支付寶做爲集支付、金融、生活爲一體的服務平臺,須要可以快速穩定的發佈服務和引入第三方服務,同時對於用戶的反饋和訴求必須可以積極迅速的響應。
咱們在研發模式上做出改變以業務快速迭代的要求,業務逐步由原生頁面向 Web 混合頁面遷移。原有的研發模式可以很好的知足團隊協做的要求,可是隨着業務規模的不斷增大,代碼量相應膨脹致使安裝包太大,在iOS上一度超過代碼段上限,沒法經過 AppStore 審覈,另外基於集中時間點的迭代發佈,一般是一個月發佈一個版本,遠不能知足業務的更新速度要求。相較於原生應用開發,Web應用的優點很是明顯:
儘管 Web 應用優點明顯,但在移動端上的短板也是顯而易見的,它提供的用戶體驗、性能以及能力上的限制與原生應用有至關大的差距。爲了彌補這些差距,咱們作了大量的改進,主要在如下幾個方面:
咱們不只自身提供各類各樣的服務,也須要引入第三方服務來服務更多的人羣,以往咱們只能引入簡單的第三方 H5 頁面,它們只能使用支付寶提供的少許功能,並且開發人員能力的差別致使用戶體驗不是很理想。小程序將支付寶的能力全面開放出來,從開發到測試皆有完整的 IDE 等工具鏈支持,同時 DSL 簡單易用,對於第三方來講,可以快速開發上線一款體驗和功能比以往更強大的小程序。
本文爲雲棲社區原創內容,未經容許不得轉載。