OSGI(面向Java的動態模型系統)

OSGI(面向Java的動態模型系統)

     OSGi(Open Service Gateway Initiative)技術是面向 Java的動態模型系統。OSGi服務平臺向 Java提供服務,這些服務使Java成爲軟件集成和軟件開發的首選環境。 Java提供在多個平臺支持產品的可移植性。OSGi技術提供容許應用程序使用精煉、可重用和可協做的組件構建的標準化原語。這些組件可以組裝進一個應用和部署中。
中文名:開放服務網關協議
外文名:Open Service Gateway Initiative
應用對象
Java動態模型系統
類    別
網關協議

目錄

1背景html

2安全協議java

3框架結構web

4標準服務數據庫

5框架服務編程

6系統服務小程序

7Hello World緩存

▪  3 小結

8書籍安全

 
 

1背景

OSGi服務平臺提供在多種網絡設備上無需重啓的動態改變構造的功能。爲了最小化耦合度和促使這些 耦合度可管理,OSGi技術提供一種面向服務的架構,它能使這些組件動態地發現對方。OSGi聯
OSGI OSGI
盟已經開發了例如像 HTTP服務器、配置、日誌、安全、用戶管理、 XML等不少公共功能標準組件接口。這些組件的兼容性 插件實現能夠從進行了不一樣優化和使用代價的不一樣計算機服務提供商獲得。然而,服務接口可以基於專有權基礎上開發。
由於OSGi技術爲集成提供了預創建和預測試的 組件子系統,因此OSGi技術使你從改善產品上市時間和下降開發成本上獲益。由於這些組件可以動態發佈到設備上,因此OSGi技術也能下降維護成本和擁有獨一無二的新的配件市場機會。[1]  

2安全協議

安全機制是創建在Java和 Java2安全模型基礎之上。 Java語言的設計對不少結構進行了限
制。例如病毒中常常遇到的 緩存溢出是不可能發生的。Java語言中的訪問控制符限制了代碼可見性。
OSGI平臺經過使用私有類(在Java中不能用標準方式使用的機制)擴展了該模型。Java2安全模型提供了一個完整模塊檢查代碼對於資源的可訪問性。OSGI增長了徹底動態的權限管理,簡化了操做者和 系統管理員的工做。
OSGI聯盟已經定義了不少協議服務,這些服務將外部協議映射爲OSGI服務。 HTTP服務(HttpService)該HTTP服務是servlet運行器。bundles提供servlets,這些服務端小程序基於 HTTP協議成爲可用的。OSGi服務平臺的動態更新功能使HTTP服務成爲一個很是具備吸引力的Web服務器,它能伴隨着新的servlet被更新,若是須要能夠遠程更新而無需重啓。
UPnP服務(UPnPService)通用即插即用( UPnP)是一個正在造成中的消費電子標準。OSGi中的UPnP服務在一個UPnP網絡上將設備映射到服務註冊中。一樣,它也能夠將OSGi服務映射到UPnP網絡。這是發佈版本3中的推薦規範。
DMT管理(DMTAdmin)開放移動聯盟( OMA)基於設備管理樹爲移動設備管理提供了一個完整規定。DMT管理服務定義該樹如何被訪問和/或者在OSGi服務平臺中被擴充。

3框架結構

OSGI規範的核心組件是OSGI框架。這個框架爲 應用程序(被叫作組件(bundle))提供了一個標準環境。整個框架能夠劃分爲一些層次:
OSGI OSGI
L0:運行環境
L1: 模塊
L2:生命週期管理
L3:服務註冊[1]  
還有一個無處不在的 安全系統滲透到全部層。
L0層執行環境是Java環境的規範。Java2配置和子規範,像 J2SE,CDC,CLDC, MIDP等等,都是有效的執行環境。OSGi平臺已經標準化了一個執行環境,它是基於基礎輪廓和在一個執行環境上肯定了最小需求的一個小一些的變種,該執行環境對OSGi組件是有用的。
L1模塊層定義類的裝載策略。OSGi框架是一個強大的具備嚴格定義的類裝載模型。它基於Java之上,可是增長了模塊化。在Java中,正常狀況下有一個包含全部類和資源的類路徑。OSGi模塊層爲一個模塊增長了私有類同時有可控模塊間連接。模塊層同安全架構徹底集成,能夠選擇部署到部署 封閉系統,防護系統,或者由廠商決定的徹底由用戶管理的系統。
L2生命週期層增長了可以被動態安裝、開啓、關閉、更新和 卸載的bundles。這些bundles依賴於於具備類裝載功能的模塊層,可是增長了在運行時管理這些模塊的 API。生命週期層引入了正常狀況下不屬於一個應用程序的動態性。擴展依賴機制用於確保環境的操做正確。生命週期操做在安全架構保護之下,使其不受到 病毒的攻擊。
L3層增長了服務註冊。服務註冊提供了一個面向bundles的考慮到動態性的協做模型。bundles能經過傳統的類共享進行協做,可是類共享同動態安裝和卸載 代碼不兼容。服務註冊提供了一個在bundles間分享對象的完整模型。定義了大量的事件來處理服務的註冊和刪除。這些服務僅僅是能表明任何事物的Java對象。不少服務相似服務器對象,例如HTTP服務器,而另外一些服務表示的是一個真實世界的對象,例如附近的一個藍牙手機。這個服務模塊提供了完整安全保障。該服務安全模塊使用了一個很聰明的方式來保障bundles之間通訊安全。

4標準服務

在該框架之上,OSGi聯盟定義了不少服務。這些服務經過一個Java接口指定。bundles可以實
OSGI OSGI
現這個接口,並在註冊服務層註冊該服務。服務的 客戶端在註冊庫中找到它,或者當它出現或者消失時作出響應。這個同 SOA架構使用Web服務進行發佈的方式類似。
二者主要不一樣是Web服務老是須要傳輸層,這個使它比採用直接方法調用的OSGi服務慢幾千倍。同時,OSGi組件可以對這些服務的出現和消失作出響應。更多的信息能夠從OSGi服務平臺發行版本4手冊或者 PDF下載中找到。須要注意的是每一種服務都是抽象定義的,與不一樣計算機服務商的實現相獨立。

5框架服務

OSGi框架提供一個權限管理服務,一個包管理服務和一個開始級別服務。這些服務是一個可
OSGI OSGI
選部分,指示 框架的操做。框架服務以下:
權限管理(PermissionAdmin)目前或者未來的bundles的 權限經過這種服務進行維護。一旦設置了它們,權限服務當即激活。
包管理(PackageAdmin)bundles同類和資源分享包。bundles的更新可能須要系統從新計算這些依賴。這個包管理服務提供關於系統的實際包分享狀態和可以刷新已經共享的包。也就是,取消依賴和從新計算依賴。
啓動級別(StartLevel)啓動級別是一個bundles集合,它們應該同時運行或者應該在其它已經啓動之前被初始化。啓動級別服務設置當前的啓動級別,爲每一個bundle排一個啓動級別和審覈當前的設置。
URL處理者(URLHandler)Java環境爲 URL處理者支持一個提供者模型。然而,這是一個單件,不可能在一個象OSGi可能有不少提供者的協做環境上使用它。此服務規範使任何組件提供額外的URL處理者。

6系統服務

系統服務提供水平功能,它在每一個系統是必須的。日誌服務,配置管理服務,設備訪問
OSGI OSGI
服務,用戶管理服務, IO鏈接器服務和參數服務都是系統服務的一個方面。
日誌服務(LogService)日誌信息,警告,調試或者錯誤信息經過日誌服務來處理的。它接受日誌實體並分派這些實體到訂閱了這個信息的其餘bundles。
配置管理服務(ConfigurationAdminService)該服務提供一個設置和獲取配置信息的靈活、動態模型。
設備訪問服務(DeviceAccessService)設備訪問是OSGi爲一個新的設備匹配一個驅動,並自動下載一個實現該驅動的bundles的機制。這個可用做即插即用方案。
用戶管理服務(UserAdminService)該服務使用一個用於 受權和驗證目的的用戶信息數據庫。
IO鏈接器服務(IOConnectorService)該IO鏈接器服務實現了CDC/CLDCjavax包,並做爲一個服務。該服務容許bundles提供新的可交換 協議模式。
參數服務(PreferencesService)該服務提供了參數層級 數據庫的可訪問性,同Windows註冊表或者Java參數類類似。
組件運行時服務(ComponentRuntime)服務的動態特性--它們可以在任什麼時候間來去自由--使編寫 軟件變得更難。組建運行時規範經過提供一個基於依賴聲明的XML文件來簡化處理這些動態方面。
部署管理服務(DeploymentAdmin)OSGi的主要部署格式是bundle,它是一個JAR/ZIP文件。部署管理提供第二種可選格式:部署包。部署包可以將bundles和相應資源聯接成可被安裝和卸載的單個交付。完整的資源處理器模型容許用戶代碼擴充資源類型。
事件管理服務(EventAdmin)不少OSGi事件有特定的類型化的 接口,使其很難接收和過濾事件。事件服務提供一個泛化的基於主題的事件機制。這個規範包括爲全部已存框架和服務事件的映射。
應用程序管理服務(ApplicationAdmin)OSGibundle模型不一樣於依賴於啓動和關閉形式的典型的桌面或者 移動電話應用程序模型。該應用程序管理服務提供了傳統應用程序模型和它所要求的管理設施。

7Hello World

0.前言
這篇文檔介紹如何使用OSGi框架的一個實現——Equinox來教你如何配置一個簡單的OSGi開發環境,而且在這個環境上開發一個HelloWorld程序,這其中會涵蓋前面的入門篇講到的三個層次的內容,讓你在實踐的同時鞏固以前瞭解的內容。話很少說,咱們開始吧! [2]  
開發環境創建
1.1 Equinox是什麼
從代碼角度來看,Equinox其實就是OSGi核心標準的完整實現,而且還在這個基礎上增長了一些額外的功能(好比爲框架增長了命令行和程序執行的入口)。咱們在以前入門篇講解的都東西其實都是OSGi核心標準的一小部分。其實它的核心就是一個jar包,這個jar包既能執行(做爲標準Java包的特性),也是一個bundle(Manifest裏面含有OSGi bundle特有的元數據)。
如今你須要知道的就是,咱們可以利用Equinox項目的代碼來運行一個實實在在的OSGi框架,框架啓動後,你就能夠將你開發好bundle放到裏面運行。
1.2下載Equinox
Equinox在Eclipse官方網站上有下載,裏面列出了各個版本供咱們選擇:
在這裏,咱們使用3.7版本的Equinox,下載好之後放在一個單獨的文件夾下(這裏個人路徑是E:\OSGi framework\equinox)
1.3 從命令行啓動框架
若是啓動這個框架的話,有了上面的jar包就足夠了,咱們進入命令行輸入以下命令:java –jar org.eclipse.osgi_3.7.0.v20110613.jar -console ,而後就會進入Equinox的控制檯:
若是出現osgi>的提示符,就說明啓動成功了。
Equinox的控制檯的部分基本命令以下(區分大小寫):
install [URL]
將URL表示的bundle安裝到框架中
uninstall [bundleID]
將id=bundleID的bundle卸載
start [bundleID]
啓動一個bundle
stop [bundleID]
中止一個bundle
refresh [bundleID]
刷新bundle
update [bundleID]
更新bundle 的內容
ss
簡單顯示全部bundle的狀態
status
展現安裝的bundle和註冊的服務
headers [bundleID]
展現bundle 的manifest中的元數據
1.4 Eclipse創建環境
在上一節中你們看到啓動和控制框架的方法,是至關簡單的一個過程。不過單單只是運行環境還不夠,咱們還須要開發環境。
1.4.1 設置
首先咱們不須要安裝必須的插件,只要你有較新版本的Eclipse就好了。而後進入Eclipse的window->preferences界面,選中Plug-in Development下的Target Platform
如今右邊只有一個Runing Platform的,咱們任務是點擊「Add…」按鈕來增長一個咱們本身的的platform,進入以下界面:
選擇默認的第一個就好,點擊next。
再點擊這裏的「Add…」:
選擇「Directory」:
選擇你的Equinox的jar包所在的路徑,而後點擊finish,回到剛纔的界面:
這時候你就會發現裏面多出來了你剛剛設置的路徑,路徑後面描述的「1 plug-ins available」則就是說的咱們放置的Equinox的jar包。
繼續點擊finish,回到最開始的界面
這時候多出來了一個新的target platform,勾選上,而後肯定。 [2]  
1.4.2 啓動
打開菜單項Run->Run configurations…,在OSGi Framework項中,新建一個Runconfiguration:
這裏面如今已經自動包含了Equinox的jar包了,點擊Run,看看運行的效果:
Eclipse的控制檯中也出現來了osgi的提示符,說明你已經成功啓動了。
你能夠試試剛纔講的那些命令,看看能輸出些什麼(好比上圖中我輸入了ss)。 [2]  
1.4.3 新建一個project
打開新建project的界面,選擇Plug-in Project:
而後輸入project的名字,TargetPlatform處選擇an OSGi framework->Equinox或者standard都行,點擊下一步:
這裏其實是對bundle的Manifest文件的設置,其中的ID就是Bundle-SymbolicName,Version就是bundle的版本號,下面還能決定是否認義BundleActivator,點擊finish就建立了一個project
至此,開發環境已經創建完畢(這個project只是爲了演示怎麼創建,不會在接下來的內容中用到,可刪之)。 [2]  
2 HelloWorld代碼
如今可謂是萬事具有,只欠Helloworld了。爲了將OSGi框架的三個層次都涵蓋到,這個Helloworld可能會比其餘你見到的OSGi Helloworld程序要複雜一點點。若是對代碼中的一些API感到生疏,記得回到以前的入門篇中找到對應的內容,這樣對你理解代碼會有幫助。裏面的關鍵代碼已經用黃色高亮顯示。(出於篇幅考慮,代碼中的import語句都省略)
2.1 HelloWorld的定義與實現
首先咱們建立一個工程org.serc.helloworld,在這個工程裏面,咱們建立一個包含sayHello方法的接口,準備做爲服務接口:
package org.serc.helloworld;
public interface Hello {
void sayHello();
}
而後,對這個接口進行實現:
package org.serc.helloworld.impl;
public class HelloImpl implements Hello{
final String helloString;
public HelloImpl(String helloString){
this.helloString= helloString;
}
public void sayHello(){
System.out.println(this.helloString);
}
}
這個類實現的sayHello所作的工做就是輸出一個在對象構造的時候獲得的helloString 字符串。
爲了將這個接口暴露出來,咱們須要在MANIFEST文件中加入以下條目:
Export-Package: org.serc.helloworld;version="1.0"
接下來,爲了把這個服務註冊到框架中,咱們定義了一個Activator:
package org.serc.helloworld.activator;
public class Activator implements BundleActivator {
private List<ServiceRegistration> registrations = new ArrayList<ServiceRegistration>();
public void start(BundleContext ctx) {
registrations.add(ctx.registerService(Hello.class.getName(),new HelloImpl("Hello, OSGi"), null));
}
public void stop(BundleContext ctx) {
for(ServiceRegistration registration : registrations) {
System.out.println("unregistering:"+ registration);
registration.unregister();
}
咱們爲這個HelloImpl傳入了"Hello, OSGi"的字符串
爲了讓這個Activator可以工做,須要在MANIFEST文件中作以下定義:
Bundle-Activator:org.serc.helloworld.activator.Activator
這個bundle 最終的MANIFEST內容以下:
Bundle-ManifestVersion:2
Bundle-SymbolicName:org.serc.helloworld
Bundle-Version:1.0
Bundle-Activator:org.serc.helloworld.activator.Activator
Import-Package:org.osgi.framework
Export-Package: org.serc.helloworld;version="1.0"
2.2 得到並執行SayHello服務
建立一個工程org.serc.helloworld.client,建立一個叫HelloUser的BundleActivator,其中的start方法會得到接口爲Hello的服務對象,而且經過這個對象來調用sayHello方法:
package org.serc.helloworld.client;
public class HelloUser implements BundleActivator {
public void start(BundleContext ctx) {
ServiceReference ref = ctx.getServiceReference(Hello.class.getName());
if(ref != null) {
Hello hello = null;
try{
hello= (Hello) ctx.getService(ref);
if(hello != null)
hello.sayHello();
else
System.out.println("Service:Hello---objectnull");
}catch (RuntimeException e) {
e.printStackTrace();
}finally {
ctx.ungetService(ref);
hello= null;
}
}else {
System.out.println("Service:Hello---notexists");
}
}
public void stop(BundleContext ctx) throws Exception {
}
}
爲了得到Hello這個接口的定義,咱們還須要在MANIFEST文件中import Hello所在的package:
Bundle-ManifestVersion:2
Bundle-SymbolicName:org.serc.helloworld.client
Bundle-Version:1.0
Bundle-Activator:org.serc.helloworld.client.HelloUser
Import-Package:org.serc.helloworld;version="[1.0,2.0)",org.osgi.framework
2.3 HelloWorld程序的流程
可能光看代碼會比較不容易看清楚程序的執行流程,下圖表示了這幾個類的各個功能的相互依賴關係,整個關係從Hello接口的定義開始;而後到Hello接口被實現,獲得HelloImpl;再到Activator將HelloImpl註冊爲框架中的一個服務,再到HelloUser經過與框架交互獲得剛纔註冊的服務,而且使用這個服務從而輸出字符串;最後一個可選流程是當咱們stop org.serc.helloworld這個bundle的時候,程序會將以前註冊的服務註銷掉。
2.4 程序的執行
經過上面的工做,咱們獲得了兩個本身定義的bundle:
org.serc.helloworld
org.serc.helloworld.client
如今打開Run configurations界面,咱們會看見Bundles標籤裏面多出來了這兩個bundle:
也就是說,OSGi框架在啓動的時候,會自動install和start這2個bundle。
2.5 利用命令行查看程序執行過程當中框架狀態的變化
2.4其實只給出了一個結果,若是你還不太清楚這個結果具體是怎麼出來的,那麼這一節的內容應該可以幫助你更好的理解輸出結果的過程。下面咱們經過Equinox的一些命令行來一步一步安裝和執行bundle,而且查看過程當中框架的狀態變化,來讓大家搞清楚這個結果是怎麼來的。
首先在Run configuration中取消兩個helloworld bundle的自動啓動:
而後點擊Run,這時候就不會當即輸出Hello, OSGi字符串了,如今咱們先用「ss」命令查看bundle 的狀態:
可見兩個bundle並非出於ACTIVE狀態,說明並無啓動,如今咱們執行「start 8」來啓動org.serc.helloworld這個bundle
在用services命令查看當前已經註冊的服務,咱們會看到一大堆的系統服務中多出來以下一項服務
這顯然是咱們在start之後註冊上去的,可是如今尚未任何一個bundle在使用這個服務。
接下來咱們start 9號bundle,也就是咱們用來調用服務的bundle
這時就輸出了「Hello, OSGi」的字符串。
那麼若是咱們先啓動9號bundle而不啓動8號bundle會怎麼樣呢?你們能夠試一試,由於咱們在代碼中已經對沒有服務的異常狀況作了處理,屆時會有相應的輸出。
咱們先中止8號bundle
你們能夠看見剛纔註冊的服務已經被註銷了,如今咱們執行refresh 11(也就是剛纔的9號bundle)來從新執行其中BundleActivator的start方法
可見Hello服務已經不復存在了。從這裏咱們能夠看出來,其實Bundle的啓動順序也是一個須要注意的環節,有時候你所定義的bundle是具備順序敏感性的,必需要某些前置bundle啓動了之後,後面的bundle才能正確啓動。 [2]  

3 小結

這篇文檔是入門篇的最後一章了,但願讀者在花時間看完這4篇文檔而且動手實踐後可以有所收穫,而且對OSGi框架的工做原理及其優點能有一個比較清晰的瞭解和認識。[2]  

  

8書籍

深刻理解OSGi 深刻理解OSGi
1.《深刻理解OSGi:Equinox原理、應用與最佳實踐》[3]  
做者:周志明 & 謝小明,出版時間:2013-2-1.
內容簡介:本書共14章,分4個部分。第一部分(第1章):走近OSGi,主要介紹了什麼是OSGi以及爲何要使用OSGi。第二部分(第2~4章):OSGi規範與原理,對最新的OSGi R5.0中的核心規範進行了全面的解讀,首先講解了OSGi模塊的創建、描述、依賴關係的處理,而後講解了Bundle的啓動原理和調度管理,最後講解了與本地及遠程服務相關的內容。第三部分:OSGi服務與Equinox應用實踐(第5~11章),不只詳細講解了OSGi服務綱要規範和企業級規範中最經常使用的幾個子規範和服務的技術細節,還經過一個基於Equinox的BBS案例演示了Equinox的使用方法,最重要的是還經過源碼分析了Equinox關鍵功能的實現機制和原理。第四部分:最佳實踐(第12~14章),總結了大量關於OSGi的最佳實踐,包括從Bundle如何命名、模塊劃分、依賴關係處理到保持OSGi動態性、管理程序啓動順序、使用API基線管理模塊版本等各方面的實踐技巧,此外還介紹了Spring DM的原理以及如何在OSGi環節中進行程序測試。
2.《Eclipse RCP與Spring OSGi:技術詳解與最佳實踐》[4]  
Eclipse RCP與Spring OSGi Eclipse RCP與Spring OSGi
做者:陸陽,出版時間:2013-1-1.
內容簡介:全書共分3個部分:基礎篇(第1~5章)詳細介紹了與Eclipse RCP相關的一系列核心概念、Eclipse RCP開發環境的搭建,以及SWT、JFace、Forms、Nebula和WindowBuilder等Eclipse RCP開發所經常使用的界面編程技術;高級篇(第6~12章)系統講解了Eclipse RCP應用開發的基礎知識、Eclipse RCP軟件產品各個組成部分的構建方法,以及Eclipse RCP擴展的使用和擴展點的開發,掌握這些技術知識的讀者將能構建一個結構完整的Eclipse RCP軟件,並解決軟件開發過程當中遇到的故障;實戰篇(第13~15章)詳細講解了Eclipse RCP與Spring OSGi框架、Hibernate ORM框架、JPA規範、Maven工具的整合,以及它與Java的模塊化設計。
3.osgi中文社區 [5]  
簡介:由北京大學軟件工程國家工程研究中心「軟件協同研發支撐技術」組維護的一個模塊化動態化開發技術的公益社區。初學者、進階者和大牛均可以在這裏分享技術和經驗,自由的交流和學習,在貢獻和收穫中充實本身。爲更多的學生、研究者和從業者提供更廣闊的交流平臺。
 
 
參考資料
相關文章
相關標籤/搜索