Download - 什麼是 OSGI ?
什麼是OSGI?Open Service Gateway Initiative
1
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. OSGiA powerful module 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
JARsJava class files Resource: images and documentsthe META-INF folder MANIFEST.MF
: archive files based on the ZIP file format
Bundle是一個特別的 Jar特別的檔案夾META-INF裡面放主要的
MANIFEST.MF描述這個 JAR應用程式可能由很多的 JAR組成,裏頭在包 JAROSGI提供更好管理 JAR的方式
14
特別的 JAR- BUNDLE
15
Bundle
Bundles
Jars
Classes
MANIFEST.MF
將程式封裝成可執行 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 元件模型
…模組化及動態服務功能Bundle
Bundle容器
BundleContext
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 designFoundation—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
Secu
rity
Bundle
Life cycle
Module
Execution environment JVM
Hardware/OS
Service
35
OSGI框架互動關係 LAYER BETWEEN LAYER
36
圖片來源:http://www.osgi.org/Specifications/HomePage
OSGI三元件
FrameworkBundleService
Java VM
Framework
Bundle
Service
Export || Import
Bundle
Bundle
37
服務包 BUNDLE(JAR)
查詢機制 LDAP
Bundle Bundle
Import
Export
Service38
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
安裝
active
stoppingstarting
resolveduninstalled
卸載 解析
卸載
啟動
停止
更新
自動轉變
可見轉變 40
服務包生命週期 BUNDLE LIFE CYCLE
Bundle必須被卸載,才會完全離開 OSGi框架,否則 OSGi框架一直記錄此 bundle。
狀態 description
INSTALLED bundle成功安裝後進入的狀態
RESOLVED 所有 Java classes或 native code 可使用所進入的狀態。
STARTING 被啟用狀態
STOPPING 被停止狀態
ACTIVE 啟用後成功執行的狀態
UNINSTALLED 卸載狀態
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
語法結構符號 代表意思
*
Repetition of the previous element zero or more times, e.g. ( ’,’ element ) *
+ Repetition one or more times
? Previous element is optional
( ... ) Grouping ’...’ Literal | Or [...] Set (one of) .. list, e.g. 1..5 is the list 1 2 3 4
5 <...> Externally defined token 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=tokenosversiondef: osversion=tokenlanguagedef: 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.http47
PACKAGE DEPENDENCIES
Import-Package: package-description (, package-description)*
package-description: package-name ( ; parameter )*package-name: string <fully qualified Java package
name>parameter: token=stringExport-Service: class-name (, class-name )*Import-Service: class-name (, class-name )*例:Import-Package: javax.servlet ;specification-
version="2.0“ 48
SUMMARYBundle Stage Methods that Programmer
May Define to Perform Bundle-Specific Tasks
Manifest Headers that Provide Bundle-Specific Data
Using bundle's own resources Bundle-ClassPath Bundle-NativeCode
Using resources from other bundles Import-Package
Providing resources to other bundles Export-Package
Using/providing services (advisory) Import-Service Export-Service
STARTING BundleActivator.start Bundle-Activator
INSTALLED, RESOLVED, STARTING, ACTIVE, STOPPING, UNINSTALLED
Bundle-Name Bundle-Description Bundle-Version Bundle-Vendor Bundle-DocURL Bundle-ContactAddress
Bundle update Bundle-UpdateLocation
STOPPING BundleActivator.stop Bundle-Activator
49
參考資料
http://eclipse.org/http://www.osgi.org/About/FAQ?
section=1#q19http://caterpillar.onlyfun.net/Gossip/
JavaGossip-V2/ExecutableJAR.htmhttp://xiaomaohaha.spaces.live.com/blog/http://zh.wikipedia.org/zh-tw/MVChttp://www.javatwofriday.com.tw/member/
javamag_article/J030700001.pdfhttp://webcenter.hit.edu.cn/articles/2009/06-
08/06065603.htm 50
參考資料
電子書: OSGi in practicehttp://njbartlett.name/files/osgibook_preview_20091217.pdf
電子書: OSGi原理與最佳實踐http://www.infoq.com/cn/minibooks/osgi-best-practice
51