2005 javaonesm conference | session bof16-08
TRANSCRIPT
12005 JavaOneSM Conference | Session BOF16-08
SOA as Web2.0 ?SOA+DI で POJO をリミックス鈴木 雄介 アークランプhttp://www.arclamp.jp/
北條 育男 (株) エーティエル システムズhttp://www.atl-systems.co.jp/
稲村 創 (株) EC-One
http://www.ec-one.com/
@JavaOne2005 Tokyo BOF16-08
2
SOA と Web2.0 の現状を知り、開発者視点の SOA がどうあるべきかについて考えてみる
さらに、今使える技術で作ってみる[ 明日からでも SOA してみる ]
開発者視点の SOA とは?SOA についてみんなで考えよう
3
Agenda With Section Highlights
SOA とは? Web2.0 とは?SOA as Web2.0 ?開発者視点の SOA を実現する技術とは?作ってみました
4
SOA とは? 1/5
• 歴史と背景• サービス指向アーキテクチャ( Service Oriented
Architecture )• コンセプトは 10 年以上の歴史がある• 過去のソフトウェア開発の問題を SOA ですべてを解
決できる(はず)• SOA とは、依存レスなサービスを組み合わせて
アプリケーションを構築する• サービスは、プラットフォームに依存しない標準的で
オープンな手法で呼び出せる
5
SOA とは? 2/5
• 基本的な構造①プロバイダがディレク
トリサービスに登録を行う
②コンシューマがディレクトリサービスに問い合わせてサービスプロバイダを発見する
③コンシューマがプロバイダのサービスを利用する
サービス・プロバイダ
サービス・コンシューマ
ディレクトリ・サービス①
②
③
6
SOA とは? 3/5
• Web サービス• SOA を実現するための1つの標準化された手法
• UDDI ディレクトリサービス• WSDL API 規約• SOAP 呼び出し• …
• 相互運用性を確保するために HTTP を利用するのが一般的
7
SOA とは? 4/5
• ビジネスプロセス• サービス同士の連携を管理す
る• 長期ビジネスプロセスも管理
• BPEL ( Business Process Execution Language for Web Services )• プロセス定義を標準化した言
語の1種• EAI 、 BPM の延長• モデラーや BPEL エンジンが
必要
8
SOA とは? 5/5
• ESB ( Enterprise Service Bus )• サービスがメッセージをやり
取りするための伝送経路• SOA 版の Message Broker• ESB エンジンが必要
• JBI ( Java Business Integration )• ESB の標準化を狙ったもの
ESB
9
SOA とは? まとめ
• SOA• 依存レスなサービスを組み合わせてアプリケーション
を構築する• 現在の主流
• EAI ( Enterprise Application Integration )の延長線上( Web サービスなどで標準化)
• BPEL/ESB 製品を用意する
10
Web2.0 とは?
Web2.0 のグル Tim O’Reilly 曰くhttp://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html
http://japan.cnet.com/column/web20/story/0,2000054679,20090039,00.htm (日本語訳)
11
Tim’s Web2.0 1/4
• The Web As Platform• never sold or packaged, but delivered as a service • the long tail
ともかく広がりがある
12
Tim’s Web2.0 2/4
• the Wisdom of Crowds• Google's breakthrough in search … PageRank • Amazon sells … as Barnesandnoble.com … But
Amazon has … user reviews …• Wikipedia• Forksonomy ( del.icio.us 、 Flickr )• Blog
みんなの知恵が集まる
13
Tim’s Web2.0 3/4
• Data is the Next “Intel Inside”• maps.yahoo.com, maps.msn.com, or
maps.google.com, and you'll see the line "Maps copyright NavTeq, TeleAtlas,"
• the winner … first … aggregated data into a system service.
いろいろ使えるデータが重要
14
Tim’s Web2.0 4/4
• Users must be treated as co-developers • Design for "hackability" and remixability
ユーザーがいろいろできる
15
Web2.0 とは? まとめ
• マーケティングのグル Seth Godin 曰く…
• Attitude, not technology• Web 2.0 isn't new, but it's now.
Web2.0 とは、今、感じるものなんだ
http://sethgodin.typepad.com/seths_blog/2005/10/tim_o_on_web_20.html
16
SOA と Web2.0
• SOA• 依存レスなサービスを組み合わせるアイデアはイイ !• でも、 EAI って言われるとあんまり関係ないなぁ
• Web2.0• Web2.0 的って、すごくイイ!• 楽しそうに盛り上がっているけど、 Java は関係ない
し、仕事で使わないなぁ
• SOA と Web2.0 なんて、比べるも何も違うもの?
17
さて、ここからが本題です
18
SOA as Web2.0 ?
SOA と Web2.0 は実はよく似ているのでは?
19
JavaOne 2005 SF : Sun General Session
The information age is history.
Long live the Participation Age.
18 分 45 秒ぐらいから。 Jonathan Schwartz が Blog もWikipedia も Google も語ります
http://wcdata.sun.com/webcast/archives/VIP-1981/
20
BEA World 2005
• 標準規格やさまざまな「オープンな」コンポーネントで構成される SOA 環境も、こうした Sun の視点から見ると「 Participation Infrastructure 」(参加のためのインフラ)と位置づけられ、だれもが「コンテントプロバイダー」として情報を発信し、ネットワークで共有するためのツールとされる。
http://www.itmedia.co.jp/enterprise/articles/0509/29/news027.html
21
つまり本来の SOA とは
企業アプリで Web2.0 を
実現することなのでは?
22
SOA as Web2.0
• Web2.0 の思想は企業アプリでも重要• 過去には、 BI 、 HRM 、 KM 、 EIP などと呼ばれていたも
の• エンドユーザーコンピューティングともいえる
• SOA の理想は企業アプリで有効• 依存レスなサービスを組み合わせてアプリを構築する• 保守が容易で、組み替え可能で…
• その両者を組み合わせたものが開発者視点の SOAでは
• では、それを実現する技術は?
23
なぜ SOA と Web2.0 が違ってしまっているのかを
考えてみる
24
なぜ SOA と Web2.0 は違うのか? 1/3
• 企業を確認• SOA企業
• Web2.0企業
25
なぜ SOA と Web2.0 は違うのか? 2/3
• SOA企業と Web2.0企業ではビジネスモデルが違う
• SOA企業• パッケージを買ってもらう• 厚利少売
• Web2.0企業• サービスをロングテールで提供• 薄利多売
26
なぜ SOA と Web2.0 は違うのか? 3/3
• SOA企業は SOA を商品先導型で扱った• 「 SOA 的なシステムには、 SOA 製品を」• EAI が中心なのは売上が大きいから
• そのため矛盾が生じてしまった(いる)• 「 SOA で非依存な世界を実現できます。だから、この
製品に依存してください」
• 結果、” SOA企業が定義した SOA” は、実体がつかみにくく、盛り上がりにかけてしまったのではないだろうか?
27
では、この状況を変える
SOA as Web2.0 実現の
具体的な技術は?
28
SOA as Web2.0 への技術
• 重要なのはロングテールを実現できること• プロダクトの選択肢が広い(商用製品からオープンソ
ース)• 適用アプリケーションが広い(小さなアプリケーショ
ンから EAI )
• 今、使われている技術だけでは難しい• SOA : BPEL 、 ESB 、 SOAP…• Web2.0 : Ajax 、 XML 、 REST…
29
Dependency Injection
• DI は「アプリケーションレベルの SOA 」である• SOA とは、依存レスなサービスを組み合わせてアプ
リケーションを構築すること• DI とは、依存レスなコンポーネント( POJO )を組
み合わせてアプリケーションを構築すること
• 大げさではなく、 DI を使っていれば、 SOA の理想を実現しているといえる
30
DI のスケーラビリティ
• 依存先のサービスがどこにいるか関係ない• 同 VM内か• BPEL/ESB/SOAP 経由か
• Web サービスにもシームレスに結合可能• 逆に言えば DI を用いないで結合
するのはたいへんESB/BPEL
DI コンテナ
31
で、作ってみました。
DI を使ったSOA as Web2.0 なサービス
32
マイ観光マップサービス「 Meegle(めーぐる)」
• Meegle は、• 自分で観光プランを決めたい観光客のために、• 自分にあったサービスから観光マップを組み立て
る• 観光支援サイトです
※“ みーぐる” じゃないよ
33
DEMO
34
• 観光客が自分達の情報を公開すると、それにあったサービスが提供されます。あとは、気に入ったサービス結んで、観光名所をめぐる地図(通称:めーぐるマップ)を作成するだけです
• サービスの予約やキャンセルはめーぐるマップを通じてまとめて行われるため自分だけの観光マップを簡単に作ることが出来ます
• ※レビュー機能やレコメンデーション機能が付加可能か
Meegle概要( for 観光客)
35
• サービスプロバイダを Meegle にデプロイすることで、適切な観光客にアプローチ可能です• 観光名所がユーザーに合わせたサービスを動的に提供
するためのエージェント
• サービスプロバイダには様々なデプロイパターンを用意されているため、規模や予算に合わせて使い分け可能です
Meegle概要( for 観光名所)
36
サービスプロバイダ
• 観光名所がユーザーに合ったサービスを動的に提供するためのエージェント
• Meegle はサービスプロバイダの実行プラットフォーム• DI によってデプロイパ
ターンを増やすことで、参加を多様に
サービス
観光名所
ユーザー ユーザー
サービス サービス
サービス
観光名所 観光名所
サービスプロバイダ
サービスプロバイダ サービス
プロバイダ
37
Meegle アーキテクチャ( UI )
地図の取得サービスの取得予約
Ajax (Asynchronous JavaScript + XML )
XML
38
Meegle アーキテクチャ(サーバ)
• JBI/DI 上に構築• ServiceMix ( http://servicemix.org/ )
• オープンソースの JBI コンテナ• SpringFramework で構築
• 独自拡張で設定ファイル( servicemix.xml )に対応• アーキテクチャ概略
• JBI の BC/SE は、 Spring にコンポーネント( bean )として登録
• コンポーネント間のメッセージング処理( NMR )をServiceMix が実装
• ※WSDLへの依存はオプション( JBI の仕様からは外れる?)
39
servicemix.xml<?xml version="1.0" encoding="UTF-8"?><beans xmlns:saw2="http://jot2005/soaasweb20/">
<container id="jbi"> <components> <component id="httpBinding" service=“saw2:httpBinding“ class="org.servicemix.components.http.HttpInOutBinding“ destinationService="saw2:asyncForwarder"/>
<component id="simpleSP" service="saw2:simpleSP“ destinationService="saw2:responseRouter“ parent="serviceEngineParent"> <property name="meegleSP"> <bean class="meegle.service.impl.simple.SimpleSP" /> </property> </component>
40
Meegle アーキテクチャ( JBI/DI )
httpBinding(HTTP の BindingComponent)
asyncForwarder(非同期メッセージへの切り替えるためのダミー SE)
requestRouter/responseRouter ( XPath のルーティングエンジン)
findAggregator/reserveAggregator(サービス取得や予約の取りまとめ)
① ②
③
④
⑤
⑥
⑦⑧
⑨
⑩
⑪
デプロイされたサービスプロバイダ
同期メッセージ非同期メッセージ
XML
XML ⑫
BindingServlet( サーブレット )
⑬
すべての SP から返信があったら
41
サービスプロバイダ
• meegle.sp.MeegleSP を実装• ServiceMix にデプロイするには専用インターフェース
を実装する必要があるので、 Meegle でアダプタを用意してラップ
org.servicemix.MessageExchangeListener#onMessageExchange(javax.jbi.messaging.MessageExchange)
• デプロイパターンによる参加の多様性を確保• シンプルサービスプロバイダ• RDB サービスプロバイダ• 設定サービスプロバイダ• 外部サービスプロバイダ• DI サービスプロバイダ
42
meegle.sp.MeegleSPpublic interface MeegleSP { /** サービスのロード */ MeegleService[] getServices(Map condition);
/** 予約 */ ResultInfo reserve(ReserveInfo reserveServices); /** 予約キャンセル */ ResultInfo cancel(ReserveInfo cancelInfo);}
43
シンプルサービスプロバイダ
• 作成したサービスプロバイダを、そのままデプロイ
• シンプルで基本的な作り
44
シンプルサービスプロバイダ<component id="simpleSP" service="saw2:simpleSP" destinationService="saw2:responseRouter" parent="serviceProvidorParent"> <property name="meegleSP"> <bean class="meegle.sp.impl.simple.SimpleSP" /> </property></component>
Public class SimpleSP implements MeegleSP { public MeegleService[] getServices(Map condition) { if ( “family”,equals(condition.get(“group”)) { //家族向けサービス } else { // その他
45
RDB サービスプロバイダ
• POJO サービスプロバイダとほぼ同じ• ただし、 Meegle が提供するリソース(今回は
DataSource )をインジェクトする• Meegle 上のリソースを利用することで追加コス
トをもらうビジネスモデルも可能か• メール配送• 決済サービス• などなど
46
RDB サービスプロバイダ<component id="rdbSP" service="saw2:rdbSP" destinationService="saw2:responseRouter" parent="serviceProvidorParent"> <property name="meegleSP"> <bean class="meegle.sp.impl.rdb.RdbSP" > <property name="serviceHolderDao"> <bean class=“….ServiceHolderDaoJdbc"> <property name="dataSource" ref="dataSource" /> </bean> </property> </bean>
<bean id="dataSource" class=“...DriverManagerDataSource"> <property name="driverClassName“ value="${jdbc.driverClassName}"/> …
47
設定サービスプロバイダ
• 設定条件のクラスを提供し、簡単な設定のみでデプロイ
• 動的に文言を切り替えることはできないが、料金を安くできる可能性が高い• 今回は人数によるフィルタリングを実装• キーワードマッチなどなど
48
設定サービスプロバイダ<component id="filterSP" service="saw2:filterSP" destinationService="saw2:responseRouter" parent="serviceProvidorParent"> <property name="meegleSP"> <bean class="meegle.sp.impl.filter.FilterSP" > <property name="filters"> <list> <bean class=“…MeegleServiceFilterImp"> <property name="minLimit" value="8"/> <property name="maxLimit" value="30"/> <property name="service"> <bean class="meegle.service.MeegleService"> <property name="id" value="filter1"/> <property name="lat" value="35.6782"/> <property name="lng" value="139.7149"/> <property name="imgSrc" value="img1.jpg"/> <property name="title" value="国立競技場 (F)"/>
49
外部Web サービスプロバイダ
• 外部接続 SP を提供し、実際の処理は外部のサーバで実施
• 本格的な企業 /自治体連携の場合に有効• 今回は ServiceMix のアウトバンド用 BC を利用して、
REST で別インスタンスの JBI に接続• 接続形式は自由
50
外部Web サービスプロバイダ<component id="exService" service="saw2:exService" class="meegle.servicemix.se.ExHttp" destinationService="saw2:findAggregator"> <property name="outBoundName" value="exServiceOutBound" />
<component id="exServiceOutBound" service="saw2:exServiceOutBound" class="org.servicemix.components.http.HttpInvoker"> <property name="url" value="http://localhost:8912"/></component>
①XML
XMLXML
XML②
③④
別サーバ
51
DI サービスプロバイダ
• デプロイするサービスの粒度を変更自在にするためのテクニック
• MeegleSP の実装を、複数のクラスを Remix して実現
• DI のコンポーネントを組み込み DI コンテナで設定
52
• DI コンテナとして基本的な動きをおさらい
DI サービスプロバイダ
ServiMix/Spring
interface MeegleSP
class DiSP impelemtns MeegleSP
mailResource
2.Inject
設定1.生成
この中を見ると…
53
DI サービスプロバイダmailResource
2.Inject
動的コンテナ
3.動的コンテナに登録
mailResource
組み込みコンテナ
サービス検索
予約 / キャンセル
4. 組み込みコンテナを生成(動的コンテナを親コンテナに指定)
6.親コンテナの mailResource をlookup して bean に Inject
7. サービス検索処理 Call
8. サービス検索 bean をlookup して処理を実施
設定
5.Bean を生成
54
DI サービス /動的コンテナ//HashMap を利用した Spring のコンテナ実装Public class DynaAppCtx implements ApplicationContext {
Map beans = new HashMap();
//動的にするためにコンポーネントを追加するためのメソッド public void register(String name, Object bean) { beans.put(name, bean); }
//ApplicationContext を実装 public Object getBean(String name) throws BeansException { return beans.get(name); }
…
55
DI サービス /DiSPPublic class DiSp impelements MeegleSE, InitializeBean { DynaAppCtx pCtx = new DynaAppCtx(); ApplicationContext ctx;
//JBI/Spring の mailResource が Inject されてくる public void setMailResource(MailResource mailResource) { // そのまま動的 DI に登録 pCtx.register(“mailResource”, mailResource); }
//初期化終了後に組み込み DI コンテナの起動 public void afterPropertiesSet() { ctx = new ClassPathXmlApplicationContext( new String[] {“appCtx.xml”}, pCtx); }
… (次のページへ)
56
DI サービス /DiSPPublic class DiSp impelements MeegleSE, InitializeBean { DynaAppCtx pCtx = new DynaAppCtx(); ApplicationContext ctx;
…
//MeegleSE の実装メソッド public MeegleService[] getServices(Map condition) { MyServiceLocator sl = ctx.resolveComponent(“serviceLocator”); return sl.process(condition); }
57
Summary
• SOA と Web2.0• SOA は依存レスなサービスの組み合わせ• Web2.0 的であればWeb2.0
• 開発者視点の SOA とは、企業システムでWeb2.0 的を実現すること
• まずはアプリケーションで SOA を実現する• DI をうまく使うと、自然にサービスを組み合わせた
ような、ロングテールなアプリケーションができる• しかも、 Web サービスに拡張も可能
58
Q&A