[插件化開發] 1. 初識OSGI
- 2019 年 10 月 15 日
- 筆記
初識 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環境工作就已經完成了,下一節會開發一個基於實戰應用的示例。
[參考2]: https://blog.csdn.net/qq_34248376/article/details/82585930
奔跑的人生 | 博客園 | segmentfault | spring4all | csdn | 掘金 | OSChina | 簡書 | 頭條 | 知乎 | 51CTO