OSGi: 服務導向的Java模組系統 廖峻鋒 (try) cfliao@ieee.org 台大資工所 智慧型機器人及自動化實驗室
大綱 OSGi : Yet another framework ? 發展沿革 元件模型與運作方式 相關開源專案 結語: OSGi的未來發展
Java –cp crack.jar;mylib-v3.jar;mylib-v2.jar;mylib-v1.jar org.coscup.s1 org.coscup.s1 org.coscup.s1 A A B B B C C C C D D E
Java類別版本混合問題 存取權限管理限於package level的問題 對類別使用者來說 對類別提供者來說 Classloader只會載入在classpath中第一個遇到的類別 造成同時載入各版本類別 設定classpath的順序影響了那一個類別會被載入 對類別使用者來說 不同版本無法併存,使用者也無法指定要使用那一個版本的類別 對類別提供者來說 類別一但宣告為public,所有clients都可以存取,無法做個別的控制
com.evil-empire.client Java類別使用權限問題 org.coscup.s1 com.evil-empire.client MySecretA ClientX ClientY org.coscup.s2 如何才能達成更精細的存取設定? ClientZ
Java模組概念 單獨設定各Packages的對外權限 org.coscup.s1 com.evil-empire.client MyScretA ClientX ClientY MyPublicB org.coscup.s2 設定: 只有 MyPublicB可以讓外面存取 ClientZ
Java模組概念: 不同模組可以用不同版本的類別庫 org.coscup.s1 A B C 設定: 只載入第1版 org.coscup.s1 B C D 設定: 只載入第5版 E org.coscup.s1: 3個版本
如何動態提供服務 視訊電話應用程式 視訊服務 電話服務
服務導向軟體架構 視訊電話應用程式 服務目錄 服務目錄管理員 電話服務 機動性:高,體積:小,位置:客廳 Hi,請給我一個電話服務和視訊服務,電話服務最好是機動性高的,視訊服務最好是在廚房… 電話服務 機動性:無,體積:大,位置:書房 電話服務 機動性:無,體積:中,位置:客廳 最符合您的要求的只有這些,你要不要? 視訊服務 面板:大,位置:客廳 視訊服務 面板:小,位置:客廳 服務目錄 服務目錄管理員
OSGi 平台 由Intel、IBM、NEC、Mitsubishi、Motorola、NTT、Nokia、Oracle、Samsung、Siemens AG、BenQ等數十家廠商聯合制定並推動。 OSGi是一個直接建構在JVM上的通用的中介軟體(Universal Middleware)規格。
OSGi沿革 創始於1999年,初期以支援嵌入式裝置為主的家庭閘道器中介軟體為目標 2003 : 新版本設計時加入支援Java手機功能 2004 : 開始有大量的開放源碼社群投入,Eclipse 3.x核心改用OSGi 2006 大量的Java端企業應用程式伺服器改用OSGi為核心
OSGi元件模型 OSGi中的軟體元件稱為Bundle 從實體觀點來看Bundle只是一個 Java-based的jar檔案
Bundle的結構 目錄結構 (標準的jar型式) 在MANIFEST.MF中 / / META-INF/MANIFEST.MF / (java classes) / (.jar) (如果要執行邏輯,必須包含一個org.osgi.framework.BundleActivator的實作類別) 在MANIFEST.MF中 package 的import / export設定 Bundle及版本資訊
一個Bundle就是一個Java Module 在MANIFEST.MF中設定模組間相依性 除了明確export的套件之外,外界一律無法存取 可以指定相依bundle 可以透過import設定,指定所要引入的類別版本 Require-Bundle: my-telephony-service Import-Package: org.coscup.telephony; version=“(1.0.0,1.0.5]”; location=“Kitchen”;
Bundle類別載入採用次序 系統Classpath Required Bundle Imported Bundle Local classpath
Bundles具有生命周期 可以在OSGi伺服器執行期間動態地被安裝、移除、更新及重新啟動 元件容器在啟動Bundle時會先檢查相依性,不能滿足相依性的Bundles無法啟動
Bundles可以提供服務 Bundles中可將提供服務或呼叫其它服務的POJO註冊到ServiceRegistry中 可以發佈(publish)、發現(discovery)及繫結(bind)到其它服務。 ServiceReference sr = context.getServiceReference(EventAdmin.class.getName()); EventAdmin ea = (EventAdmin) context.getService(sr);
服務導向架構必須處理的問題 使用中的服務忽然中斷或消失時? 有更好的合格服務出現時? 同時有很多合格服務時? 可用工具 ServiceTracker類別 Spring OSGi
相關開源專案與工具 OSGi 實作品 OSGi開發工具 Knopflerfish Felix (Apache專案,前身為Oscar) Equinox (Eclipse專案) OSGi開發工具 Eclipse + Maven Eclipse + Knopflerfish Plugin Equinox
OSGi的未來發展 JSR 291與JSR 277之爭 OSGi在J2SE 7與Java EE6中的定位 Distributed OSGi (RFC119)