<SOFA:Channel/>,有趣實用的分佈式架構頻道。本文根據 SOFAChannel#11 直播分享整理,主題:從一個例子開始體驗輕量級類隔離容器 SOFAArk。
回顧視頻以及 PPT 查看地址見文末。歡迎加入直播互動釘釘羣:23372465,不錯過每場直播。git
你們好,我是玄北,SOFAArk 開源負責人,今天跟你們分享的主題是《從一個例子開始體驗輕量級類隔離容器 SOFAArk》,會跟你們一塊兒解讀 SOFAArk ,也會講解一個 Demo 案例,但願你們能夠跟我一塊兒實際操做,體驗 SOFAArk 具體操做以及功能實現。github
SOFAArk:https://github.com/sofastack/sofa-ark算法
今天的分享將從一下面三個方面展開:編程
今天的重點是最後一個部分的動手實踐,前面兩部分會跟你們簡單介紹一下 SOFAArk 的基礎概念,但願在最後一個實踐部分,你們能夠跟着我一塊兒經過 Demo 實際操做體驗 SOFAArk,也能夠在實踐過程當中幫助你們更好得了解前面介紹到的概念。api
如今咱們就開始瞭解 SOFAArk,在實踐以前,咱們先來了解一下什麼是 SOFAArk。SOFAArk 是螞蟻金服開源的一款基於 Java 實現的輕量級類隔離容器,歡迎你們關注並 Star SOFAArk。緩存
SOFAArk:https://github.com/sofastack/sofa-ark架構
在大型軟件開發過程當中,一般會推薦底層功能插件化,業務功能模塊化的開發模式,以期達到低耦合、高內聚、功能複用的優勢。基於此,SOFAArk 提供了一套較爲規範化的插件化、模塊化的開發方案。產品能力主要包括:app
SOFAArk 能夠幫助解決依賴包衝突、多應用(模塊)合併部署等場景問題。框架
SOFAArk 中有三個最主要的概念,分別是 Ark 包、Ark Biz 包、Ark Plugin 包:maven
Ark 包:相似 Spring Boot 的打包產物,是一個 Fat Jar,即應用交付終態,一個 Ark 包,能夠經過 Java-jar 的方式把它運行起來。
Ark Biz 包: 簡稱 Biz,是組件的交付終態,你們經過名字也能夠理解,裏面主要封裝了一些業務邏輯。
Ark Plugin 包: 簡稱 Plugin,提供把非業務基礎組件下沉的能力,好比 RPC、消息等。
接下來按照上述三個的順序,咱們來看一下這三個包裏主要是什麼。
下圖是 Ark 包的目錄結構,Ark 包下有 Biz 目錄,Container 目錄,Plugin 目錄,Biz 目錄中就是一個一個的 Ark Biz,Plugin 目錄保存了全部的 Ark Plugin,Container 是 Ark 容器,Ark 容器會負責啓動 Ark Plugin 及 Ark Biz。
介紹完 Ark 包的目錄格式,接下來介紹 Ark Biz 包的格式:
在 Ark Biz 包的目錄格式裏一樣有幾個比較關鍵的目錄格式,分別是:
接下來跟你們介紹 Ark Plugin 包,Ark Plugin 包的目錄結構與 Ark Biz 包的目錄結構相似,可是 Ark Plugin 包的 META-INF/MANIFEST.MF 文件會比 Ark Biz 包複雜一點,Ark Plugin 支持在 META-INF/MANIFEST.MF 文件中定義 Import package、Export package、Import classes 以及 Export classes 等屬性,這些屬性支持 Plugin ClassLoader 在加載類或者資源文件時能夠委託給其餘 Plugin 加載。
上文介紹了 Ark 包、Ark Biz 包、Ark Plugin 包的目錄結構,接下來咱們介紹下 Ark 包運行時的整個運行時結構。經過下面這張圖咱們能夠看到,在整個運行時,Ark 包分爲三層,底層是 Ark Container,中間層是 Ark Plugin,上層是 Ark Biz。Ark Container 負責啓動全部 Ark Plugin 及 Ark Biz,Ark Plugin 支持類導入導出能力,因此 Ark Plugin 之間有雙向箭頭相互委託。爲了簡化 Ark Biz 的使用,Ark Biz 不支持導入導出類,Ark Biz默認會導入全部 Ark Plugin 的類。
SOFAArk 的不一樣 Plugin 相互委託類加載的能力能夠幫助咱們解決一個文件場景,那就是依賴衝突:
以上圖的場景爲例,有一個 Project,依賴了 Dependency A 以及 Dependency B,這兩個依賴依賴了不一樣版本的 Hessian,Dependency A 依賴了 Hessian 3,Dependency B 依賴了 Hessian 4,Hessian 3 與 Hessian 4 是不兼容的,會出現衝突,那麼要如何解決這個問題呢?
SOFAArk 就給出了一個解決方案。若是咱們的 Dependency A 跟 Dependency B 的 Hessian 依賴有衝突的話,咱們能夠把 Dependency A 做爲一個總體打包成一個 Ark Plugin, Dependency B 做爲一個總體打包成一個 Ark Plugin,每一個 Ark plugin 都是一個單獨的 Classloader,這樣 Dependency A 使用的 Hessian 3 和 Dependency B 使用的 Hessian 4 將再也不衝突。
解決依賴衝突是 SOFAArk 的一個主要使用場景,可是今天咱們不詳細介紹這個場景,今天主要介紹 SOFAArk 的另外一個能力,即組件運行時能力。
組件運行時提供了一種能力,它可以在不重啓應用的前提下,經過動態安裝、卸載、切換 Biz 模塊,實現修改應用運行方式的目的。下圖展現了組件運行時的運行時結構,整個運行時結構與上文的 Ark 包運行時結構很類似,不一樣的是咱們擴展了 Ark Biz 的類型,在組件運行時結構中,Ark Biz 有兩種類型,分別是 Master App Biz 和 Dynamic Biz。 Master App Biz 咱們把他叫作宿主應用,不可動態安裝、卸載,Dynamic Biz 就是動態模塊,能夠在運行時進行動態安裝、卸載。
在動態安裝、卸載組件的過程當中,SOFAArk 提供了豐富的生命週期管理:
安裝一個 Biz 主要須要通過:解析模塊-註冊模塊-啓動模塊-健康檢查-切換狀態,其中任何一個步驟失敗,都會致使 Biz 安裝失敗。
卸載模塊的時候也會有一些流程,首先須要把它切換成 deactivated - 關閉 applicationcontext - 註銷 JVM 服務 - 發送卸載事件 - 清楚緩存 - 切換 unresolved。
不一樣的模塊並非孤島,模塊與模塊之間確定須要通訊。下面來介紹一下模塊之間是如何通訊的。兩個 Ark Biz 之間能夠經過 JVM、RPC/Dubbo/Rest、擴展點進行通訊。這樣每一個模塊能夠互相感知其餘模塊。
例如左邊的 Biz 是一個宿主 Biz,右邊這個 Biz 是一個動態 Biz,宿主 Biz 去調用動態 Biz 的服務,若是這個動態 Biz 有 bug 須要修復時,咱們能夠不重啓宿主 Biz,而是經過給他裝一個新版本動態 Biz 解決。
前面帶你們快速介紹了 SOFAArk 中的基礎概念以及組件運行時中的基礎概念,接下來咱們來動手實踐操做一下組件運行時的使用。
這裏先介紹一下今天要演示的場景,如上圖,Scene 1 中主管以爲如今商品的列表展現毫無規則,須要修改算法,常規來講若是修改算法的話,通常須要重啓應用,這樣就顯得比較繁重。Scene 2 中主管一樣以爲須要修改算法,不過此時咱們使用了 SOFAArk 的組件運行時能力,能夠作到不重啓應用修改算法的目的。
最終實現的效果就是在默認狀況下,應用啓動是以下圖這樣的排列順序:
在實踐完成以後,咱們安裝了新的模塊以後,它的排序順序會發生變化,以下圖所示:
這就是咱們今天主要要實現的效果,接下來咱們就進入 Demo 實踐,進行一步步操做,帶你們更好地瞭解 SOFAArk 組件運行時。
本期的實驗內容是經過 SOFAArk 提供的動態模塊能力,實現商品列表排序策略的動態變動。經過在不重啓宿主機,不更改應用配置的狀況下實現應用行爲的改變。
目前咱們已經將 Demo 工程上傳到 Github,你們能夠跟着 README 一步步操做便可看到最終效果。
Demo:https://github.com/caojie09/sofachannel-demo
以上就是咱們本期 SOFAChannel 的所有分享內容,本次分享首先帶你們快速瞭解了 SOFAArk 中比較重要的三個基礎知識點,分別是 Ark 包、Ark Biz 包以及 Ark Plugin 包。在瞭解了 SOFAArk 基礎知識點以後又帶你們熟悉了 SOFAArk 組件運行時概念以及 SOFAArk 組件運行時須要解決的問題。最後經過一個實操例子,幫助你們快速上手 SOFAArk 組件運行時。
有任何問題,歡迎留言或在 Github 上與咱們交流。
SOFAArk:https://github.com/sofastack/sofa-ark
https://tech.antfin.com/community/live/1076
用 SOFAArk 的話,能直接集成到 SOFABoot 工程不?仍是說必需要建個 SOFAArk 的工程?SOFAArk 能夠運用於非 SOFABoot 的項目麼?
A: 能直接集成到 SOFABoot 工程,不須要新建 SOFAArk 工程,也能夠用於非 SOFABoot 工程,只要是 Spring Boot 工程便可,可是不引入 SOFA 相關依賴的話,@SofaService 及 @SofaReference 等註解就無法用了。
宿主包剛開始是指定的1.0版本,若是我線上我已經升到2.0的版本,萬一線上機器掛掉重啓,那個人算法都變了吧,就有問題。
A:這個須要進行一些集羣管理,重啓的時候自動安裝模塊,目前咱們開源了 sofa-dashboard 能夠幫助你們進行集羣管理。
SOFADashboard:https://github.com/sofastack/sofa-dashboard
重啓應用排序會發生變化嗎?
A:能夠在 Ark Biz 中指定 priority,保證啓動順序。
若是是多副本的狀況下怎麼更新?
A:多副本指的就是集羣管理?目前咱們開源了 sofa-dashboard 能夠幫助你們進行集羣管理。
Biz 的安裝能夠經過 Api 嗎?
A:sofa-ark 工程中提供 com.alipay.sofa.ark.api.ArkClient 類,用於支持 API 方式安裝 Biz。
運行期間安裝 biz,而後激活模塊這一過程作了哪些事情 ,若是這個 biz jar 包放在遠程倉庫怎麼加載裏面的代碼呢?是拉下來放到本地的一個磁盤用 classloader 去加載使用嗎?
A:運行期安裝會動態建立一個 ClassLoader 將 Biz 代碼加載起來,激活只是在內部修改了模塊狀態,同一時刻一個模塊只能有一個版本是激活態。若是 Biz Jar 在遠程倉庫,會下載到本地後再用 classloader 加載的。
運行期間安裝 biz 後,那個 execute jar 包裏會有這個 biz 包嗎?
A:不會。
SOFAArk 有什麼實際的應用場景嗎?
A:能夠看下這個:https://mp.weixin.qq.com/s/PmB72OB3iALsyqRJztbpWA
同時,咱們開啓了《剖析 | SOFAArk 源碼》系列,會逐步詳細介紹各個部分的代碼設計和實現,預計按照以下的目錄進行:
歡迎參與共建,在【金融級分佈式架構】公衆號後臺回覆【想認領的文章名稱】,咱們將會主動聯繫你,確認資質後,便可加入,It's your show time!