使用 SpringSource Application Platform 的 provisioning repository

工程 | Andy Wilkinson | 2008年5月9日 | ...

SpringSource Application Platform 的主要優勢之一是它能夠按需配置依賴項。這樣做有兩方面的好處:它確保了平臺的記憶體佔用儘可能小,並且允許在部署應用程式時無需將所有依賴項封裝在一個龐大的部署單元中(例如 WAR 檔案)。要利用這些功能,您需要了解平臺的 provisioning repository,本部落格旨在提供這方面的說明。

provisioning repository 在哪裡以及它是如何工作的?

預設情況下,平臺的 provisioning repository 位於安裝根目錄下的 repository 目錄中:Directory structure of the provisioning repository 如您所見,主要有三個目錄:bundlesinstalledlibrariesinstalled 供平臺內部使用,所以我們這裡重點關注 bundleslibraries 目錄。每個目錄都包含多個子目錄以區分不同型別的依賴項。
  • ext 包含隨平臺提供但不屬於平臺本身的外部依賴項。
  • subsystems 包含構成平臺的所有子系統。
  • usr 最初是空的,旨在包含使用者新增的依賴項,即您的應用程式依賴但平臺尚未提供的任何東西。
平臺在初始啟動期間會搜尋 repository 目錄結構以查詢 bundle 和 library。我將在本文後面討論如何配置這種搜尋。當在 repository 中找到 bundle 和 library 時,其符號名稱、匯出的包等的詳細資訊會被新增到 repository 的記憶體索引中。掃描完成後,記憶體索引會快取到磁碟。最大限度地縮短平臺的啟動時間是我們開發期間的優先事項。這種快取允許平臺在啟動期間節省一些時間:除非檢測到 repository 的內容已更改,否則可以跳過掃描。

執行時 provisioning

在純粹的 OSGi 環境中,bundle 的依賴項只能由環境中已安裝的其他 bundle 來滿足。例如,如果尚未安裝匯出 org.apache.commons.dbcp 包的 bundle,則安裝並啟動匯入該包的 bundle 將會失敗。這對於使用者來說確實很麻煩,因為他們必須手動安裝一個 bundle 的所有依賴項。值得慶幸的是,SpringSource Application Platform 透過按需動態安裝依賴項顯著改進了這一點。

當平臺啟動已部署的應用程式時,其 bundle 會安裝到 Equinox 中。然後平臺會向 Equinox 請求所有 bundle 的未滿足依賴項列表,並嘗試滿足它們。讓我們透過一個簡單的示例場景來分析這個過程。

  1. 一個匯入 org.apache.commons.dbcp 的 bundle 由平臺安裝到 Equinox 中。
  2. 平臺向 Equinox 請求該 bundle 的未滿足依賴項,並被告知匯入 org.apache.commons.dbcp 無法滿足。
  3. 平臺在其 provisioning repository 索引中搜索匯出 org.apache.commons.dbcp 的 bundle。
  4. 平臺將匯出 org.apache.commons.dbcp 的 bundle 安裝到 Equinox 中。
  5. 滿足了原始 bundle 的依賴項後,平臺成功啟動了原始 bundle。
我們希望這能讓我們的使用者的生活更輕鬆:只要您的應用程式的依賴項對平臺可用,您就可以簡單地部署您的應用程式然後開始!無需花費大量時間手動安裝應用程式的所有依賴項。這個過程的一個巨大優點是依賴項僅在需要時才安裝。您可以向 provisioning repository 新增任意數量的 bundle,而對平臺的記憶體佔用幾乎沒有影響。

如果平臺無法從其 repository 滿足某個依賴項,則會生成一條日誌訊息,詳細說明無法滿足的依賴項。有了這些資訊,您就可以使用 SpringSource Enterprise Bundle Repository 來獲取您需要的東西。我們希望 repository 能夠提供儘可能完整的 bundle 集:如果您需要某個依賴項但它不可用,請告知我們

向 provisioning repository 新增條目

您已經下載了一個或兩個依賴項,現在想將它們新增到平臺中。您只需將它們複製到 repository 中相應的目錄即可。例如,一個新的 bundle 通常會新增到 repository/bundles/usr 目錄,一個新的 library descriptor 通常會新增到 repository/libraries/usr 目錄。

如上所述,平臺使用其 provisioning repository 的記憶體索引,該索引在啟動期間填充。除此之外,平臺在部署應用程式時還會檢查其對 repository 的檢視是否最新。當您想要安裝帶有新依賴項的應用程式時,只需將依賴項複製到 repository 中相應的位置,然後部署您的應用程式即可。在部署處理過程中,平臺會注意到 repository 已更新並重新整理其檢視。這意味著您無需在每次安裝帶有新依賴項的應用程式時花費時間重新啟動平臺。

在不同安裝之間共享 provisioning repository

平臺在 provisioning repository 中搜索條目的位置可以輕鬆配置以滿足您的需求。例如,多個平臺例項可以共享部分或全部 provisioning repository,因此您無需浪費精力在不同平臺安裝之間維護重複的 bundle 集。

平臺在建立其 provisioning repository 時掃描的位置可以在 config/platform.config 檔案中配置。在沒有任何特定配置的情況下使用的預設配置是:


"provisioning" : {
    "searchPaths": [ 
        "repository/bundles/subsystems/{name}/{bundle}.jar",
        "repository/bundles/ext/{bundle}",
        "repository/bundles/usr/{bundle}",
        "repository/libraries/ext/{library}",
        "repository/libraries/usr/{library}"
    ]
}

任何相對路徑都被平臺解釋為相對於其安裝根目錄,但也支援絕對路徑。搜尋路徑中花括號內的條目只是萬用字元,例如,subsystems 搜尋路徑 repository/bundles/subsystems/{name}/{bundle}.jar 將在 subsystems 目錄的任何直接子目錄中找到名稱以 .jar 結尾的任何檔案。

希望您可以看到,在不同平臺之間共享部分或全部 provisioning repository 是一個微不足道的更改。例如,要讓平臺在其自身的 subsystemsext 目錄中以及檔案系統根目錄中名為 shared-bundles 的目錄中進行搜尋,您只需將以下 JSON (JavaScript Object Notation) 程式碼片段新增到 platform.config 檔案中:


"provisioning" : {
    "searchPaths": [
        "repository/bundles/subsystems/{name}/{bundle}.jar",
        "repository/bundles/ext/{bundle}",
        "/shared-bundles/{bundle}",
        "repository/libraries/ext/{library}",
        "repository/libraries/usr/{library}"
    ]
}

透過使用此配置來配置兩個或更多平臺安裝,可以使它們共享 /shared-bundles 中的 bundle。這可以很容易地更進一步,將所有搜尋路徑配置為指向共享位置,這樣您就根本不需要管理每個平臺的 provisioning repository 了。

下一步是什麼?

我們計劃透過提供一些工具或指令碼來簡化從同一組二進位制檔案執行多個平臺例項。這些工具或指令碼將為您完成大部分工作,提供一套合理的預設配置,您可以根據您的特定需求進行調整。

我們還打算透過允許平臺配置為在嘗試滿足依賴項時可選地搜尋遠端 repository,來結合平臺按需配置和 SpringSource Enterprise Bundle Repository 的強大功能。如果在遠端 repository 中找到了依賴項,平臺將自動處理其下載和安裝。希望這能讓開發人員的生活更輕鬆,尤其是在應用程式開發的初始階段,因為新依賴項會定期新增。

在我們開發上述增強功能以及平臺本身時,我們很想聽聽您的建議:請隨時在本部落格文章下發表評論、提交 JIRA,或在我們的論壇上發帖。

獲取 Spring 新聞通訊

訂閱 Spring 新聞通訊,保持聯絡

訂閱

搶先一步

VMware 提供培訓和認證,為您的進步加油助力。

瞭解更多

獲取支援

Tanzu Spring 在一份簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視全部