根據(jù)上一篇
服務(wù)框架的要素的blog,來(lái)分析下基于OSGi實(shí)現(xiàn)一個(gè)這樣的服務(wù)框架時(shí)需要對(duì)目前的OSGi框架做出哪些方面的修改,以及預(yù)估一下實(shí)現(xiàn)的難度。
1、如何注冊(cè)服務(wù)
OSGi服務(wù)采用的是xml+pojo的方式,應(yīng)該說(shuō)還是符合要求的,但如果要把這個(gè)服務(wù)注冊(cè)到一個(gè)服務(wù)中心的話,目前是不支持的,但這個(gè)對(duì)于分布式部署服務(wù)的需求而言,是必須實(shí)現(xiàn)的了。
要實(shí)現(xiàn)注冊(cè)服務(wù)至遠(yuǎn)程的服務(wù)中心,這個(gè)可以通過(guò)編寫一個(gè)監(jiān)聽(tīng)服務(wù)生命周期變化的對(duì)象來(lái)實(shí)現(xiàn),當(dāng)監(jiān)聽(tīng)到服務(wù)的生命周期發(fā)生變化時(shí),發(fā)送消息至遠(yuǎn)端的服務(wù)中心,這里也就需要做出一個(gè)服務(wù)中心和各OSGi應(yīng)用與服務(wù)中心遠(yuǎn)程通訊的機(jī)制(消息機(jī)制、RPC機(jī)制、Webservice機(jī)制等等)。
2、如何調(diào)用服務(wù)
調(diào)用服務(wù)涉及的點(diǎn)比較的多,來(lái)看看基于OSGi如何來(lái)實(shí)現(xiàn)所有的需求:
injection方式和顯示調(diào)用方式
OSGi支持injection方式的調(diào)用服務(wù),在顯示調(diào)用方式方面,OSGi不支持在OSGi框架范圍外的顯示調(diào)用,這個(gè)是有一定的不足的,因?yàn)檫@樣會(huì)導(dǎo)致和第三方框架集成的復(fù)雜,不過(guò)由于目前有了Spring-OSGi,所以呢,可以選用Spring-OSGi,這樣就兩種方式都支持了,如果不想使用Spring-OSGi的話,那么可以選擇查看OSGi框架的代碼,找出顯示調(diào)用的實(shí)現(xiàn)方法。
另外一個(gè)就是可以通過(guò)服務(wù)中心來(lái)實(shí)現(xiàn)顯示的服務(wù)調(diào)用和injection方式。
本地調(diào)用和遠(yuǎn)程調(diào)用的區(qū)別
OSGi并不支持遠(yuǎn)程服務(wù)的調(diào)用,在《OSGi進(jìn)階》Opendoc中我曾經(jīng)寫過(guò)基于webservice調(diào)用的方式,但這個(gè)對(duì)于高性能的分布式調(diào)用時(shí)其實(shí)是不可用的,要屏蔽本地調(diào)用和遠(yuǎn)程調(diào)用的區(qū)別,就得在現(xiàn)有的DS模型的基礎(chǔ)上做改進(jìn)了,需要支持引用服務(wù)時(shí)從當(dāng)前的OSGi環(huán)境中或從服務(wù)中心中注冊(cè)了,這個(gè)需要對(duì)現(xiàn)有的OSGi框架的DS實(shí)現(xiàn)做出改進(jìn),才能做到屏蔽本地調(diào)用和遠(yuǎn)程調(diào)用的區(qū)別,就可以僅僅通過(guò)在xml中做動(dòng)作就可以了。
同步調(diào)用和異步調(diào)用
這個(gè)不用說(shuō),目前OSGi自然也是不支持的,只能是對(duì)DS的實(shí)現(xiàn)進(jìn)行改進(jìn)了,增加服務(wù)的同步調(diào)用和異步調(diào)用的支持,同步調(diào)用的話就沒(méi)什么改動(dòng)的了,異步調(diào)用的話就得對(duì)ds做比較大的改動(dòng)了,注入引用的服務(wù)時(shí)注入的不能像目前的ds實(shí)現(xiàn)一樣直接注入服務(wù)實(shí)例對(duì)象了,而是只能注冊(cè)一個(gè)proxy對(duì)象了。
lazy式的調(diào)用和固定的引用調(diào)用
lazy式的調(diào)用目前OSGi并不支持,只能是自己對(duì)DS進(jìn)行改動(dòng)了,在引用遠(yuǎn)程服務(wù)和異步調(diào)用時(shí),lazy調(diào)用是非常重要的。
至于查找服務(wù)方面,這個(gè)OSGi目前的模型就可以了,只是要增加查找服務(wù)中心服務(wù)的功能,這個(gè)在修改DS實(shí)現(xiàn)調(diào)用遠(yuǎn)程OSGi服務(wù)時(shí)會(huì)去實(shí)現(xiàn)。
在服務(wù)的安全性等方面這個(gè)也只能基于DS擴(kuò)展實(shí)現(xiàn)了。
3、如何測(cè)試服務(wù)
由于OSGi的服務(wù)是POJO的方式,在服務(wù)的測(cè)試方面是完全不會(huì)有問(wèn)題的。
4、服務(wù)的生命周期
在服務(wù)的生命周期方面,我想OSGi服務(wù)目前的機(jī)制就是不錯(cuò)的,即如果當(dāng)前這個(gè)服務(wù)組件是對(duì)外暴露服務(wù)的,那么只有當(dāng)其被引用且其本身所引用的服務(wù)可用時(shí)才被激活,如組件沒(méi)有對(duì)外暴露服務(wù),那么只需其引用的服務(wù)可用就可激活了,至于服務(wù)的卸載就是在上面條件不符合的情況下就應(yīng)該卸載了。
如果有必要的話,可以把服務(wù)的狀態(tài)區(qū)分出installed、active、deactive。
另外一個(gè)值得注意的問(wèn)題就是,OSGi的DS是當(dāng)服務(wù)的生命周期發(fā)生變化時(shí),會(huì)通過(guò)bind-method和unbind-method去通知引用服務(wù)的組件的,這個(gè)特性我想即使是對(duì)于lazy式的調(diào)用也應(yīng)該保持,這里也就需要DS關(guān)于服務(wù)通知的部分實(shí)現(xiàn)的代碼了。
來(lái)看看在這種服務(wù)框架的需求下的服務(wù)的生命周期的處理情況:
安裝服務(wù):

服務(wù)被激活:

服務(wù)被鈍化:

服務(wù)被卸載:

5、服務(wù)的管理和維護(hù)
在服務(wù)的管理和維護(hù)上,應(yīng)該說(shuō)目前OSGi的DS模型提供的已經(jīng)是很完整了,不過(guò)在服務(wù)中心點(diǎn)的服務(wù)的管理上則需自己實(shí)現(xiàn)了,基本可以參照OSGi的實(shí)現(xiàn),需要考慮和增加的仍然是服務(wù)中心和各遠(yuǎn)程的OSGi應(yīng)用的通訊。
6、服務(wù)的組裝
服務(wù)的組裝方面,這個(gè)OSGi也是完全沒(méi)有支持的,這個(gè)可以考慮基于服務(wù)中心去實(shí)現(xiàn),抑或完全可以單獨(dú)實(shí)現(xiàn),只需可組裝遠(yuǎn)程的服務(wù)中心中的服務(wù)即可了。
7、服務(wù)的出錯(cuò)處理
服務(wù)的出錯(cuò)處理,這個(gè)對(duì)于OSGi來(lái)說(shuō)還是有點(diǎn)的麻煩的,就像erlang強(qiáng)調(diào)的一點(diǎn)一樣,不是進(jìn)程隔離方式,自然很難保證當(dāng)在同一VM中的一個(gè)OSGi服務(wù)出錯(cuò)時(shí)不影響到整個(gè)VM。
只能盡量的去考慮另外一種方式了,當(dāng)服務(wù)處理出錯(cuò)時(shí)的廣播了,這樣可以做到fail-fast。
8、服務(wù)事件的廣播和訂閱
服務(wù)事件的廣播和訂閱,這方面OSGi目前支持的還是挺好的,不過(guò)在增加服務(wù)中心后,就需要增加事件廣播至多個(gè)服務(wù)中心了。
在增加考量的兩個(gè)因素方面,OSGi的DS是不支持aop方式的,不過(guò)要搭建一個(gè)服務(wù)庫(kù)不是一件什么難事,其實(shí)服務(wù)中心本身就已經(jīng)是服務(wù)庫(kù)了。
上面的實(shí)現(xiàn)分析還是有點(diǎn)的虎頭蛇尾吧,最后就按照上面的分析總結(jié)成一張圖吧,來(lái)管窺下基于OSGi實(shí)現(xiàn)的分布式服務(wù)框架會(huì)是個(gè)什么樣的結(jié)構(gòu):

從上圖并結(jié)合服務(wù)的生命周期管理的部分可以看出要基于OSGi實(shí)現(xiàn)一個(gè)這種適合分布式場(chǎng)景的服務(wù)框架還是比較麻煩的,需要重寫的部分是非常的多,以此來(lái)看的話,目前OSGi最適合的場(chǎng)景應(yīng)該還是如下幾種:
1、不需要分布式部署的應(yīng)用場(chǎng)景;
2、需要分布式部署,但僅僅是分層的分布式部署,例如業(yè)務(wù)層在一臺(tái)機(jī)器上,數(shù)據(jù)層在另外的機(jī)器上。
不過(guò)基于OSGi實(shí)現(xiàn)一個(gè)這樣的服務(wù)框架也是一件很不錯(cuò)的事,估計(jì)這也是EEG目前正在做的事,希望以后能在自己有空的時(shí)候動(dòng)手做做這個(gè)基于OSGi的服務(wù)框架。