成長できるエンタープライズシステムを目指して-osgiによるモジュール型アーキテクチャの実現-...
DESCRIPTION
TRANSCRIPT
Developers Summit 2010
近藤寛喜株式会社チェンジビジョン開発部
19-C-3
成長できるエンタープライズシ成長できるエンタープライズシステムを目指してステムを目指してOSGiOSGiによるモジュール型アーキテクチャの実現によるモジュール型アーキテクチャの実現
自己紹介
Developers Summit 2010
アジェンダアジェンダ
• システムを継続的に成長させるには?システムを継続的に成長させるには?• OSGiOSGiとは?とは?• BundleBundle設計の六個の勘どころ設計の六個の勘どころ• デモデモ• OSGiOSGiがもたらす未来がもたらす未来
Developers Summit 2010
一一..システムを持続的にシステムを持続的に 成長させるには? 成長させるには?
システムはそもそも複雑なものシステムはそもそも複雑なもの
http://www.flickr.com/photos/adc/411821495/
Developers Summit 2010
複雑なシステムを複雑なシステムをわかりやすく構築するにはわかりやすく構築するには
どうしたらよいですか?どうしたらよいですか?
複雑なシステムを構成するには複雑性を軽減する仕組みが必要
オブジェクト指向も、構造化設計もオブジェクト指向も、構造化設計も複雑性を軽減させる仕組み複雑性を軽減させる仕組み
http://www.flickr.com/photos/procsilas/392877509/
Developers Summit 2010
•例:例:EclipseEclipse
高い成長性を維持
Developers Summit 2010
EclipseEclipseの成長の要因の一つは、の成長の要因の一つは、
モジュール型アーキテクチャモジュール型アーキテクチャにあるにある
モジュール型アーキテクチャモジュール型アーキテクチャhttp://www.flickr.com/photos/37hz/1247083341/
スモールイズビューティフルスモールイズビューティフル
http://www.flickr.com/photos/mdpettitt/2665598298/
Developers Summit 2010
スモールイズビューティフルスモールイズビューティフル
• 柔軟な構成を取れる柔軟な構成を取れる• 保守しやすい保守しやすい• 理解が簡単理解が簡単• 再利用しやすい再利用しやすい• … … 等々等々
普通の普通のJavaJavaだったら・・・だったら・・・http://www.flickr.com/photos/morberg/3146874095/
Developers Summit 2010
Q.JARQ.JARででモジュールシステムを構成モジュールシステムを構成
できないの?できないの?
Developers Summit 2010
A.A.できないことはないです。できないことはないです。でもモジュールとして維持するのがでもモジュールとして維持するのが
大変。大変。
Developers Summit 2010
JavaJavaのクラスロードモデルのクラスロードモデルブート
クラスローダ
A B C
D E F
G
拡張クラスローダ
アプリケーションクラスローダ
JAR
依存
Developers Summit 2010
つまり・・・つまり・・・
• JARJARをモジュールとして分離し、をモジュールとして分離し、再利用再利用• →→必要な必要なJARJARが無いが無い• →→ClassNotFoundExceptionClassNotFoundExceptionでクラッシュでクラッシュ
JARJARには暗黙的な依存関係が存在には暗黙的な依存関係が存在
JARは依存するJARの情報を持っていません
アプリケーションアプリケーションクラスローダの中クラスローダの中
http://www.flickr.com/photos/shareski/3481154470/
APPクラスローダでは変更した時の影響範囲が分かりません
Developers Summit 2010
再利用の二つの軸再利用の二つの軸
時間軸時間軸
空間軸空間軸((機能機能 ::ライブラリ等ライブラリ等 ))
成長するシステムとは時間軸での再利用ができるシステムの事
新しい要件に対応する度にシステムを全部更新をしますよね?
規模が大きくなるにつれ、どうなっていきますか?
システムを全部更新する=影響が分からないので全テスト
ごちゃごちゃのシステムごちゃごちゃのシステム
http://www.flickr.com/photos/joiseyshowaa/2402764792/
見通しよく整理する見通しよく整理する
http://www.flickr.com/photos/cheltenham/4100341188/
システムを分割し、影響範囲を限定するため独立させたい
依存情報があれば、依存情報からテスト範囲を限定できます
どうやって?どうやって?
http://www.flickr.com/photos/oddwick/1765661986/
Developers Summit 2010
•EclipseEclipseの例の例
プロジェクト間の独立性と依存関係の整理がキー
Developers Summit 2010
まとめ:複雑なシステム→小さく・独立・組み合わせ
Developers Summit 2010
モジュール型システムの問題モジュール型システムの問題
• 開発コスト開発コスト– 意識しない時の意識しない時の33倍倍
• 独立性の担保独立性の担保• 依存関係の整理依存関係の整理
• 規模が小さい時は規模が小さい時は×× →例 →例::設計したら設計したら11モジュールモジュール
宮本武蔵・五輪書より武器や流派にこだわるな
使うべき場所を見誤らないように
Developers Summit 2010
二二.OSGi.OSGiとは?とは?
Developers Summit 2010
OSGiOSGiとはとは
• Open Service Gateway initiativeOpen Service Gateway initiativeの略の略• 「オープンなサービスゲートウェイの推進」「オープンなサービスゲートウェイの推進」
• Dynamic Dynamic Module SystemsModule Systems for Java for Java
• JavaJavaのための動的なのための動的なモジュールシステムモジュールシステム
OSGiOSGiとはとは
黒船来航
Developers Summit 2010
増える増えるOSGiOSGiの利用例の利用例
• King of Java Application's infrastructureKing of Java Application's infrastructure
• By Neil BartlettBy Neil Bartlett
Developers Summit 2010
どんなところで有効なの?どんなところで有効なの?
• 継続して成長させたいシステム継続して成長させたいシステム– ツールツール– WebWebサービスサービス– エンタープライズシステムエンタープライズシステム
• お客さん毎に違う機能セットを提供したいお客さん毎に違う機能セットを提供したい– パッケージのカスタムパッケージのカスタム
• プラグインシステムを提供したいプラグインシステムを提供したい
OSGiOSGiのの33大要素大要素モジュールシステムモジュールシステムサービス連携サービス連携動的動的 ((DynamicDynamic))
http://www.flickr.com/photos/yourdon/2921734152/
OSGiOSGiのの33大要素大要素モジュールシステムモジュールシステムサービス連携サービス連携動的動的 (Dynamic)(Dynamic)
http://www.flickr.com/photos/yourdon/2921734152/
Developers Summit 2010
OSGiOSGiを使ってを使って
モジュールシステムを構築すると、モジュールシステムを構築すると、
クラスローダの関係はこうなります。クラスローダの関係はこうなります。
Developers Summit 2010
OSGiOSGiのクラスロードモデルのクラスロードモデル
System
A B C
D E FJAR+メタデータ• Bundle(バンドル)
G
Developers Summit 2010
利点利点
• 依存する依存するBundleBundleごと他のシステムへごと他のシステムへ– →→EclipseEclipseのプラグインのインストールのプラグインのインストール
• 依存の宣言がない依存の宣言がないBundleBundle同士は分離同士は分離• →→BundleBundle内の変更が他に影響しにくい内の変更が他に影響しにくい
• →→BundleBundleごとにごとに独立できる独立できる
Developers Summit 2010
Bundle = Bundle = JARJAR + + メタデータメタデータ
今まで通りの環境でも使える今まで通りの環境でも使える
Developers Summit 2010
欠点欠点
• 独自のクラスロード構造独自のクラスロード構造– Class.forName()Class.forName()が使えないが使えない– →→クラスローダが異なるクラスは読めないクラスローダが異なるクラスは読めない– リソースが読めないリソースが読めない– →→クラスローダがクラスローダが((同上同上))
• 対処法対処法::• →→クラスローダの入れ替えクラスローダの入れ替え
System
A B C
D E F
G
Developers Summit 2010
OSGiOSGiのメタデータののメタデータの書き方一例書き方一例
META-INF/MANIFEST.MFMETA-INF/MANIFEST.MFに記述に記述 シンボル名 シンボル名:Bundle-SymbolicName:Bundle-SymbolicName
バージョン バージョン:Bundle-Version:Bundle-Version
依存関係 依存関係
必要なパッケージ 必要なパッケージ:Import-Package:Import-Package
公開パッケージ 公開パッケージ:Export-Package:Export-Package
Developers Summit 2010
OSGiOSGiメタデータのメタデータの一例一例
Developers Summit 2010
メタデータがあるので・・・メタデータがあるので・・・
• パッケージによる公開・非公開の制御パッケージによる公開・非公開の制御• JARJARに必要なパッケージの宣言に必要なパッケージの宣言• →→パッケージを公開しているパッケージを公開しているJARJAR必要必要• →→依存関係を定義依存関係を定義できるできる
Developers Summit 2010
依存の定義方法依存の定義方法
• パッケージによる依存定義パッケージによる依存定義– Import-PackageImport-Package
• BundleBundleによる依存定義による依存定義– Require-BundleRequire-Bundle
• それぞれ依存するバージョンを範囲で指それぞれ依存するバージョンを範囲で指定定
Developers Summit 2010
バージョンバージョン (1)(1)定義方法定義方法
• MavenMavenとはちょっと違うバージョン定義とはちょっと違うバージョン定義• メジャーメジャー..マイナーマイナー..パッチパッチ..識別子識別子
–例例:1.2.0.beta1:1.2.0.beta1
• 識別子には文字列が使える識別子には文字列が使える–ただし、識別子がついている方が上位として認識ただし、識別子がついている方が上位として認識–例:例:1.2.01.2.0よりも、よりも、1.2.0.beta11.2.0.beta1の方が上位の方が上位
• 定義されていない場合は定義されていない場合は0.0.00.0.0
Developers Summit 2010
バージョンバージョン (2)(2)範囲指定範囲指定
• 「開区間」、「閉区間」、「暗黙」の「開区間」、「閉区間」、「暗黙」の33種種
• [1.0.0, 2.0.0] → 1.0.0 ≦[1.0.0, 2.0.0] → 1.0.0 ≦バージョンバージョン≦≦2.0.02.0.0
• [1.0.0, 2.0.0) → 1.0.0 ≦[1.0.0, 2.0.0) → 1.0.0 ≦バージョン<バージョン<2.0.02.0.0
• バージョン “バージョン “1.*” 1.*” を指すを指す• 1 → [1.0.0, ∞)1 → [1.0.0, ∞)• 未指定 → 未指定 → [0.0.0, ∞)[0.0.0, ∞)
Developers Summit 2010
バージョンの異なるバージョンの異なるJARJARへの依存への依存
• java -cp a.jar b.jar c.jar a_v2.jarjava -cp a.jar b.jar c.jar a_v2.jar• ((通常フラットなクラスパスの場合通常フラットなクラスパスの場合))
先に宣言された先に宣言されたJARJARで解決で解決
app
a
Ext Boot
b c a2
Developers Summit 2010
バージョンの異なるバージョンの異なるBundleBundleへの依存への依存
• OSGiOSGi環境下の場合環境下の場合
宣言された宣言されたBundleBundleで解決で解決
app
a
Ext Boot
b c
a2
System
OSGiOSGiのの33大要素大要素モジュールシステムモジュールシステム動的動的 (Dynamic)(Dynamic)サービス連携サービス連携
http://www.flickr.com/photos/yourdon/2921734152/
Developers Summit 2010
Declartive ServiceDeclartive Service((サービスの宣言サービスの宣言 ::利用側利用側 ))
• 一部抜粋一部抜粋
Developers Summit 2010
Declartive ServiceDeclartive Service((サービスの宣言:提供側サービスの宣言:提供側 ))
• 一部抜粋一部抜粋
Developers Summit 2010
Declartive ServiceDeclartive Service((サービスの宣言サービスの宣言 ))
• Consumer(Consumer(要求側要求側))ととProvider(Provider(供給側供給側))• ConsumerConsumerは、必要なは、必要なIFIFを宣言を宣言• ProviderProviderは供給できるは供給できるIFIFと、実装を宣言と、実装を宣言
• 特別な特別なIFIF、アノテーションは不要、アノテーションは不要
Developers Summit 2010
Declarative ServiceDeclarative Service((サービスの宣言サービスの宣言 ))
• 実装間で相互運用可実装間で相互運用可– Declarative Service(XML/Annotation)Declarative Service(XML/Annotation)– Blueprint Service(Spring DM/Aries)Blueprint Service(Spring DM/Aries)– Google Guice PeaberryGoogle Guice Peaberry– iPOJOiPOJO
OSGiOSGiのの33大要素大要素モジュールシステムモジュールシステムサービス連携サービス連携動的動的 (Dynamic)(Dynamic)
http://www.flickr.com/photos/yourdon/2921734152/
Developers Summit 2010
DynamicDynamic
• 稼働中に稼働中にBundleBundleの構成を変更できるの構成を変更できる• →→install,update,uninstall,start,stop,refreshinstall,update,uninstall,start,stop,refresh• 必要になった必要になったBundleBundleを更新を更新
• →→こんな事ができるのは、こんな事ができるのは、BundleBundleごとにごとに独立独立してるからこそ。してるからこそ。
Developers Summit 2010
四四.Bundle.Bundle設計の六つの勘どころ設計の六つの勘どころ
Developers Summit 2010
BundleBundle設計の勘どころ設計の勘どころ一一 ..大きくしすぎない大きくしすぎない
• 大きくなったら分割を検討大きくなったら分割を検討• →→複数の役目を担当?複数の役目を担当?• →→新機能のためにライブラリ追加新機能のためにライブラリ追加??• これらは大きくなる兆候です。これらは大きくなる兆候です。
Developers Summit 2010
BundleBundle設計の勘どころ設計の勘どころ二二 ..登録サービスを限定登録サービスを限定
• 複数のサービスを登録複数のサービスを登録• →→BundleBundleが複数の責務を担っているが複数の責務を担っている• BundleBundleが大きくなる兆候が大きくなる兆候• BundleBundleを小さくするためにを小さくするために• →→登録サービスは限定する登録サービスは限定する
Developers Summit 2010
BundleBundle設計の勘どころ設計の勘どころ三三 ..役割を明確に役割を明確に
• 33種別の種別のBundle(by Bundle(by うじょさんうじょさん))
• API Bundle → API Bundle → インタフェースのみインタフェースのみ• Library Bundle → Library Bundle → これまでのこれまでのJARJAR
• Service Bundle → Service Bundle → サービス登録サービス登録//利用利用
• その他その他– Mock Bundle → API BundleMock Bundle → API Bundleを空実装を空実装
Developers Summit 2010
BundleBundle設計の勘どころ設計の勘どころ四四 ..公開パッケージを限定する公開パッケージを限定する
• 他の他のBundleBundle開発中の、間違えを防ぐ開発中の、間違えを防ぐ– 不要な依存を増やしやすい。不要な依存を増やしやすい。– 依存が増える→独立性が悪化依存が増える→独立性が悪化– 変更による影響を及ぼしやすくする。変更による影響を及ぼしやすくする。
非公開パッケージ名の規約として、パッケージ名を”*.internal.*”と明示
Developers Summit 2010
BundleBundle設計の勘どころ設計の勘どころ五五 .Bundle=.Bundle=独立したシステム独立したシステム
• 隣の芝生は青い隣の芝生は青い• システムまたげばシステムまたげばDRYDRYは通用せずは通用せず
– 非公開クラスを利用非公開クラスを利用– →→コピーを検討コピーを検討– →→別途別途BundleBundleにするにする– 良い垣根は良いお隣さんを育む良い垣根は良いお隣さんを育む– By Jeff McafferBy Jeff Mcaffer
Developers Summit 2010
BundleBundle設計の勘どころ設計の勘どころ六六 .Bundle.Bundleをまたいだ継承、をまたいだ継承、静的参照は静的参照は××
• 期待した通りに動作しない事が多いです。期待した通りに動作しない事が多いです。• →→デモ作成でハマりました。デモ作成でハマりました。• →→思い返すといい思い出がありません。思い返すといい思い出がありません。
– →→publicpublicなのに、参照できず落ちるなのに、参照できず落ちる• →→やろうと思えばやれるやろうと思えばやれる==バッドノウハウバッドノウハウ
Developers Summit 2010
BundleBundle設計の勘どころ設計の勘どころまとめまとめ
• 一一..大きくしすぎない大きくしすぎない• 二二..登録サービスを限定登録サービスを限定• 三三..種別毎に分割する種別毎に分割する• 四四..公開パッケージを限定公開パッケージを限定• 五五.Bundle=.Bundle=独立したシステム独立したシステム• 六六..不要な継承、静的参照はしない不要な継承、静的参照はしない
小さい
独立
Developers Summit 2010
まとめ:複雑なシステム→小さく・独立・組み合わせ
Developers Summit 2010
四四..デモデモ
Developers Summit 2010
動的に切り替えます。Bundleが独立している事を実感してください。(開発環境:Spring DM(1.2.1)+Maven)http://github.com/kompiro/osgi-demo-bookstore.git
こんぴろ書店こんぴろ書店 ((デブサミ支店デブサミ支店 ))
• 書籍登録書籍登録• 書籍検索書籍検索• それぞれ別々のそれぞれ別々のBundleBundleで開発で開発
Developers Summit 2010
System
books
booksmock
web.admin
web
初期構成初期構成
books.domain
依存
サービス提供
Developers Summit 2010
System
booksbooksmock
web.admin
web
一一 .mock.mockからから implimplにに
books.domain
依存
サービス提供
booksimpl
books2
Developers Summit 2010
System
booksbooksmock
web.admin
web
二二 .mock.mockとと implimplを共存を共存((システムの一部が旧バージョンシステムの一部が旧バージョン ))
books.domain
依存
サービス提供
booksimpl
books2
Developers Summit 2010
五五.OSGi.OSGiがもたらす未来がもたらす未来
Developers Summit 2010
Polyglot(Polyglot(多言語多言語 )OSGi)OSGi
System
A B C
JRuby Scala Groovy
G
Developers Summit 2010
必要なサービスを必要な時に必要なサービスを必要な時に
システムが能動的に取得システムが能動的に取得
Developers Summit 2010
参考文献参考文献
Developers Summit 2010
本日盛り込まなかった内容本日盛り込まなかった内容
• 標準化標準化• スクリプト言語との対応スクリプト言語との対応• 実装毎の細かな差異実装毎の細かな差異• 具体的なテスト方法具体的なテスト方法(UnitTest(UnitTest等等))
Developers Summit 2010
まとめ:複雑なシステム→小さく・独立・組み合わせ