<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SOFAArk輕量級 Java 類隔離容器

          聯(lián)合創(chuàng)作 · 2023-09-27 15:37

          SOFAArk 是一款基于 Java 實現(xiàn)的輕量級類隔離容器,由螞蟻金服公司開源貢獻;主要為應用程序提供類隔離和依賴包隔離的能力;基于 Fat Jar 技術,應用可以被打包成一個自包含可運行的 Fat Jar,應用既可以是簡單的單模塊 Java 應用也可以是 Spring Boot 應用。可訪問網(wǎng)址進入快速開始并獲取更多詳細信息。

          背景

          日常使用 Java 開發(fā),常常會遇到包依賴沖突的問題,尤其當工程應用變得臃腫龐大,包沖突的問題也會變得更加棘手,導致各種各樣的報錯,例如LinkageError, NoSuchMethodError等;實際開發(fā)中,可以采用多種方法來解決包沖突問題,比較常見的是類似 SpringBoot 的做法,統(tǒng)一管理應用所有依賴包的版本,保證這些三方包不存在依賴沖突;這種做法只能有效避免包沖突的問題,不能根本上解決包沖突的問題;如果某個應用的確需要在運行時使用兩個相互沖突的包,例如 protobuf2protobuf3,那么類似 SpringBoot 的做法依然解決不了問題;

          為了徹底解決包沖突的問題,我們需要借助類隔離機制,使用不同的 Classloader 加載不同版本的三方依賴,進而隔離包沖突問題;OSGI 作為業(yè)內(nèi)最出名的類隔離框架,自然是可以被用于解決上述包沖突問題,但是 OSGI 框架太過臃腫,功能繁雜;為了解決包沖突問題,引入 OSGI 框架,有牛刀殺雞之嫌,反而使工程變得更加復雜,不利于開發(fā);

          SOFAArk 專注于解決類隔離問題,采用輕量級的類隔離方案來解決日常經(jīng)常遇到的包沖突問題,在螞蟻金服內(nèi)部服務于整個 SOFABoot 技術體系,彌補 SpringBoot 沒有的類隔離能力。實際上,SOFAArk 是一個通用的輕量級類隔離框架,并不限于 SpringBoot 應用,也可以和其他的 Java 開發(fā)框架集成;

          原理

          SOFAArk 框架包含有三個概念,Ark Container, Ark PluginArk Biz; 運行時邏輯結(jié)構(gòu)圖如下:

          在介紹這三個概念之前,為了統(tǒng)一術語,有必要先說一下所謂的 Ark 包;Ark 包是滿足特定目錄格式要求的 Executed Fat Jar,使用官方提供的 Maven 插件 sofa-ark-maven-plugin可以將工程應用打包成一個標準格式的 Ark 包;使用命令 java -jar application.jar即可在 Ark 容器之上啟動應用;Ark 包 通常包含 Ark Container、Ark PluginArk Biz;以下我們針對這三個概念簡單做下名詞解釋:

          • Ark Container: Ark 容器,負責整個運行時的管理;Ark PluginArk Biz 運行在 Ark 容器之上;容器具備管理多插件、多應用的功能;容器啟動成功后,會自動解析 classpath 包含的 Ark PluginArk Biz 依賴,完成隔離加載并按優(yōu)先級依次啟動之;

          • Ark Plugin: Ark 插件,滿足特定目錄格式要求的 Fat Jar,使用官方提供的 Maven 插件 sofa-ark-plugin-maven-plugin 可以將一個或多個普通的 Java Jar 包打包成一個標準格式的 Ark Plugin; Ark Plugin 會包含一份配置文件,通常包括插件類導入導出配置、插件啟動優(yōu)先級等;運行時,Ark 容器會使用獨立的 PluginClassLoader 加載插件,并根據(jù)插件配置構(gòu)建類加載索引表,從而使插件與插件、插件與應用之間相互隔離;

          • Ark Biz: Ark 業(yè)務模塊,滿足特定目錄格式要求的 Fat Jar ,使用官方提供的 Maven 插件 sofa-ark-maven-plugin 可以將工程應用打包成一個標準格式的 Ark-Biz 包;是工程應用模塊及其依賴包的組織單元,包含應用啟動所需的所有依賴和配置;

          在運行時,Ark Container 優(yōu)先啟動,自動解析 classpath 包含的 Ark PluginArk Biz,并讀取他們的配置,構(gòu)建類加載索引關系;然后使用獨立的 Classloader 加載他們并按優(yōu)先級配置依次啟動;需要指出的是,Ark Plugin 優(yōu)先 Ark Biz被加載啟動;Ark Plugin 之間是雙向類索引關系,即可以相互委托對方加載所需的類;Ark PluginArk Biz 是單向類索引關系,即只允許 Ark Biz 索引 Ark Plugin 加載的類,反之則不允許。

          場景

          SOFAArk初衷是為了解決包沖突問題,那什么情況下可以使用 SOFAArk 以及如何使用呢? 假設如下場景,如果工程需要引入兩個三方包:A 和 B,但是 A 需要依賴版本號為 0.1 的 C 包,而恰好 B 需要依賴版本號為 0.2 的 C 包,且 C 包的這兩個版本無法兼容:

          此時,即可使用 SOFAArk 解決該依賴沖突問題;只需要把 A 和版本為 0.1 的 C 包一起打包成一個 Ark Plugin,然后讓應用工程引入該插件依賴即可。

          瀏覽 31
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  淫色一区二区 | 动漫美女操逼网站 | 成人网站www污污污免费网站 | 欧美精品性爱视频 | 麻豆国产成人AV一区二区三区 |