螞蟻金服類隔離工具 SOFAArk 入門及源碼講解

2021-01-10 騰訊網

情境導入

你是否遇到過包衝突問題?又是如何解決的?

有些項目都是多年的歷史「遺留財產」,老馬甚至還遇到過一個應用中有 3 個不同版本的 spring,只能說能跑起來就是奇蹟。

不過有時候會進行各種版本升級,然後會發現各種版本衝突,浪費時間在排除各種版本衝突的問題上。

那有沒有一種方法,可以幫助我們更好的解決包衝突呢?

類衝突

今天就讓我們一起學習下螞蟻金服開源的利器——SOFAArk。

SOFAArk

SOFAArk 是一款基於 Java 實現的輕量級類隔離容器,主要提供類隔離和應用(模塊)合併部署能力,由螞蟻金服公司開源貢獻;

在大型軟體開發過程中,通常會推薦底層功能插件化,業務功能模塊化的開發模式,以期達到低耦合、高內聚、功能復用的優點。

特性

基於此,SOFAArk 提供了一套較為規範化的插件化、模塊化的開發方案,產品能力主要包括:

定義類加載模型,運行時底層插件、業務應用(模塊)之間均相互隔離,單一插件和應用(模塊)由不同的 ClassLoader 加載,可以有效避免相互之間的包衝突,提升插件和模塊功能復用能力;

定義插件開發規範,提供 maven 打包工具,簡單快速將多個二方包打包成插件(Ark Plugin,以下簡稱 Plugin)

定義模塊開發規範,提供 maven 打包工具,簡單快速將應用打包成模塊 (Ark Biz,以下簡稱 Biz)

針對 Plugin、Biz 提供標準的編程界面,包括服務、事件、擴展點等機制

支持多 Biz 的合併部署,開發階段將多個 Biz 打包成可執行 Fat Jar,或者運行時使用 API 或配置中心(Zookeeper)動態地安裝卸載 Biz

基於以上能力,SOFAArk 可以幫助解決依賴包衝突、多應用(模塊)合併部署等場景問題。

classloader 加載

jvm認為不同classloader加載的類即使包名類名相同,也認為他們是不同的。

sofa-ark將需要隔離的jar包打成plugin,對每個plugin都用獨立的classloader去加載。

螞蟻金服快速入門定義 2 個不同版本的 jar

為了模擬不同版本之間的衝突,你可以自己定義 2 個不同版本的 jar 安裝到本地,也可以直接使用常用的一些工具包進行模擬。

我這裡直接使用了自己的一個工具包:

項目結構

一共下面 3 個模塊:

我們讓 serviceone 和 servicetwo 依賴不同的 heaven 版本,然後在 run 模塊中同時依賴二者,模擬 jar 版本衝突。

serviceone

pom.xml

指定依賴了 0.0.1 版本的 heaven。

是為了將當前模塊打包成為 ark-plugin。

ServiceOne.java

服務定義比較簡單,輸出一下當前類的 classloader。

servicetwo

這個和 serviceone 基本一樣,只是依賴的 heaven 版本不同。

pom.xml

ServiceTwo.java

run

這個模塊會依賴二者的實現。

pom.xml

注意這裡的 ,實際上是引入了上面編譯後的 ark-plugin,為了讓 idea 識別。

plugins 中的 為了將當前的模塊打包成為一個可以執行的 ark 包。

Main.java

運行的方法如下:

我們需要指定 ,讓 ark 啟動生效。

這樣整個入門流程就完成了,對應的日誌如下:

可以發現,所有的 classloader 都變成了 ark 對應的容器 BizClassLoader。

接下來,我們可以繼續學習一下,這背後的原理。

實現原理sofa-ark-plugin-maven-plugin 插件原理

這 3 個模塊中,都反覆出現一個核心插件:sofa-ark-plugin-maven-plugin。

這個插件做了什麼?

最好的答案就在源碼之中,我們可以到 sofa-ark-plugin 查看對應的源碼。

ArkPluginMojo

ark-plugin 核心實現類 ArkPluginMojo 定義如下:

這裡通過註解 定義了 ark-plugin,並將其生效的階段綁定為 package 打包階段。

execute 方法

也就是每次執行 mvn package 時,會執行其對應的 execute 方法進行處理。

核心實現精簡如下:

這個方法主要做了下面幾步:

建立一個zip格式的歸檔,用來保存引入的jar包和其他文件,建立輸出路徑。

獲取引入的所有依賴(Artifacts),並且將需要exclude的包排除出去。

將所有依賴寫入zip歸檔中的lib目錄下

將配置信息寫入zip歸檔中,包括 export.index,MANIFEST.MF,mark 等

SofaArkBootstrap ark 引導類

容器加載機制初始化 Ark Container

我們使用的方式,和普通的 main() 方法相比,就是多了一句

對應的源碼如下:

核心目的:

(1)將 ark container 啟動起來

(2)讓 ark container 加載 ark-plugin 和 ark-biz

isSofaArkStarted ark 是否已經啟動

實現如下:

remain()

實現如下:

作用:

獲取classpath下的所有jar包,包括jdk自己的jar包和maven引入的jar包。

將所有依賴jar包和自己寫的啟動類及其main函數以url的形式傳入ClasspathLauncher,ClasspathLauncher反射調用ArkContainer的main方法,並且使用ContainerClassLoader加載ArkContainer。

至此,就開始啟動ArkContainer了。

啟動 ArkContainer

接著就運行到了ArkContainer中的main方法,傳入的參數args即之前 ClasspathLauncher 傳入的url。

ClasspathLauncher 繼承自 ArkLauncher,實現如下:

所以後續反射調用 main 實際上會調用到 方法。

完整實現如下:

最後都會調用 start 方法進行 ArkContainer 容器啟動:

初始化 ArkService

實現如下:

這裡是選擇的 google Guice 作為注入實現。

pipeline 流水線

arkServiceContainer中包含了一些Container啟動前需要運行的Service,這些Service被封裝到一個個的PipelineStage中,這些PipelineStage又被封裝成List到一個pipeline中。

主要包含這麼幾個PipelineStage,依次執行:

(1)HandleArchiveStage

篩選所有第三方jar包中含有mark標記的plugin jar,說明這些jar是sofa ark maven插件打包成的需要隔離的jar。

從jar中的export.index中提取需要隔離的類,把他們加入一個PluginList中,並給每個plugin,分配一個獨立的PluginClassLoader。同時以同樣的操作給Biz也分配一個BizClassLoader

(2)DeployPluginStage

創建一個map,key是需要隔離的類,value是這個加載這個類使用的PluginClassLoader實例。

(3)DeployBizStage

使用BizClassLoader反射調用Biz的main方法。

至此,Container就啟動完了。

後面再調用需要隔離的類時,由於啟動Biz的線程已經被換成了BizClassLoader,在loadClass時BizClassLoader會首先看看在DeployPluginStage創建的Map中是否有PluginClassLoader能加載這個類,如果能就委託PluginClassLoader加載。

就實現了不同類使用不同的類加載器加載。

小結

對於類衝突,ark 確實是一種非常優雅輕量的解決方案。

背後核心原理就是對於 jvm classloader 和 maven plugin 的理解和應用。

學習好原理,並且和具體的應用場景結合起來,就產生了新的技術工具。

希望本文對你有所幫助,如果喜歡,歡迎點讚收藏轉發一波。

我是老馬,期待與你的下次相遇。

相關焦點

  • 螞蟻金服最大股東是阿里巴巴嗎?螞蟻金服股權結構
    與此同時,阿里巴巴同步更新了螞蟻金服持股。根據阿里巴巴年報,阿里巴巴持股螞蟻金服33%的股權,君瀚和君澳持有螞蟻金服50%股權,而君瀚屬於馬雲及阿里系、螞蟻系員工,君澳屬於阿里巴巴合夥的部分成員。因此,阿里巴巴及阿里系成員大約持股螞蟻金服大約83%的股權。  按螞蟻最後一輪融資估值1556億美元計算,馬雲持有螞蟻金服市值約為137億美元。馬雲目前仍有對螞蟻金服擁有50%以上的表決權。  今年 6 月下旬,螞蟻金服變更名為螞蟻集團,引發外界對其IPO的猜測。不過官方稱其目前沒有上市時間表。
  • 螞蟻金服股東持股比例 螞蟻金服股東名單有哪些?
    螞蟻金服股東持股比例,根據阿里巴巴發布2020財年報告,馬雲最新持股曝光,馬雲最新持股阿里巴巴4.8%的股份,持股10.4383億股,蔡崇信持股1.6%,管理層持股7.4%。軟銀依然是最大股東,持股24.9%。  阿里巴巴也同步更新了螞蟻金服持股。
  • 二面螞蟻金服(交叉面),成功砍下offer,成功定位阿里阿里P7
    記一次螞蟻金服Java程式設計師面試經歷(均為交叉面)一面自我介紹項目中的監控:那個監控指標常見的有哪些?(有什麼工具)TCP 和 UDP 的區別?TCP 數據傳輸過程中怎麼做到可靠的?說下你知道的排序算法吧查找一個數組的中位數?
  • 多人下載「螞蟻金服」被騙,支付寶:沒有叫「螞蟻金服」的App,請...
    9月14日,溫州鹿城警方通過官方微信發布《小心「安逸花」「螞蟻金服」兩款李鬼APP,今年鹿城已被騙100多萬》的通報。 9月1日,溫州鹿城濱江街道發生一起詐騙案,受害人他女士使用手機瀏覽網頁時通過彈窗下載了一個名為「螞蟻金服」的App。
  • 螞蟻金服概念相關股票
    公司與國際領先的網際網路金融科技公司螞蟻金服達成了戰略合作協議,協議約定雙方將共享技術資源、客戶資源、團隊資源,共同打造金融科技服務新模式,共同建設金融科技新生態,共同賦能金融行業新變革。雙方將在多個層面合作,相應的合作成果將會持續增強公司在金融科技服務業務領域的核心競爭力。
  • 全球最大獨角獸「螞蟻金服」的上半場歷險記
    來源:投中網7月8日,路透社報導稱螞蟻金服正計劃最快於年內在香港上市,目標估值超2000億美元。對此,螞蟻金服回應稱消息不實。其實,早在今年1月初,路透社就報導過螞蟻金服正推動香港和A股的上市計劃,同樣遭到官方否認。
  • 年初離職,學習半年源碼,終於拿到了螞蟻Offer,分享面試過程
    (有什麼工具)TCP 和 UDP 的區別?TCP 數據傳輸過程中怎麼做到可靠的?說下你知道的排序算法吧查找一個數組的中位數?除了JDK中的源碼,還挑了一個自己比較感興趣的中間件redis、SQL,深入的學習了下。哎,就衝你這個態度,我也想給你offer。不過,說到源碼,有些同學似乎比較反感,總覺得會寫代碼就成,為什麼一定要去了解源碼是怎麼實現?
  • 螞蟻金服高管被約談,是最近炒作炒過了?
    其實在最近我們可以看到很多的新聞,有關於螞蟻金服上市的,在最近螞蟻金服的勢頭可謂是無人能擋,不過螞蟻集團在A股上市定價68.8元,其A股發行總市值達到2.1萬億元,募集資金更是高達1400億元人民幣,這在中國的IPO歷史上是絕無僅有的,並且這也是人類有史以來最大規模融資定價。
  • 螞蟻金服變身「馬雲今服」,看馬雲於國於民有利有害?
    螞蟻金服上市被臨時叫停,變身「馬雲今服」,馬雲於國於民有利還是有害?左岸橋西有個同事,她家閨女的男朋友,準確點說準女婿,是螞蟻金服的高管。前一段時間,螞蟻金服謀劃上市,小兩口就計劃在杭州買一套大房子,然後把同事接過去住。
  • 支付寶母公司螞蟻金服擬落戶永州!
    6月18日下午,在永州市祁陽縣委常委、常務副縣長陳莉的主持下,祁陽縣人行、財政局、金融辦和阿里巴巴的螞蟻金融服務集團湖南分部負責人參與,就螞蟻金服擬落戶祁陽的相關事項召開了座談會。
  • 「森財之道」估值1.4萬億的螞蟻金服:上市後將為你帶來什麼?
    作為全球最大、最吸金的獨角獸,從2015年開始,螞蟻金服一直位列全球獨角獸榜單第一名。儘管目前還任何官方披露的市值數據,但幾乎所有人都肯定,螞蟻集團尋求IPO估值至少在2000億美元以上(約合1.4萬億元人民幣),可能會創造2020年度全球IPO最大上市公司紀錄。
  • 在矽谷新加坡技術布道之後,螞蟻金服ATEC大會即將造訪倫敦
    (螞蟻金服CTO兼國際事業群COO 程立)螞蟻金服ATEC(Ant Technology ExplorationConference)科技探索大會由螞蟻金服主辦,目前已在美國矽谷和新加坡等全球科技中心成功舉行,並得到了各地的科技、金融從業者的積極參與。
  • 螞蟻金服概念股拉升 合肥城建股價上漲超過4%
    據最新消息顯示,螞蟻金服概念股拉升,中國人壽(601628)股價大漲超過7%,合肥城建(002208)漲逾4%,潤和軟體(300339)、朗新科技(300682)等個股也有不同程度的跟漲。那麼,螞蟻金服概念股有哪些呢?下面就給大家介紹一些吧。
  • 螞蟻金服加碼農村金融 成中和農信第二大股東
    近期,螞蟻金服繼續加碼農村金融領域布局。12月20日,螞蟻金服在其農村金融戰略發布會上宣布入股中和農信,成為繼中國扶貧基金會之後中和農信第二大股東。同時,螞蟻金服與中華聯合保險控股股份有限公司成立合資公司「農聯中鑫科技股份有限公司」。
  • 後續來了,支付寶官方回應:沒有叫」螞蟻金服」的APP
    9月14日,鹿城公安通過官方微信發布《小心「安逸花」「螞蟻金服」兩款李鬼APP,今年鹿城已被騙100多萬》的通報。文章經媒體轉載報導後,當晚19點49分,螞蟻集團旗下支付寶官方微博回應稱:沒有叫「螞蟻金服」的App,請大家擦亮小眼睛,小心上當。
  • 廈企易聯眾「牽手」螞蟻金服
    晨報記者 鍾寶坤 股價創下一年來新低的易聯眾昨日上午突然逆市漲停,而這源於公司「牽手」螞蟻金服。天眼查數據顯示,易聯眾民生(廈門)科技有限公司發生工商變更,新增投資人為上海雲鑫創業投資有限公司,後者為浙江螞蟻小微金融服務集團股份有限公司的全資子公司。
  • 螞蟻金服不遠萬裡收購萬裡匯,美國鎖死的門被英國打開了
    自從獨立運作之後,螞蟻金服一直在謀求國際化擴張發展。從2015到2017年,螞蟻金服的首要擴張地區在東亞和東南亞。目前螞蟻金服跟印度的行動支付公司 Paytm、韓國的 K-Bank、Kakao Pay 等都有不同形式的資本合作關係。在東南亞站穩腳跟之後,螞蟻金服啟動了下一階段的計劃:進軍美國。差不多從2017年開始,在美國一些華人聚集的地區生活的朋友開始更多地看到「支付寶」這三個字。一些中餐館支持了支付寶,舊金山39號碼頭也飄滿了印有支付寶字樣的小旗子。
  • 韓歆毅正式掌舵國泰財險 前後兩任董事長均來自螞蟻金服
    近日,中國銀保監會批覆國泰財產保險有限責任公司(以下簡稱國泰財險)董事長任職資格,浙江螞蟻小微金融服務集團有限公司(以下簡稱螞蟻金服)副總裁韓歆毅成為國泰財險的新任董事長。值得一提的是,國泰財險前後兩任董事長均來自螞蟻金服。
  • 【螞蟻金服正式更名為螞蟻科技集團股份有限公司】7月13日,螞蟻金...
    2020-07-15 11:13:02來源:FX168 【螞蟻金服正式更名為螞蟻科技集團股份有限公司】7月13日,螞蟻金服運營主體浙江螞蟻小微金融服務集團股份有限公司正式變更企業名稱,變更後為螞蟻科技集團股份有限公司。
  • 螞蟻金服官宣收購WorldFirst
    2月14日,《證券日報》記者從螞蟻金服方面獲悉,總部位於倫敦的英國跨境支付公司萬裡匯(WorldFirst)已完成所有權變更,正式攜手支付寶,成為螞蟻金服集團全資子公司。對於收購價格及細節,螞蟻金服方面並未透露。 而這筆交易被視為中國科技公司迄今為止在全球金融科技領域最重要的收購之一,支付寶的全球化決心和行動一如既往。