51
什什什 OSGI Open Service Gateway Initiative 1

什麼是 OSGI ?

  • Upload
    nerys

  • View
    136

  • Download
    0

Embed Size (px)

DESCRIPTION

什麼是 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 雙重涵義. - PowerPoint PPT Presentation

Citation preview

Page 1: 什麼是 OSGI ?

什麼是OSGI?Open Service Gateway Initiative

1

Page 2: 什麼是 OSGI ?

OSGI發展歷史

OSGi在 1999年時由 IBM,Sun,Ericsson提出,現在由Intel、 IBM、 NEC、Mitsubishi、Motorola、Nokia、 Oracle、 Samsung、 Siemens AG、 BenQ等大廠繼續制訂和推動

OSGi的提出和誕生之初,其目的主要是能夠靈活方便並遠程管理互聯的網絡嵌入設備。

2

Page 3: 什麼是 OSGI ?

OSGI雙重涵義

就字面翻, Open Service Gateway Initiative,是開放服務閘道協會,也就是 OSGi Alliance組職。

更進一步意思,是指 OSGi組織根據 JAVA語言,所制定的服務 (業務 ) 規範 - OSGi Service Platform也就是 OSGi的服務平台。

這個平台特色有模組化、動態化,屬於開放性平台

3

Page 4: 什麼是 OSGI ?

模組化 JAVA的開放服務平台

OSGi 服務平台是一個開放並且提供統一接口標準的體系框架,基於這個體系框架,服務提供商,程序開發人員,軟件提供商,服務網管運營商,設備提供商能夠協調地聯合起來開發,部署以及管理向用戶提供的各種服務。

主流的 java應用服務器,使用 OSGi,例: Oracle的Weblogic、 IBM的Websphere 及 Sun的 Glassfish等。

4

Page 5: 什麼是 OSGI ?

模組化MODULARITY的優勢分工 (Division of Labour)抽象化 (Abstraction)重複使用 (Reuse)容易維修 (Ease of Maintenance and Repair)

JAVA v.s. OSGiA powerful module system to be built on top. 5

Page 6: 什麼是 OSGI ?

分工 (DIVISION OF LABOUR)

可將個人或是群體以模組 (module)為單位區分。工作時,屬於此模組的可以單獨思考其模組內的運作,而不需考慮其他的模組。

例如:設計汽車模型的,可以不考慮輪胎是怎麼設計的。模組化的分工下,設計汽車模型的可以專於他的汽車設計。

將模組間的合作交給架構本身。

6

Page 7: 什麼是 OSGI ?

抽象化 (ABSTRACTION)

將模組抽象化,不須了解整體的細節。例如:我們假設飛機為一個模組,飛機在高度離地

747公尺時,起飛推力改為爬升推力,起飛成功。但我們並不清楚引擎馬力多少、需多少燃料等細節。

抽象化後,我們可以很清楚的得到我們需要的資訊,而非所有的細節。使得理解變得更清楚。

7

Page 8: 什麼是 OSGI ?

重複使用 (REUSE)

模組可被重複使用,輕易的被遷入新的環境例如:汽車輪胎設計好,當有新的汽車設計,就有的輪胎設計可輕易的被使用在新的汽車上。

重複使用使得原有模組,不必因為新的環境而淘汰;新的開發者可很容易的使用舊有的模組來協助工作。

8

Page 9: 什麼是 OSGI ?

容易維修(EASE OF MAINTENANCE AND REPAIR)

可以輕易的卸下模組,而不影響其他的模組。再將維修好的模組放上,而不影響其他模組的行為。

例如:將輪胎拿下來修補,或者加裝雪鏈,而不影響汽車正常的運行。

9

Page 10: 什麼是 OSGI ?

甚麼是模組 (MODULE)?

Self-Contained完整的邏輯單位Highly Cohesive功能緊密Loosely Coupled可變更性

10

Page 11: 什麼是 OSGI ?

SELF-CONTAINED

完整的邏輯單位可單獨移動、安裝、移除的單位模組具有完整的功能,可單獨被移除而不影響其他

11

Page 12: 什麼是 OSGI ?

HIGHLY COHESIVE

功能緊密模組內的功能彼此必切相關,不可輕易切割不相關的、無緊密關係的不可放在同一模組內

12

Page 13: 什麼是 OSGI ?

LOOSELY COUPLED

可變更性當模組與其他模組互動,其他模組可以被替換。模組

與模組間 不具有配對關係。同一個服務介面,可以有很多不同的實作,當模組更換其他的實作方法,仍可正常運作。

13

Page 14: 什麼是 OSGI ?

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

Page 15: 什麼是 OSGI ?

特別的 JAR- BUNDLE

15

Bundle

Bundles

Jars

Classes

MANIFEST.MF

Page 16: 什麼是 OSGI ?

將程式封裝成可執行 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

Page 17: 什麼是 OSGI ?

類別載入機制 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

Page 18: 什麼是 OSGI ?

類別載入機制的階層 HIERARCHY

18圖片來源:http://www.osgi.org/Specifications/HomePage

Page 19: 什麼是 OSGI ?

類別載入機制 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

Page 20: 什麼是 OSGI ?

JAVA延伸機制

20

Page 21: 什麼是 OSGI ?

OSGI 元件模型

…模組化及動態服務功能Bundle

Bundle容器

BundleContext

21

Page 22: 什麼是 OSGI ?

JAVA的限制

JAVA在封裝 (packaging)、部署 (deploying)和驗證 (validating)上,都有其限制。因此有Jboss、 Netbean等專案的產生,提供特別的類別載入器 (specialized class loader)來達到模組化的封裝、部署和驗證。

OSGi框架提供了一般、標準的規範,達到模組化的JAVA系統

22

Page 23: 什麼是 OSGI ?

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

Page 24: 什麼是 OSGI ?

BUNDLE-模組化的單位

OSGi框架下的 bundle是模組化的單位Bundle除了 java.*之外,其他的 JRE提供的封包,都必須手動 import進來,為什麼?因為 OSGi使用 bundles替換這些 JRE的實作,這些被替換的實作 bundle會提供封包的版本資訊,解決 Java的版本問題

開發者只需要 import封包,而不用知道所需版本, OSGi架構會自動設定組態

24

Page 25: 什麼是 OSGI ?

最小化相依性 (MINIMIZE DEPENDENCIES)

設想情境:當你使用一個 bundle,你把她安裝到OSGi框架時,卻發現這個 bundle與其他 bundles有依賴關係 ( 相依性 dependencies)。安裝了其相依 bundles後,又發現這其中 bundle,又需其他 bundles… …(沒完沒了 )

使用 Import-Package取代 Require-Bundle, import擁有多個提供者, require只有一個提供者

可以控制 import的版本範圍

25

Page 26: 什麼是 OSGI ?

隱藏實作細節HIDE IMPLEMENTATION DETAILS

設想情境:當你寫一個 API提供顧客使用,你必須將你的實作都使用 public方式公開。有一天,公司想要更新一個新的版本,你提供了新的實作。這時,顧客打來罵人,說新的實作使顧客的程式碼當掉。公司回應:請不要使用我們的實作,只要使用 API就

… …好不如,隱藏實作,公開 API就好OSGi把 bundle的實作和介面分開。使用者用介面, OSGi框架會替使用者找到最適合的實作

26

Page 27: 什麼是 OSGI ?

動態載入 (DYNAMIC LOADING)

取代了 JAVA的麻煩的擴充機制,不需要將檔案放到特殊位置,只要將所需的擴充套件直接安裝到 OSGi的架構上

傳統的 JAVA使用 Class.forName動態載入, OSGi只要在清單標頭加入 DynamicImport-Package:所要使用的套件

27

Page 28: 什麼是 OSGI ?

動態化 JAVA的開放服務平台

即插即用熱部屬即刪即無

OSGI = 模組化、動態化 JAVA

OSGi 技術是 Java的動態模組化系统OSGi使得軟體的重複使用性變得可能,系統可以很容易加入新的更新軟體,使軟體的維護更新變得容易

28

Page 29: 什麼是 OSGI ?

OSGI 成功案例 - ECLIPSE

Equinox開發小組由 IBM的 Jeff所帶領的。 Equinox是 Eclipse中以實做 OSGi R4 RI 標準而知名。

Eclipse 3.1以後的版本, plugins裡內建 Equinox

最新版本: (helios)

其他有名的插件體系架構: ant、maven

29

Page 30: 什麼是 OSGI ?

前進 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

Page 31: 什麼是 OSGI ?

MVC框架

筋骨皮模式(Model模型 -View檢視 -Controller控制器)是軟體工程中的一種軟體架構模式

筋(控制器 Controller) - 負責轉發請求,對請求進行處理。

表皮(檢視 View ) - 介面設計人員進行圖形介面設計。

骨架(模型Model ) - 程式設計師編寫程式應有的功能(實作演算法等等)、資料庫專家進行資料管理和資料庫設計 (可以實作具體的功能 )。

31

Page 32: 什麼是 OSGI ?

決戰客廳!

家用閘道器 (Residential Gateway, RG)連接內外網路

RG

設備、網路環境 供應商 -> 應用程式 加值性服務

32

Page 33: 什麼是 OSGI ?

OSGI的目標

OSGi的提出和誕生之初,其目的主要是能夠靈活方便並遠程管理互聯的網絡嵌入設備。

使用 Java語言達到動態 (dynamic)載入程式碼,在記憶體小的設備中,更容易動態部屬(deployment)。

連續性的程式寫作模式、非成對 (decoupling)的服務標準:相同介面有不同的實作、針對介面使用服務

模組化的設計,使得 OSGi框架更適用於各種不同的設備。例:儲存資料在有硬碟的設備和無硬碟設備,可以有相同的介面,不同的實作

生命週期管理 (life cycle management),使開發者可將應用程式分成許多小的自我安裝元件(bundles)。容易地安裝、卸載並與其他元件互動(透過 service)。

33

Page 34: 什麼是 OSGI ?

OSGI框架重點

OSGi框架用來產生可擴充性的服務 (extensible service),開發者利用 bundle來包裝 servive,應用程式則用許多的 bundle所組成。目標設備會下載 bundle,服務 (service)的設計必須有全面的系統功能。

三個設計重點:Services

-由 Java classes組成,常將介面與實作分開寫作。 Bundles

-功能獨立,部屬的單位,用來運送服務 (shipping) Bundle contexts

-決定 bundles在 OSGi框架內的執行環境 34

Page 35: 什麼是 OSGI ?

OSGI框架分層 OSGI LAYER

Secu

rity

Bundle

Life cycle

Module

Execution environment JVM

Hardware/OS

Service

35

Page 36: 什麼是 OSGI ?

OSGI框架互動關係 LAYER BETWEEN LAYER

36

圖片來源:http://www.osgi.org/Specifications/HomePage

Page 37: 什麼是 OSGI ?

OSGI三元件

FrameworkBundleService

Java VM

Framework

Bundle

Service

Export || Import

Bundle

Bundle

37

Page 38: 什麼是 OSGI ?

服務包 BUNDLE(JAR)

查詢機制 LDAP

Bundle Bundle

Import

Export

Service38

Page 39: 什麼是 OSGI ?

OSGI框架中的 BUNDLE

Bundle是完整的功能元件,可在 OSGi框架上安裝並被啟動。 Bundle必須被解析 (resolved),功能完整才能被啟用 (started)。

OSGi框架會為每一個安裝 (installed)好的bundle,建立: Bundle物件 (用於與使用者互動的介面 )

OSGi框架啟動 (activate)bundle後,產生:BundleContext物件 (執行環境,如同 OSGi框架的代理人 )

當 bundle開始正常運作 (active state),其他bundle可以使用其 bundle的服務

39

Page 40: 什麼是 OSGI ?

服務包生命週期 BUNDLE LIFE CYCLE

installed

安裝

active

stoppingstarting

resolveduninstalled

卸載 解析

卸載

啟動

停止

更新

自動轉變

可見轉變 40

Page 41: 什麼是 OSGI ?

服務包生命週期 BUNDLE LIFE CYCLE

Bundle必須被卸載,才會完全離開 OSGi框架,否則 OSGi框架一直記錄此 bundle。

狀態 description

INSTALLED bundle成功安裝後進入的狀態

RESOLVED 所有 Java classes或 native code 可使用所進入的狀態。

STARTING 被啟用狀態

STOPPING 被停止狀態

ACTIVE 啟用後成功執行的狀態

UNINSTALLED 卸載狀態

41

Page 42: 什麼是 OSGI ?

安裝 BUNDLE

BundleContext介面中有一個 installBundle的方 法 public Bundle

installBundle(java.lang.String location, java.io.InputStream in) throws BundleException

以 location(例: URL)為準來註冊,相同的bundle如果 location不同,可以再重複註冊

42

Page 43: 什麼是 OSGI ?

解析 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

Page 44: 什麼是 OSGI ?

語法結構符號 代表意思

*

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

Page 45: 什麼是 OSGI ?

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

Page 46: 什麼是 OSGI ?

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

Page 47: 什麼是 OSGI ?

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

Page 48: 什麼是 OSGI ?

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

Page 49: 什麼是 OSGI ?

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

Page 50: 什麼是 OSGI ?

參考資料

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

Page 51: 什麼是 OSGI ?

參考資料

電子書: OSGi in practicehttp://njbartlett.name/files/osgibook_preview_20091217.pdf

電子書: OSGi原理與最佳實踐http://www.infoq.com/cn/minibooks/osgi-best-practice

51