Java模块化之路 —— OSGI介绍
1.初識OSGI
OSGI的全稱是Open Service Gateway Initiative,直接翻譯過來理解很費勁。為了理解這個問題,我們先看看OSGI的設(shè)計目的與實現(xiàn)特點是什么。
在傳統(tǒng)Web開發(fā)中,我們?yōu)榱诉M行功能的分離,經(jīng)常會進行模塊劃分,比如基礎(chǔ)信息模塊交由A和B做,接口信息模塊交由C和D做。最終,再匯集到一起,組成一個完整的項目。在這整一個流程中,我們做到的只是邏輯上的解耦,最終這些模塊還是運行于同一服務(wù)器上,共享同一個classpath。這時就會出現(xiàn)一個局限性問題,比如現(xiàn)在接口規(guī)范改了,我只想停掉接口信息模塊,而基礎(chǔ)信息模塊仍能正常運行,這顯然是無法實現(xiàn)的。
而使用OSGI可以完美解決這個問題,OSGI是基于模塊(Bundle)驅(qū)動的,每個模塊都有屬于自己的classpath和類加載器,模塊之間通過包暴露和引入進行關(guān)聯(lián),每個模塊有著自己獨立的生命周期,我們可以動態(tài)地對模塊進行加載、卸載、更新。如此看來,OSGI可以用一句話描述,就是一個為Java提供的動態(tài)模塊化的系統(tǒng)。
2. OSGI中模塊的生命周期
在OSGI中,每個Bundle有著下列六種狀態(tài),狀態(tài)圖如圖2-1所示:
? INSTALLED — 成功安裝Bundle。
? RESOLVED — 所有Bundle需要的Java類可用。這個狀態(tài)標(biāo)志著 bundle已經(jīng)是啟動就緒或者是已經(jīng)停止。
? STARTING — 正在啟動Bundle。調(diào)用了Bundle激活器的start方法,而且還沒有從方法中返回。
? ACTIVE — Bundle已經(jīng)啟動完畢,正在運行中。
? STOPPING — 正在停止Bundle。調(diào)用了Bundle激活器的stop方法,而且還沒有從方法中返回。
? UNINSTALLED — Bundle已經(jīng)卸載完畢,不能進入其他狀態(tài)。
圖2-1 Bundle生命周期狀態(tài)圖
3. OSGI與SOA
通過前面的說明,我們可以發(fā)現(xiàn),OSGI可以看成是一個服務(wù)發(fā)布規(guī)范,每個模塊可以看成是一個服務(wù)包,模塊可以進行注冊、監(jiān)聽,模塊間通過暴露服務(wù)進行聯(lián)系,很顯然,這是SOA的思想嘛。在OSGI RFC 119之前,OSGI只能運用于單體架構(gòu),與主要用于分布式架構(gòu)的SOA有著本質(zhì)的區(qū)別,RFC 119增加了分布式領(lǐng)域規(guī)范,這使得OSGI適用于實現(xiàn)SOA。
4. OSGI現(xiàn)狀
OSGI目前在國內(nèi)只有為數(shù)不多的公司和項目有在使用,究其原因,還是它的弊端太大了。OSGI過于復(fù)雜,似乎每個程序員用過了都說不好,主要問題有以下幾點:
(1)入門門檻高,OSGI規(guī)范多達幾十個,并包含上千個API;
(2)增加系統(tǒng)不穩(wěn)定性,由于OSGI類加載機制比較特別,經(jīng)常會出現(xiàn)不明原因的ClassNotFoundException等異常;
(3)應(yīng)用性不強,運用OSGI大部分是因為其“熱插拔”和Jar隔離特性,但是,如果不是對動態(tài)性要求特別高的項目,引入OSGI似乎只是徒增麻煩。
目前,OSGI的應(yīng)用更多的是因為其模塊性和服務(wù)性,這與主流的微服務(wù)也是融合的,但是其復(fù)雜性使得它很難成為主流。
附阿里架構(gòu)師對OSGI的評價:http://hellojava.info/?p=152
作者:Xx_hpeng
鏈接:https://www.jianshu.com/p/11dcea36b957
來源:簡書
?
總結(jié)
以上是生活随笔為你收集整理的Java模块化之路 —— OSGI介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OSGi入门篇:模块层
- 下一篇: 使用JBoss Modules来模块化J