510 likes | 780 Views
什麼是 OSGI ?. 1. Open Service Gateway Initiative. OSGI 發展歷史. OSGi 在 1999 年時由 IBM,Sun,Ericsson 提 出,現在由 Intel 、 IBM 、 NEC 、 Mitsubishi 、 Motorola 、 Nokia 、 Oracle 、 Samsung 、 Siemens AG 、 BenQ 等大廠繼續制訂和推動 OSGi 的提出和誕生之初,其目的主要是能夠靈活方便並遠程管理互聯的網絡嵌入設備。. 2. OSGI 雙重涵義.
E N D
什麼是OSGI? 1 Open Service Gateway Initiative
OSGI發展歷史 • OSGi在1999年時由IBM,Sun,Ericsson提出,現在由Intel、IBM、NEC、Mitsubishi、Motorola、Nokia、Oracle、Samsung、Siemens AG、BenQ等大廠繼續制訂和推動 • OSGi的提出和誕生之初,其目的主要是能夠靈活方便並遠程管理互聯的網絡嵌入設備。 2
OSGI雙重涵義 • 就字面翻, Open Service Gateway Initiative,是開放服務閘道協會,也就是OSGi Alliance組職。 • 更進一步意思,是指OSGi組織根據JAVA語言,所制定的服務(業務)規範 - OSGi Service Platform也就是OSGi的服務平台。 • 這個平台特色有模組化、動態化,屬於開放性平台 3
模組化JAVA的開放服務平台 • OSGi 服務平台是一個開放並且提供統一接口標準的體系框架,基於這個體系框架,服務提供商,程序開發人員,軟件提供商,服務網管運營商,設備提供商能夠協調地聯合起來開發,部署以及管理向用戶提供的各種服務。 • 主流的java應用服務器,使用OSGi,例:Oracle的Weblogic、IBM的Websphere及Sun的Glassfish等。 4
模組化MODULARITY的優勢 • 分工(Division of Labour) • 抽象化(Abstraction) • 重複使用(Reuse) • 容易維修(Ease of Maintenance and Repair) JAVA v.s. OSGi A powerfulmodule system to be built on top. 5
分工(DIVISION OF LABOUR) • 可將個人或是群體以模組(module)為單位區分。工作時,屬於此模組的可以單獨思考其模組內的運作,而不需考慮其他的模組。 • 例如:設計汽車模型的,可以不考慮輪胎是怎麼設計的。模組化的分工下,設計汽車模型的可以專於他的汽車設計。 • 將模組間的合作交給架構本身。 6
抽象化(ABSTRACTION) • 將模組抽象化,不須了解整體的細節。 • 例如:我們假設飛機為一個模組,飛機在高度離地747公尺時,起飛推力改為爬升推力,起飛成功。但我們並不清楚引擎馬力多少、需多少燃料等細節。 • 抽象化後,我們可以很清楚的得到我們需要的資訊,而非所有的細節。使得理解變得更清楚。 7
重複使用(REUSE) • 模組可被重複使用,輕易的被遷入新的環境 • 例如:汽車輪胎設計好,當有新的汽車設計,就有的輪胎設計可輕易的被使用在新的汽車上。 • 重複使用使得原有模組,不必因為新的環境而淘汰;新的開發者可很容易的使用舊有的模組來協助工作。 8
容易維修(EASE OF MAINTENANCE AND REPAIR) • 可以輕易的卸下模組,而不影響其他的模組。再將維修好的模組放上,而不影響其他模組的行為。 • 例如:將輪胎拿下來修補,或者加裝雪鏈,而不影響汽車正常的運行。 9
甚麼是模組(MODULE)? • Self-Contained完整的邏輯單位 • Highly Cohesive功能緊密 • Loosely Coupled可變更性 10
SELF-CONTAINED • 完整的邏輯單位 • 可單獨移動、安裝、移除的單位 • 模組具有完整的功能,可單獨被移除而不影響其他 11
HIGHLY COHESIVE • 功能緊密 • 模組內的功能彼此必切相關,不可輕易切割 • 不相關的、無緊密關係的不可放在同一模組內 12
LOOSELY COUPLED • 可變更性 • 當模組與其他模組互動,其他模組可以被替換。模組與模組間 不具有配對關係。 • 同一個服務介面,可以有很多不同的實作,當模組更換其他的實作方法,仍可正常運作。 13
OSGI模組化 - BUNDLE • Bundle是一個特別的Jar • 特別的檔案夾META-INF裡面放主要的MANIFEST.MF描述這個JAR • 應用程式可能由很多的JAR組成,裏頭在包JAR • OSGI提供更好管理JAR的方式 JARs :archive files based on the ZIP file format • Java class files • Resource:images and documents • the META-INF folder MANIFEST.MF 14
特別的JAR- BUNDLE Classes Bundle Bundles Jars MANIFEST.MF 15
將程式封裝成可執行JAR • 單一程式封裝 • manifest.mf 如下:Main-Class: XXX<空白行> • 指令:jar cfm XXXX.jar manifest.mf XXX.class • 資料夾封裝 • 指令:jar cf XXXX.jar . • 解壓縮XXXXjar,在manifest.mf後面加上:Main-Class: XXX<空白行> • 指令: jar cfm XXXX.jar manifest.mf 16
類別載入機制JAVA CLASS LOADING • 類別路徑(Class path)的縮寫是類別搜尋路徑(Class search path) • 下java指令,呼叫java launcher, launcher會負責啟動JVM(Java Virtual Machine),執行應用程式時,當JVM要使用到新的類別時,他會依照以下順序載入: • Bootstrap classes:jre/lib/rt.jar中的類別檔 • Extension classes:jre/lib/ext目錄下所有的jar檔- 使用到java延伸機制(Extension Mechanism)的類別 • User classes:特別的是:只有此類別要有明確路徑- 沒有使用java 延伸機制 17
類別載入機制的階層HIERARCHY 18 圖片來源:http://www.osgi.org/Specifications/HomePage
類別載入機制JAVA CLASS LOADING • 使用者類別(User classes)如何明確告訴JVM位置? • 指令java後加上參數 -classpath 或 -cp • 新增系統環境變數 CLASSPATH • JVM會請該類別位置的類別載入器(Class loader)負責載入,不同位置有不同的class loader。例如:開發應用的位置有AppClassLoader,延伸機制放在ext下的jar有ExtClassLoader • Java延伸機制:將jar部署到jre/lib/ext下面,就不需要告知明確路徑而被JVM搜尋到並載入 19
JAVA延伸機制 20
OSGI 元件模型 BundleContext Bundle 模組化及動態服務功能… Bundle容器 21
JAVA的限制 • JAVA在封裝(packaging)、部署(deploying)和驗證(validating)上,都有其限制。因此有Jboss、Netbean等專案的產生,提供特別的類別載入器(specialized class loader)來達到模組化的封裝、部署和驗證。 • OSGi框架提供了一般、標準的規範,達到模組化的JAVA系統 22
JAVA的版本問題 • 當有新舊的JAVA版本時,我們會發現有版本衝突問題。有些符合新的版本,而有些卻只能在舊的版本上正常運作。當使用到不適合的JAVA版本就會產生錯誤。如何避免? • OSGi的模組化解決了JAVA的版本問題:使用清單(Manifest)規範執行環境(Execution Environment) • OSGi Minimum—Absolute minimum, suitable for API design • Foundation—Fairly complete EE, good for most applications; Used for Eclipse• • JAR files available from OSGi website• 23
BUNDLE-模組化的單位 • OSGi框架下的bundle是模組化的單位 • Bundle除了java.*之外,其他的JRE提供的封包,都必須手動import進來,為什麼? • 因為OSGi使用bundles替換這些JRE的實作,這些被替換的實作bundle會提供封包的版本資訊,解決Java的版本問題 • 開發者只需要import封包,而不用知道所需版本,OSGi架構會自動設定組態 24
最小化相依性(MINIMIZE DEPENDENCIES) • 設想情境:當你使用一個bundle,你把她安裝到OSGi框架時,卻發現這個bundle與其他bundles有依賴關係(相依性 dependencies)。安裝了其相依bundles後,又發現這其中bundle,又需其他bundles… …(沒完沒了) • 使用 Import-Package取代Require-Bundle,import擁有多個提供者,require只有一個提供者 • 可以控制import的版本範圍 25
隱藏實作細節HIDE IMPLEMENTATION DETAILS • 設想情境:當你寫一個API提供顧客使用,你必須將你的實作都使用public方式公開。有一天,公司想要更新一個新的版本,你提供了新的實作。這時,顧客打來罵人,說新的實作使顧客的程式碼當掉。公司回應:請不要使用我們的實作,只要使用API就好… … • 不如,隱藏實作,公開API就好 • OSGi把bundle的實作和介面分開。使用者用介面,OSGi框架會替使用者找到最適合的實作 26
動態載入(DYNAMIC LOADING) • 取代了JAVA的麻煩的擴充機制,不需要將檔案放到特殊位置,只要將所需的擴充套件直接安裝到OSGi的架構上 • 傳統的JAVA使用Class.forName動態載入,OSGi只要在清單標頭加入DynamicImport-Package:所要使用的套件 27
動態化JAVA的開放服務平台 • 即插即用 • 熱部屬 • 即刪即無 OSGI = 模組化、動態化JAVA • OSGi 技術是Java的動態模組化系统 • OSGi使得軟體的重複使用性變得可能,系統可以很容易加入新的更新軟體,使軟體的維護更新變得容易 28
OSGI成功案例 - ECLIPSE • Equinox開發小組由IBM的Jeff所帶領的。Equinox是Eclipse中以實做OSGi R4 RI 標準而知名。 • Eclipse 3.1以後的版本,plugins裡內建Equinox • 最新版本:(helios) • 其他有名的插件體系架構:ant、maven 29
前進OSGI • OSGI帶來的是設計思想以及開發方式的改變,這也就一定程度上要求系统設計師以及程序開發人员要接受一種新的開發方式,簡單說就是要讓你以jsp+javabean的方式轉為採用MVC框架的方式 • Java Swing是一個標準的MVC結構. ComponentUI代表View, 負責描畫元件. 元件尤其Model層, 比如JTextField的Document, JTable的TableModel, JTree的TreeModel等等. 而Control可能不是很明顯, 我們或許可以簡單的將其Event機制看作一個Swing團隊開發給開發者的Controller. • 作為Java開發者, 如果想理解MVC的結構, 學習Swing的確是個不錯的選擇. 30
MVC框架 • 筋骨皮模式(Model模型-View檢視-Controller控制器)是軟體工程中的一種軟體架構模式 • 筋(控制器Controller)- 負責轉發請求,對請求進行處理。 • 表皮(檢視View) - 介面設計人員進行圖形介面設計。 • 骨架(模型Model) - 程式設計師編寫程式應有的功能(實作演算法等等)、資料庫專家進行資料管理和資料庫設計(可以實作具體的功能)。 31
決戰客廳! • 家用閘道器(Residential Gateway,RG)連接內外網路 RG 設備、網路環境 供應商-> 應用程式 加值性服務 32
OSGI的目標 • OSGi的提出和誕生之初,其目的主要是能夠靈活方便並遠程管理互聯的網絡嵌入設備。 • 使用Java語言達到動態(dynamic)載入程式碼,在記憶體小的設備中,更容易動態部屬(deployment)。 • 連續性的程式寫作模式、非成對(decoupling)的服務標準:相同介面有不同的實作、針對介面使用服務 • 模組化的設計,使得OSGi框架更適用於各種不同的設備。例:儲存資料在有硬碟的設備和無硬碟設備,可以有相同的介面,不同的實作 • 生命週期管理(life cycle management),使開發者可將應用程式分成許多小的自我安裝元件(bundles)。容易地安裝、卸載並與其他元件互動(透過service)。 33
OSGI框架重點 • OSGi框架用來產生可擴充性的服務(extensible service),開發者利用bundle來包裝servive,應用程式則用許多的bundle所組成。目標設備會下載bundle,服務(service)的設計必須有全面的系統功能。 • 三個設計重點: • Services -由Java classes組成,常將介面與實作分開寫作。 • Bundles -功能獨立,部屬的單位,用來運送服務(shipping) • Bundle contexts-決定bundles在OSGi框架內的執行環境 34
OSGI框架分層OSGI LAYER Bundle Service Security Life cycle Module Execution environment JVM Hardware/OS 35
OSGI框架互動關係LAYER BETWEEN LAYER 36 圖片來源:http://www.osgi.org/Specifications/HomePage
OSGI三元件 • Framework • Bundle • Service Export || Import Service Bundle Bundle Bundle Framework Java VM 37
服務包BUNDLE(JAR) • 查詢機制LDAP Import Bundle Bundle Export Service 38
OSGI框架中的BUNDLE • Bundle是完整的功能元件,可在OSGi框架上安裝並被啟動。Bundle必須被解析(resolved),功能完整才能被啟用(started)。 • OSGi框架會為每一個安裝(installed)好的bundle,建立:Bundle物件(用於與使用者互動的介面) • OSGi框架啟動(activate)bundle後,產生:BundleContext物件(執行環境,如同OSGi框架的代理人) • 當bundle開始正常運作(active state),其他bundle可以使用其bundle的服務 39
服務包生命週期BUNDLE LIFE CYCLE 安裝 installed 解析 卸載 更新 卸載 uninstalled resolved 啟動 starting stopping 停止 40 可見轉變 active 自動轉變
服務包生命週期BUNDLE LIFE CYCLE • Bundle必須被卸載,才會完全離開OSGi框架,否則OSGi框架一直記錄此bundle。 41
安裝BUNDLE • BundleContext介面中有一個installBundle的方法 public Bundle installBundle(java.lang.String location, java.io.InputStream in) throws BundleException • 以location(例:URL)為準來註冊,相同的bundle如果location不同,可以再重複註冊 42
解析BUNDLE • Classpath dependencies:bundle使用libraries的Jar檔必須包含在resources • Native code dependencies: bundle使用native code libraries的Jar檔必須包含在resources • Package dependencies:bundle所包含其他bundle的classes,必須輸出到OSGi框架上the Framework. 43
語法結構 44
CLASSPATH DEPENDENCIES • Bundle-ClassPath: path ( , path )* • path: string <"/"-separated path name identifying a JAR file> 例: Bundle-ClassPath: com/sun/jes/impl/http/servlet.jar 45
NATIVE CODE DEPENDENCIES • Bundle-NativeCode: nativecode-clause ( ,nativecode-clause )* • nativecode-clause: nativepaths ( ; env-parameter )* • nativepaths: nativepath ( ; nativepath )* • env-parameter: ( processordef | osnamedef | osversiondef | languagedef ) • processordef: processor=token • osnamedef: osname=token • osversiondef: osversion=token • languagedef: language=token 例: Bundle-NativeCode: http.DLL;osname=Win95;processor=x86, http.so; osname=Solaris;processor=sparc 46
PACKAGE DEPENDENCIES • Export-Package: package-description (, package-description)* • package-description: package-name ( ; parameter )* • package-name: string <fully qualified Java package name> • parameter: token=string 例: Export-Package: javax.servlet; specification-version="2.0", javax.servlet.http; specification-version="2.0", org.osgi.service.http 47
PACKAGE DEPENDENCIES • Import-Package: package-description (, package-description)* • package-description: package-name ( ; parameter )* • package-name: string <fully qualified Java package name> • parameter: token=string • Export-Service: class-name (, class-name )* • Import-Service: class-name (, class-name )* 例: Import-Package: javax.servlet ;specification-version="2.0“ 48
SUMMARY 49
參考資料 • http://eclipse.org/ • http://www.osgi.org/About/FAQ?section=1#q19 • http://caterpillar.onlyfun.net/Gossip/JavaGossip-V2/ExecutableJAR.htm • http://xiaomaohaha.spaces.live.com/blog/ • http://zh.wikipedia.org/zh-tw/MVC • http://www.javatwofriday.com.tw/member/javamag_article/J030700001.pdf • http://webcenter.hit.edu.cn/articles/2009/06-08/06065603.htm 50