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

來源:互聯網
上載者:User

標籤:

OSGI(面向Java的動態模型系統)
     OSGi(Open Service Gateway Initiative)技術是面向Java的動態模型系統。OSGi服務平台向Java提供服務,這些服務使Java成為軟體整合和軟體開發的首選環境。Java提供在多個平台支援產品的可移植性。OSGi技術提供允許應用程式使用精鍊、可重用和可協作的組件構建的標準化原語。這些組件能夠組裝進一個應用和部署中。中文名:開放服務網關協議外文名:Open Service Gateway Initiative應用對象Java動態模型系統類    別網關協議目錄

1背景

2安全性通訊協定

3架構結構

4標準服務

5架構服務

6系統服務

7Hello World

? 3 小結

8書籍

  1背景
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))提供了一個標準環境。整個架構可以劃分為一些層次:OSGIL0:運行環境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現這個介面,並在註冊服務層註冊該服務。服務的用戶端在註冊庫中找到它,或者當它出現或者消失時做出響應。這個同SOA架構使用Web服務進行發布的方式相似。兩者主要不同是Web服務總是需要傳輸層,這個使它比採用直接方法調用的OSGi服務慢幾千倍。同時,OSGi組件能夠對這些服務的出現和消失做出響應。更多的資訊可以從OSGi服務平台發行版本4手冊或者PDF下載中找到。需要注意的是每一種服務都是抽象定義的,與不同電腦服務商的實現相獨立。5架構服務
OSGi架構提供一個許可權管理服務,一個包管理服務和一個開始層級服務。這些服務是一個可OSGI選部分,指示架構的操作。架構服務如下:許可權管理(PermissionAdmin)目前或者將來的bundles的許可權通過這種服務進行維護。一旦設定了它們,許可權服務立即啟用。包管理(PackageAdmin)bundles同類和資源分享包。bundles的更新可能需要系統重新計算這些依賴。這個包管理服務提供關於系統的實際包分享狀態和能夠重新整理已經共用的包。也就是,取消依賴和重新計算依賴。啟動層級(StartLevel)啟動層級是一個bundles集合,它們應該同時運行或者應該在其它已經啟動以前被初始化。啟動層級服務設定當前的啟動層級,為每個bundle排一個啟動層級和審核當前的設定。URL處理者(URLHandler)Java環境為URL處理者支援一個提供者模型。然而,這是一個單件,不可能在一個象OSGi可能有很多提供者的協作環境上使用它。此服務規範使任何組件提供額外的URL處理者。6系統服務
系統服務提供水平功能,它在每個系統是必須的。Log Service,組態管理服務,裝置訪問OSGI服務,使用者管理服務,IO連接器服務和參數服務都是系統服務的一個方面。Log Service(LogService)日誌資訊,警告,調試或者錯誤資訊通過Log Service來處理的。它接受日誌實體並指派這些實體到訂閱了這個資訊的其他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下載EquinoxEquinox在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:2Bundle-SymbolicName:org.serc.helloworldBundle-Version:1.0Bundle-Activator:org.serc.helloworld.activator.ActivatorImport-Package:org.osgi.frameworkExport-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();elseSystem.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:2Bundle-SymbolicName:org.serc.helloworld.clientBundle-Version:1.0Bundle-Activator:org.serc.helloworld.client.HelloUserImport-Package:org.serc.helloworld;version="[1.0,2.0)",org.osgi.framework2.3 HelloWorld程式的流程可能光看代碼會比較不容易看清楚程式的執行流程,表示了這幾個類的各個功能的相互依賴關係,整個關係從Hello介面的定義開始;然後到Hello介面被實現,得到HelloImpl;再到Activator將HelloImpl註冊為架構中的一個服務,再到HelloUser通過與架構互動得到剛才註冊的服務,並且使用這個服務從而輸出字串;最後一個可選流程是當我們stop org.serc.helloworld這個bundle的時候,程式會將之前註冊的服務登出掉。2.4 程式的執行通過上面的工作,我們得到了兩個自己定義的bundle:org.serc.helloworldorg.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書籍
深入理解OSGi1.《深入理解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陸陽,出版時間: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] 簡介:由北京大學軟體工程國家工程研究中心“軟體協同研發支撐技術”組維護的一個模組化動態化開發技術的公益社區。初學者、進階者和大牛都可以在這裡分享技術和經驗,自由的交流和學習,在貢獻和收穫中充實自己。為更多的學生、研究者和從業者提供更廣闊的交流平台。  參考資料
  • 1.  動態模型系統 OSGi  .開源社區網 [引用日期2012-08-18] .

  • 2.  OSGi開發環境建立和Hello World  .osgi中文社區 [引用日期2013-05-28] .

  • 3.  周志明,謝小明 .《深入理解OSGi:Equinox原理、應用與最佳實務》 .北京 :機械工業出版社 ,2013 :I-II .

  • 4.  陸陽 .《Eclipse RCP與Spring OSGi:技術詳解與最佳實務》 .北京 :機械工業出版社 ,2013 :I-II .

  • 5.  軟體工程國家工程研究中心  .北大未名站 [引用日期2013-05-28] .

    • OSGi Service Platform, Release 3, IOS Press, ISBN 1-58603-311-5
    • 外部連結
      • OSGI中文社區 --促進Java模組化開發技術傳播
      • OSGi官方網站——可下載標準規範,提供各種資訊
      • FAQ
      • OSGi World Congress - 2004 congress in October in Barcelona
      • ProSyst Software GmbH - Leading OSGi Software Provider for Remote Management and Service Delivery
      • aQute: OSGi Info - Information about OSGi and access to seminars
      • Oscar: An OSGi framework implementation - Open Source OSGi framework implementation under BSD license
      • Oscar Bundle Repository (OBR) - A community-oriented bundle repository and incubator for OSGi bundle developers
      • Knopflerfish OSGi Open Source OSGi implementation under BSD license
      • Oxygen Project
      • ServiceBinder - Automated Service Dependency Management for the OSGi services platform
      • Dependency Manager - Automatically managing service dependencies in OSGi
      • Makewave - Leading OSGi Technology Provider, maintains the open source OSGi implementation Knopflerfish

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.