[外掛化開發] 1. 初識OSGI
初識 OSGI
背景
當前product是以solution的方式進行售賣,但是隨著公司業務規模的快速誇張,隨之而來的是新客戶的產品開發,老客戶的產品維護,升級以及修改bug,團隊的效能明顯下降,為了解決此類問題,必須站在公司戰略的統一高度來重構系統。
榮幸的是,本人在此時加入團隊並負責系統架構的升級與重構工作。因為公司在全世界都有客戶,而且客戶又來自於各行各業,帶來的問題就是如何抽離公共業務的同時,又能不影響客戶的定製化需求開發?產品團隊專注於系統的核心邏輯開發,而一些定製化需求交付給global team 去開發?
選型
技術沒有銀彈,目前沒有完全確定要使用OSGI的方式來實現,因為本人之前使用Spring Cloud & Spring Cloud Alibaba各實現了一種demo, 當然也可以實現我們的服務化,高可用以及動態擴充套件。但是在解決外掛定製化這塊,相對來說還是不太熟悉,然後OSGI進入眼簾了。
OSGI 簡介
OSGI 是 Open Service Gateway Initiative(開發服務閘道器協議)。
指維護OSGI規範的官方聯盟
OSGi Alliance是一個由Sun Microsystems、IBM、愛立信等於1999年3月成立的開放的標準化組織,最初名為Connected Alliance。
官方聯盟維護的基於JAVA語言的服務規範
該規範和核心部分是一個框架,其中定義了應用程式的生命週期模式和服務註冊。基於這個框架定義了大量的OSGi服務:日誌、配置管理、偏好,HTTP(執行servlet)、XML分析、裝置訪問、軟體包管理、許可管理、星級、使用者管理、IO連線、連線管理、Jini和UPnP。
osgi.org 官方描述:
The Dynamic Module System for JAVA
通俗講:使用OSGI實現的程式(Bundle)就是一個外掛,可以動態的安裝,解除安裝,啟動,停止等等而不需要啟動容器。
目前使用最廣的兩款OSGI 框架:
Apache Felix
Apache Felix是Apache旗下的一個OSGi框架,專案本身非常成熟,已經被用到了很多其他的專案中,例如Apache Servicemix。它本身提供的服務也是最全的,幾乎涵蓋了全部的OSGi 4.2的標準。除此之外還提供了一些非標準的功能,例如iPOJO。框架本身非常緊湊,你只需要3個包加一個shell就可以運行了,無論是開發還是Debug都非常簡便。除了Felix,還有兩個專案是和OSGi相關的。一個是Apache Felix Karaf,它本身是Felix的一個子專案,但他其實是封裝了Felix提供更高一層的Runtime,例如提供了JAAS。另一個是Apache Aries,目前還處於起步階段,它作為Felix的補充,提供OSGi企業級規範,包括JPA、JDBC、JTA、JNDI等等。
Equinox
Equinox是Eclipse旗下的OSGi框架,本身也被Eclipse採用,是Eclipse註明的PDE開發環境的底層。Equinox本身也是相當的全面的框架,提供的功能不比Felix少多少。但是它功能的分類就稍顯混亂,文件和Sample也組織的不是很好。事實上相當Equinox還是被當做開發Eclipse Plugin的應用較多,如果你要開發一個Web程式,你就會感到它本身的功能和文件不夠全面。Equinox最大的優勢在於它和Eclipse結合緊密,只要你安裝了PDE,你就已經有了Equinox,可以方便的在Eclipse裡設定你開發的Bundle,啟動、部署等操作也異常簡單,而且有專門的Debug介面,你還能要求什麼呢?
如果你想基於Eclipse開發,Equinox無疑是好選擇。但對於新手而言,有時候會搞混Eclipse Plugin與OSGi的關係。
Talk is cheap, Show me the code.
環境安裝
Eclipse 版本
因本人好幾年沒使用Eclipse, 因此帶上安裝再熟悉一下哈。。。
訪問:https://www.eclipse.org/downloads/ 下載客戶端
選擇企業版之後,下一步
點選INSTALL,等待安裝完成。
建立專案
File => New => Project
選擇Plug-in Development => Plug-in Project
填寫專案屬性(OSGI framework 選擇 standard)
點選Next(關注Activator,這個會處理OSGI的start() 和 stop()時呼叫,相當於我們的main函式)
點選Next(選擇Hello OSGI)
點選 Finish
配置環境
選擇 Run => Run Configurations
選擇OSGI Framework,右鍵點選
New Configration
選擇Bundles(因為預設建立會選擇全部Target Platform,在
Eclipse IDE 2019‑09
版本下,直接啟動會報錯。所以取消所有的選項,只勾選以下就個必須的bundle就足夠。)點選
Validate Bundles
驗證我們的配置項是否正確。如果顯示如上訊息,恭喜你,可以點選Run啟動OSGI console 啦!!!
OSGI Console 啟動
IDEA 版本
IDEA也帶有OSGI 開發工具包,let's do it.
配置Framework
這裡我選擇的是Eclipse Equinox 4.13,download傳送門 ,點選下載[equinox-SDK-4.13.zip]
,下載完成之後開始配置。
IDEA(
version: ULTIMATE 2019.2
) => File => Settings (搜尋OSGI,如下圖)點選 + 新增,選中上一步下載的SDK解壓目錄
新增成功後,選擇OSGI 標籤,選擇OSGI framework 為我們配置的Equinox.
import Bnd/Bndtools projects automatically
指的是將普通的jar包 打包 為OSGI 可用的jar.
建立專案
點選File => New => Project, 選擇Java標籤下的OSGI
選擇Use Library,點選Create
找到
org.eclipse.osgi_3.15.0.v20190830-1434.jar
,選中,效果如下,點選下一步。填寫專案屬性
點選Finish。
如上圖所示,IDEA 建立的不會幫助我們生成
Activator
以及Manifest.mf
檔案。
OSGI Console 啟動
點選Run => Edit Configurations
點選 + ,選擇
OSGI Bundles
,新增核心bundles執行(ss 為檢視OSGI執行狀態命令)
Eclipse與IDEA開發OSGI,主要是manifast檔案的生成過程存在比較大的差異。
至此,我們使用兩種開發工具配置OSGI環境工作就已經完成了,下一節會開發一個基於實戰應用的示例