目前,業內關于OSGI技術的學習資源或者技術文檔還是很少的。我在某寶網搜索了一下“OSGI”的書籍,結果倒是有,但是種類少的可憐,而且幾乎沒有人購買。
因為工作的原因我需要學習OSGI,所以我不得不想盡辦法來主動學習OSGI。我將用文字記錄學習OSGI的整個過程,通過整理書籍和視頻教程,來讓我更加了解這門技術,同時也讓需要學習這門技術的同志們有一個清晰的學習路線。
我們需要解決一下幾問題:
1.如何正確的理解和認識OSGI技術?我們從外文資料上或者從翻譯過來的資料上看到OSGi解釋和定義,都是直譯過來的,但是OSGI的真實意義未必是中文直譯過來的意思。OSGI的解釋就是Open Service Gateway Initiative,直譯過來就是“開放的服務入口(網關)的初始化”,聽起來非常費解,什么是服務入口初始化?
所以我們不去直譯這個OSGI,我們換一種說法來描述OSGI技術。
我們來回到我們以前的某些開發場景中去,假設我們使用SSH(struts+spring+hibernate)框架來開發我們的Web項目,我們做產品設計和開發的時候都是分模塊的,我們分模塊的目的就是實現模塊之間的“解耦”,更進一步的目的是方便對一個項目的控制和管理。
我們對一個項目進行模塊化分解之后,我們就可以把不同模塊交給不同的開發人員來完成開發,然后項目經理把大家完成的模塊集中在一起,然后拼裝成一個最終的產品。一般我們開發都是這樣的基本情況。
那么我們開發的時候預計的是系統的功能,根據系統的功能來進行模塊的劃分,也就是說,這個產品的功能或客戶的需求是劃分的重要依據。
但是我們在開發過程中,我們模塊之間還要彼此保持聯系,比如A模塊要從B模塊拿到一些數據,而B模塊可能要調用C模塊中的一些方法(除了公共底層的工具類之外)。所以這些模塊只是一種邏輯意義上的劃分。
最重要的一點是,我們把最終的項目要去部署到tomcat或者jBoss的服務器中去部署。那么我們啟動服務器的時候,能不能關閉項目的某個模塊或功能呢?很明顯是做不到的,一旦服務器啟動,所有模塊就要一起啟動,都要占用服務器資源,所以關閉不了模塊,假設能強制拿掉,就會影響其它的功能。
以上就是我們傳統模塊式開發的一些局限性。
我們做軟件開發一直在追求一個境界,就是
模塊之間的真正“解耦”、“分離”,這樣我們在軟件的管理和開發上面就會更加的靈活,甚至包括給客戶部署項目的時候都可以做到更加的靈活可控。但是我們以前使用SSH框架等架構模式進行產品開發的時候我們是達不到這種要求的。
所以我們“架構師”或頂尖的技術高手都在為模塊化開發努力的摸索和嘗試,然后我們的OSGI的技術規范就應運而生。
現在我們的OSGI技術就可以滿足我們之前所說的境界:在不同的模塊中做到徹底的分離,而不是邏輯意義上的分離,是物理上的分離,也就是說在運行部署之后都可以在不停止服務器的時候直接把某些模塊拿下來,其他模塊的功能也不受影響。
由此,OSGI技術將來會變得非常的重要,因為它在實現模塊化解耦的路上,走得比現在大家經常所用的SSH框架走的更遠。這個技術在未來大規模、高訪問、高并發的Java模塊化開發領域,或者是項目規范化管理中,會大大超過SSH等框架的地位。
現在主流的一些應用服務器,Oracle的weblogic服務器,IBM的WebSphere,JBoss,還有Sun公司的glassfish服務器,都對OSGI提供了強大的支持,都是在OSGI的技術基礎上實現的。有那么多的大型廠商支持OSGI這門技術,我們既可以看到OSGI技術的重要性。所以將來OSGI是將來非常重要的技術。
但是OSGI仍然脫離不了框架的支持,因為OSGI本身也使用了很多spring等框架的基本控件(因為要實現AOP依賴注入等功能),但是哪個項目又不去依賴第三方jar呢?
2.OSGI技術對我們項目的開發有什么幫助?(1)項目展示接下來我們同過項目代碼來展示一下OSGI的魅力:
我們先不要去急著理解如何使用OSGI,我們通過一個項目先來看一下OSGI的效果。
(以下工程代碼是網上教學視頻中的樣例,源碼我這里是沒有的)
(提前說一下:我們要學習的重點就是我們這個購物網站如何結合OSGI技術,使得項目更加的靈活可控,而購物網站本身并不是重點。)
首先在Eclipse中先打開我們的單服務器版本的項目:

啟動成功:


這是一個Web項目,我們打開瀏覽器看一下效果:

可以看出是一個網上購物的項目。
我們來看一下我們基于OSGI技術的項目和我們一般的項目有什么區別。
首先介紹一下這個項目的模塊:
1.大類展示
2.小類展示(大類的子產品)
點進去之后就是產品的具體信息
3.購物車沒買東西是空的:

買完之后:
4.商品管理(上架、下架)
可以看到,這個項目和我們平常開發的項目沒有什么不同(我知道界面很簡陋= =),重點是它的啟動和加載過程。
(2)關于服務器我們是通過動態加載,也就是“熱部署”來啟動我們的項目的。就是說,我們這個項目把它放在Web容器中之后,我們可以將某些功能給它拿下來,而且拿下來的時候不會對其他模塊造成影響。
我們以前運行tomcat的時候,啟動一下服務器,將Web項目一次性裝載完畢,控制臺會出現類似這種信息:

但是我們啟動這個項目的時候并不是這樣:

那么我們沒有用tomcat和jBoss,那是如何部署和啟動Web項目的呢?不可能沒有Web服務器中間件的???這里告訴大家,OSGI技術里面也是內嵌了一個Web服務器的,就是jetty。
我們打開這個項目的Run Configuration配置窗口,看一下運行這個項目所需要的插件包:

可以看到,除了一些Web項目需要的jar包,還是有jetty的存在的。所以用到的服務器是jetty,不再是tomcat。
大家可能還是比較熟悉tomcat,對于jetty不是太熟悉,那么我們簡單介紹一下jetty:
jetty也是一個比較優秀的Web容器,在某些性能方面要比tomcat強大的多(如高并發,長連接)。而且它的整個結構比tomcat輕巧很多(tomcat更臃腫),具體區別大家可以去網上自己看一下。
(3)運行模式和插件我們接下來正式看一下此項目在OSGI下的運行模式:
我們在啟動的時候,加載了四個模塊,分別是:

按照模塊化的思想他們就是四個對應的功能模塊。
他們對應的四個功能模塊的工程代碼我們可以在Eclipse中看到:

我們看一下我們的啟動配置(依然打開是Run Configuration配置窗口):


配置分為“WorkSpace”和“Target Platform”,分別是我們工作空間(我們自己寫的項目模塊和工具類)的插件和運行平臺(一些依賴jar的配置)的插件,兩者結合啟動我們的項目就會正常運行。
我們啟動項目之后,在控制臺輸入指令“ss”,就會出現我們所有加載的插件的運行情況:

一啟動的時候,它會首先加載Eclipse的OSGI插件(Eclipse本身也是一種OSGI的容器):
我們打開我們的Eclipse安裝目錄,然后找到plugins文件夾,可以看到Eclipse所有的插件:

可以看到有文件夾形式的,有jar形式的插件。
我們怎么去理解插件呢?
插件其實就是被開發工具或OSGI容器管理和配置起來的jar包。
我們隨便打開一個文件夾類型的插件,可以看到:

可以看到里面除了lib之外還有其它東西,然后有一個“OSGI-INF”文件夾。且不管它是什么,這都足以說明我們的Eclipse就是一個OSGI容器。
(4)熱部署和熱啟動我們接下來回到重點,在我們啟動的過程中,我們不停止運行,然后去停掉其中的一個模塊:
假如我們要停掉“管理”模塊:

也就是停掉id為22的插件
結果:

然后刷新我們的網站主頁面:

發現我們的“管理”模塊消失了!
這個模塊的消失并不是javascript的技術,而是一種服務器技術,我們是通過服務器內部把它動態卸載掉的。
我們的管理模塊去掉之后,網站的其它功能不受任何影響。至此我們的服務器沒有進行任何的暫停或關閉。
我們再停掉“購物車”模塊:

效果:

其它模塊依舊不受影響。
我們關閉了兩個模塊,現在輸入ss看一下所有插件和模塊的運行情況:

可以看到我們的兩個模塊處于RESOLVED狀態,也就是待解決狀態。
當然我們也可以將我們的模塊在服務器開啟狀態下部署上去:
如我們啟動購物車模塊:

發現購物車回來了:

這就是所謂的熱部署,即是這個項目把它放在Web容器中之后,我們可以將某些功能給它拿下來,而且拿下來的時候不會對其他模塊造成影響。
通過購物網站這個項目讓大家真實的感受一下OSGI這個技術在項目開發和管理的一些強大的功能。
想進一步了解更多關于OSGI的知識可以查看以后的總結文章。
轉載請注明出處:http://blog.csdn.net/acmman/article/details/50848595