G*workshop 20101209 OSGi and Grails2.0

1,396 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,396
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

G*workshop 20101209 OSGi and Grails2.0

  1. 1. Grails2.0に備えてOSGiを学ぼう@第13回 G*ワークショップ<br />2010/12/9<br />日本アイ・ビー・エム(株) 須江 信洋<br />nsue@e-mail.ne.jp<br />http://twitter.com/nobusue<br />※資料の内容は個人としての意見・見解を述べたものであり、<br />所属する企業・組織が内容を保証するものではありません。<br />
  2. 2. (不要かもしれませんが)自己紹介<br />須江 信洋(すえ のぶひろ)<br />1970年生まれの40才<br />ずっとJavaEE関連の仕事をしています<br />職場は何回か変わってます。。。<br />G*との関わり<br />Groovyを組み込んだ製品(WebSphere sMash)を売ってます<br />JGGUGサポート・メンバー<br />「Groovy イン・アクション」翻訳メンバーの一味<br />「Groovy入門(仮称)」依然として執筆中です。。。<br />2<br />
  3. 3. 今日、私がここに出てきた理由は・・・<br />OSGiって最近よく聞くけど、いったい何者?<br />それは美味しいですか?<br />それは開発者を苦しめる新たなバズワードですか?<br />僕らに何か関係あるんですか?<br />関係ないけどガンダムUCは商業ベースの同人作品?<br />3<br />という、もろもろの疑問を解決するためだと認識しております<br />
  4. 4. OSGiってなんで必要なの?一言で教えて。<br />ようがす。<br />4<br />Answer:<br />Javaはコンポーネント指向プラットフォームとして欠陥があるからです<br />
  5. 5. コンポーネント指向(モジュール指向)プラットフォームの要件<br />モジュール境界が定義できること<br />外部に公開するインターフェース<br />モジュールに閉じたリソース<br />物理的なパッケージングの仕様<br />モジュール間の依存性管理が可能であること<br />依存先モジュールの明示<br />モジュールのバージョン管理<br />依存関係の解決<br />モジュールのライフサイクル管理が可能であること<br />インストール/アンインストール<br />開始/停止<br />ライフサイクルイベントへの対応<br />
  6. 6. Javaの現状<br />Project Jigsawでモジュール化機構を導入<br />ただしJava8(2012年予定)<br />モジュール境界の定義に関する課題<br />クラスやメソッドの可視性だけでは十分な制御が難しい<br />publicではクラスローダー全体に公開されてしまう<br />そもそも、Javaのクラスはモジュールの単位としては細かすぎる<br />JARはモジュールとしては機能不足<br />単に複数のクラスやリソースをまとめる機能のみ<br />一旦ロードされた後は、個別のクラス単位で認識されるのみ(JARは意識しない)<br />モジュール間の依存性管理に関する課題<br />静的な依存関係はコンパイルしてみないと分からない<br />実行時の依存関係は実行してみないと分からない<br />バージョン管理機能がない<br />モジュールのライフサイクル管理に関する課題<br />一旦ロードしたクラスはアンロードできない<br />ライフサイクルという概念はない(ロードされたら直ちに有効となる)<br />
  7. 7. 7<br />OSGi小史<br />1999年:「Open Service Gateway Initiative」が設立<br />当初は家庭や小規模オフィス向けのゲートウェイ装置で動作するサービスプログラムの実行基盤<br />2003年:名称を「OSGi Alliance」に変更<br />対象を車載機器やモバイル端末、エンタープライズシステムに拡大<br />2003年:Eclipse 3.0がプラグイン管理システムとしてOSGi仕様を採用<br />Javaの世界での知名度が一気に向上<br />2010年:OSGi R4.2の一部としてEnterprise Specification公開<br />JavaEE環境でOSGiを活用するための拡張仕様<br />Spring Framework由来のDIコンテナ機能も標準化<br />
  8. 8. 8<br />OSGiの提供する機能<br />実行環境が依存関係を管理<br />異なるモジュールが同一モジュールの異なるバージョンを要求してもOK<br />JVMを起動したままモジュールの入れ替えが可能<br />Moduleレイヤー<br />依存関係の解決<br />複数バージョンの管理<br />Life Cycleレイヤー<br />モジュールの動的ロード<br />Serviceレイヤー<br />Securityレイヤー<br />
  9. 9. Bundle: OSGiにおけるモジュール<br />9<br />OSGi<br />Metadata<br />+<br />JAR<br />META-INF/MANIFEST.MF<br />
  10. 10. OSGi Metadata<br />10<br />Manifest-Version: 1.0<br />Export-Package: org.apache.aries.samples.blueprint.helloworld.server;<br /> uses:="org.apache.aries.samples.blueprint.helloworld.api";<br /> version="0.2.0.incubating"<br />Import-Package:<br />org.apache.aries.samples.blueprint.helloworld.api;version="[0.2,0.3)"<br />Implementation-Title: Apache Aries<br />Implementation-Version: 0.2-incubating<br />Bundle-Name: Apache Aries Blueprint HelloWorldServer<br />Bundle-SymbolicName: org.apache.aries.samples.blueprint.helloworld.server<br />Bundle-Vendor: The Apache Software Foundation<br />Build-Jdk: 1.6.0_21<br />Bundle-Version: 0.2.0.incubating<br />Bundle-ManifestVersion: 2<br />Bundle-Description: Example blueprint hello world application - server<br />Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt<br />Bundle-DocURL: http://www.apache.org<br />
  11. 11. 11<br />バージョン管理<br />1.2.0≦ バージョン < 1.4.0<br />com.foo.bar<br />com.foo.bar<br />com.foo.bar<br />com.foo.bar<br />1.4.5<br />1.3.12<br />[1.2.0, 1.4.0)<br />[1.4.0, 1.5.0)<br />Import<br />Export<br />両方のBundleに同名のClassが存在していても、正しく解決される<br />
  12. 12. 12<br />Bunldeのライフサイクルと依存関係の解決<br />Bundleをstopすると、"Stopping"を経て"Resolved"に戻る<br />Bundleをstartすると、"Starting"を経て"Active"に<br />OSGi FrameworkにBundleをロードすると"Installed"に<br />Import-Packageなどで指定された依存関係を満たすかチェック<br />⇒OKなら"Resolved"に<br />
  13. 13. 13<br />ライフサイクル・サービス<br />Bundleの状態が変化したときに、Frameworkからコールバックされる<br />importorg.osgi.framework.BundleActivator;importorg.osgi.framework.BundleContext;publicclassMyAppActivatorimplementsBundleActivator {publicvoidstart(BundleContext context) throws Exception {System.out.println("Bundle is starting."); }publicvoidstop(BundleContext context)throws Exception {System.out.println("Bundle is stopping."); }}<br />
  14. 14. 14<br />バージョン管理:behind the scenes<br />com.foo.bar<br />com.foo.bar<br />com.foo.bar<br />com.foo.bar<br />1.4.5<br />1.3.12<br />[1.2.0, 1.4.0)<br />[1.4.0, 1.5.0)<br />ClassLoader<br />Import<br />Export<br />FrameworkがBundle毎にClassLoaderを作成し、Metadataに従って関連付ける<br />
  15. 15. めでたし、めでたし?<br />ここまでの話で「おや?」と思った方、鋭い!<br />実はまだ問題があります。。。整理してみましょう。<br />Bundle間の依存関係の解決は、Bundleをロードした後に行われる<br />無事に依存関係が解決できると、Bundle毎のクラスローダーが関連づけられ、"Resolved"に<br />Bundleをstartすると"Active"になって動作する<br />では、既にActiveになっているBundleの新しいバージョンをリリースするには、どうすれば?<br />15<br />
  16. 16. Bundleのバージョンアップ?<br />16<br />com.foo.bar<br />com.foo.bar<br />com.foo.bar<br />1.4.5<br />[1.4.0, 1.5.0)<br />1.4.6<br />Import<br />Export<br /><<active>><br /><<active>><br />install/start<br />Client Bundleをstop/startしない限り、新しいバージョンとの紐付けは行われない<br />
  17. 17. 実は・・・<br />Export-Package/Import-Packageによる参照は「静的な参照」関係<br />依存関係の解決は、Bundleをstartした時にOSGi FrameworkにロードされているBundleに対して行われる<br />依存関係を更新するためには、Bundleを再起動する必要あり<br />17<br />この方法では、動的なモジュールの交換は不可能(涙)<br />
  18. 18. では、動的なモジュールの交換はどうする?<br />そのための仕組みが、OSGiFrameworkの提供するService Registryです<br />Serviceと言っても大げさなものではなく、実体はJavaのClass(Interface)です<br />18<br />Registryから毎回lookupするので、更新されたバージョンが登録されていれば直ちに反映される<br />ServiceRegistry<br />register<br />lookup<br />Service<br />Requester<br />Service<br />Provider<br />
  19. 19. Serviceの登録と参照<br />19<br />public class GreetingImple implements Greeting {<br />・・・・・・・<br />}<br />Serviceの登録<br />public class Activator implements BundleActivator {<br /> public void start(BundleContextctx) { <br />ctx.registerService(Greeting.class.getName(),<br /> new GreetingImpl("service"), null);<br />}<br />・・・・<br />Interfaceのクラス名で、GreetingImplのインスタンスを登録<br />Serviceの参照<br />public class Client implements BundleActivator {<br /> public void start(BundleContextctx) {<br />ServiceReference ref =<br />ctx.getServiceReference(Greeting.class.getName()); <br /> ((Greeting) ctx.getService(ref)).sayHello(); <br /> }<br />・・・・<br />Interfaceのクラス名で、サービスのインスタンスを取得<br />
  20. 20. OSGi R4.2 Enterprise Specification<br />OSGi Alliance Enterprise Expert Group(EEG)によって定められたEnterprise向けの拡張仕様<br />http://www.infoq.com/news/2010/03/osgi-enterprise-42-released<br />以下が規定されている<br />アプリケーションのアセンブリ・フォーマットの拡張<br />JavaEEコンテナ・サービスとの統合<br />宣言的なDI仕様(Blueprint)<br />
  21. 21. 21<br />OSGi化したエンタープライズ・アプリケーション<br />OSGi Bundle(.jar)<br />OSGimetadata<br />OSGi Bundle(.jar)<br />OSGi Bundle(.jar)<br />BusinessLevelApplication<br />EnterpriseBundle App(.eba)<br />Web AppBundle (.wab)<br />ContextPath<br />VirtualHost<br />Enterprise Bundle App (.eba)<br />
  22. 22. Blueprint component model<br />サービスレジストリへの登録や参照を宣言的に行うための仕様<br />JNDIサービスにより、OSGiのサービスレジストリにJNDI経由でアクセス可能<br />[OSGI-INF/blueprint/service.xml]<br /><blueprint <br />xmlns:tx="http://www.ibm.com/appserver/schemas/8.0/blueprint/transactions"<br />xmlns:jpa="http://www.ibm.com/xmlns/ibm-blueprint-jpa/v1.0.0"><br /><bean id="blabberImpl" class="com.ibm.ws.eba.example.blabber.persistence.BlabberImpl"><br /><jpa:context property="entityManager" unitname="blabber" /><br /> <tx:transaction method="*" value="Required"/><br /></bean><br /><service id="blabberService" ref="blabberImpl" interface="com.ibm.ws.eba.example.blabber.persistence.spi.BlabberUserInterface" /><br /></blueprint><br />OSGi Bundle(.jar)<br />Interface名で実装(bean)を公開<br />OSGiサービス・レジストリーからInterface名で実装(bean)を取得<br />InitialContextic = new InitialContext();<br /> return (BlabberUserInterface) ic.lookup("osgi:service/" + BlabberUserInterface.class.getName());<br />Client<br />
  23. 23. 23<br />ちょっと宣伝:WAS V7 Feature Pack for OSGi Applications<br />Apache Foundationに寄贈されIncubatorでオープンソース化の作業中<br />http://www.ibm.com/software/jp/websphere/apptransaction/was/featurepacks/osgi/<br />WASの上で動くアプリケーションも"OSGi Bundle"に<br />
  24. 24. OSGiって何がうれしいの?(その1)<br />設計モデルと実行モデルの一致<br />実行モデル<br />実行モデル(Java)<br />フラットなClass Loader<br />設計モデル<br />B.jar<br />A.jar<br />non-OSGi<br />設計モデル<br />B.jar<br />設計時に意図していない参照のリスク<br />A.jar<br />C.jar<br />実行モデル(OSGi)<br />バンドル毎のClass Loader<br />C.jar<br />OSGi<br />B.jar<br />A.jar<br />依存関係を明示することで設計時の意図を遵守<br />C.jar<br />
  25. 25. OSGiってなにがうれしいの?(その2)<br />依存関係のトレーサビリティ<br />A.jar<br />モジュールを入れ替える際に影響を受けるモジュールが機械的に特定できる<br />B.jar<br />C.jar<br />D.jar<br />E.jar<br />F.jar<br />G.jar<br />
  26. 26. GrailsとOSGi<br />Grails 2.0 Roadmap<br />http://www.grails.org/Roadmap<br />26<br />
  27. 27. 意味がわからないので、翻訳してみた<br />27<br />よくわからんけど、要はGrailsのプラグインをOSGi Bundleにするよってことかな?<br />
  28. 28. GrailsプラグインをOSGi化する理由は?<br />すいません、プラグイン作ったことないので。。。<br />妄想してみます。<br />おそらく、以下のような課題があるのでしょう<br />プラグイン間の依存関係がよく壊れて動かなくなる?<br />同一プラグインの複数バージョンを同時にデプロイできない?<br />アプリケーションを稼働させたまま、サービスモジュールを入れ替えることができない?(いわゆる活性保守)<br />Grails2.0のブランチはまだ作成されていないので、どうなるかまったく予想がつきません。<br />28<br />
  29. 29. 待ちきれないよ!!!!<br />そんなあなたにお勧め、Grails OSGi plugin<br />http://www.grails.org/plugin/osgi<br />GrailsアプリケーションをBundle化して実行できます<br />grails bundle<br />grails run-bundle<br />29<br />
  30. 30. まとめると・・・<br />OSGiって最近よく聞くけど、いったい何者?<br />モジュラーJavaのプラットフォームです。<br />それは美味しいですか?<br />正直、万人向けのお味ではありませんが、慣れるとやみつきになります。<br />それは開発者を苦しめる新たなバズワードですか?<br />そんなことはないです。むしろ、大規模開発ではアーキテクトと開発者と基盤担当者の共同作業をやりやすくしてくれます。<br />僕らに何か関係あるんですか?<br />Grails2.0のプラグインシステムはOSGiベースになるみたいですよ。<br />SpringSourceもOSGiに力をいれてますよ。<br />今は知ってる人が少ないからチャンスかも。。。。。<br />関係ないけどガンダムUCは商業ベースの同人作品?<br />そうです。面白ければいいぢゃないですか!ね、@bikisukeさん。<br />30<br />
  31. 31. 31<br />参考資料(宣伝成分多めですが・・・)<br />OSGi R4.2 仕様書<br />http://www.osgi.org/Download/Release4V42<br />Introduction to OSGi by Neil Bartlett<br />http://www.slideshare.net/njbartlett/introduction-to-osgi-tokyo-jug<br />dW:エンタープライズOSGi入門<br />第1回 OSGi概要と実行環境の導入http://www.ibm.com/developerworks/jp/websphere/library/was/was7_fep_osgi/1.html<br />第2回 OSGiのエンタープライズ拡張仕様を紐解くhttp://www.ibm.com/developerworks/jp/websphere/library/was/was7_fep_osgi/2.html<br />第3回 OSGiによるアプリケーションのモジュール化http://www.ibm.com/developerworks/jp/websphere/library/was/was7_fep_osgi/3.html<br />RedBooks: Getting Started with the Feature Pack for OSGi Applications and JPA 2.0<br />http://www.redbooks.ibm.com/abstracts/sg247911.html?Open<br />dW: OSGiアプリケーションを開発、利用するためのベスト・プラクティス<br />http://www.ibm.com/developerworks/jp/websphere/library/was/was7_osgi_practices/<br />
  32. 32. 以上です。ありがとうございました。<br />32<br />

×