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
2005 JavaOneSM Conference | Session BOF16-08
1
SOAについてみんなで考えよう
開発者視点のSOAとは?
SOAとWeb2.0の現状を知り、開発者視点
のSOAがどうあるべきかについて考えてみ
る
さらに、今使える技術で作ってみる
[明日からでもSOAしてみる]
2
Agenda With Section Highlights
SOAとは?Web2.0とは?
SOA as Web2.0 ?
開発者視点のSOAを実現する技術とは?
作ってみました
3
SOAとは?
1/5
• 歴史と背景
• サービス指向アーキテクチャ(Service Oriented Architecture)
• コンセプトは10年以上の歴史がある
• 過去のソフトウェア開発の問題をSOAですべてを解決できる(は
ず)
• SOAとは、依存レスなサービスを組み合わせてアプリケー
ションを構築する
• サービスは、プラットフォームに依存しない標準的でオープンな手
法で呼び出せる
4
SOAとは?
2/5
• 基本的な構造
①プロバイダがディレクトリサービ
スに登録を行う
②コンシューマがディレクトリサー
ビスに問い合わせてサービス
プロバイダを発見する
③コンシューマがプロバイダのサ
ービスを利用する
サービス・プロバイダ
ディレクトリ・サービス
①
③
②
サービス・コンシューマ
5
SOAとは?
3/5
• Webサービス
• SOAを実現するための1つの標準化された手法
•
•
•
•
UDDI ディレクトリサービス
WSDL API規約
SOAP 呼び出し
…
• 相互運用性を確保するためにHTTPを利用するのが一般的
6
SOAとは?
4/5
• ビジネスプロセス
• サービス同士の連携を管理する
• 長期ビジネスプロセスも管理
• BPEL(Business Process Execution
Language for Web Services)
• プロセス定義を標準化した言語の
1種
• EAI、BPMの延長
• モデラーやBPELエンジンが必要
7
SOAとは?
5/5
• ESB(Enterprise Service Bus)
• サービスがメッセージをやり取りする
ための伝送経路
• SOA版のMessage Broker
• ESBエンジンが必要
ESB
• JBI(Java Business Integration)
• ESBの標準化を狙ったもの
8
SOAとは? まとめ
• SOA
• 依存レスなサービスを組み合わせてアプリケーションを構築する
• 現在の主流
• EAI(Enterprise Application Integration)の延長線上
(Webサービスなどで標準化)
• BPEL/ESB製品を用意する
9
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 (日本語訳)
10
Tim’s Web2.0
1/4
• The Web As Platform
• never sold or packaged, but delivered as a service
• the long tail
ともかく広がりがある
11
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
みんなの知恵が集まる
12
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.
いろいろ使えるデータが重要
13
Tim’s Web2.0
4/4
• Users must be treated as co-developers
• Design for "hackability" and remixability
ユーザーがいろいろできる
14
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
15
SOA と Web2.0
• SOA
• 依存レスなサービスを組み合わせるアイデアはイイ!
• でも、EAIって言われるとあんまり関係ないなぁ
• Web2.0
• Web2.0的って、すごくイイ!
• 楽しそうに盛り上がっているけど、Javaは関係ないし、仕事で使
わないなぁ
• SOAとWeb2.0なんて、比べるも何も違うもの?
16
さて、ここからが本題です
17
SOA as Web2.0 ?
SOAとWeb2.0は
実はよく似ているのでは?
18
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/
19
BEA World 2005
• 標準規格やさまざまな「オープンな」コンポーネントで構成
されるSOA環境も、こうしたSunの視点から見ると
「Participation Infrastructure」(参加のためのインフラ)
と位置づけられ、だれもが「コンテントプロバイダー」として情
報を発信し、ネットワークで共有するためのツールとされる。
http://www.itmedia.co.jp/enterprise/articles/0509/29/news027.html
20
つまり本来のSOAとは
企業アプリでWeb2.0を
実現することなのでは?
21
SOA as Web2.0
• Web2.0の思想は企業アプリでも重要
• 過去には、BI、HRM、KM、EIPなどと呼ばれていたもの
• エンドユーザーコンピューティングともいえる
• SOAの理想は企業アプリで有効
• 依存レスなサービスを組み合わせてアプリを構築する
• 保守が容易で、組み替え可能で…
• その両者を組み合わせたものが開発者視点のSOAでは
• では、それを実現する技術は?
22
なぜSOAとWeb2.0が
違ってしまっているのかを
考えてみる
23
なぜSOAとWeb2.0は違うのか?
1/3
• 企業を確認
• SOA企業
• Web2.0企業
24
なぜSOAとWeb2.0は違うのか?
2/3
• SOA企業とWeb2.0企業ではビジネスモデルが違う
• SOA企業
• パッケージを買ってもらう
• 厚利少売
• Web2.0企業
• サービスをロングテールで提供
• 薄利多売
25
なぜSOAとWeb2.0は違うのか?
3/3
• SOA企業はSOAを商品先導型で扱った
• 「SOA的なシステムには、SOA製品を」
• EAIが中心なのは売上が大きいから
• そのため矛盾が生じてしまった(いる)
• 「SOAで非依存な世界を実現できます。だから、この製品に依
存してください」
• 結果、” SOA企業が定義したSOA”は、実体がつかみに
くく、盛り上がりにかけてしまったのではないだろうか?
26
では、この状況を変える
SOA as Web2.0実現の
具体的な技術は?
27
SOA as Web2.0 への技術
• 重要なのはロングテールを実現できること
• プロダクトの選択肢が広い(商用製品からオープンソース)
• 適用アプリケーションが広い(小さなアプリケーションからEAI)
• 今、使われている技術だけでは難しい
• SOA : BPEL、ESB、SOAP…
• Web2.0 :Ajax、XML、REST…
28
Dependency Injection
• DIは「アプリケーションレベルのSOA」である
• SOAとは、依存レスなサービスを組み合わせてアプリケーションを
構築すること
• DIとは、依存レスなコンポーネント(POJO)を組み合わせてアプ
リケーションを構築すること
• 大げさではなく、DIを使っていれば、SOAの理想を実現し
ているといえる
29
DIのスケーラビリティ
• 依存先のサービスがどこにいるか関
係ない
• 同VM内か
• BPEL/ESB/SOAP経由か
• Webサービスにもシームレスに結合
可能
• 逆に言えばDIを用いないで結合するの
はたいへん
DIコンテナ
ESB/BPEL
30
で、作ってみました。
DIを使った
SOA as Web2.0なサービス
31
マイ観光マップサービス「Meegle(めーぐる)」
• Meegleは、
• 自分で観光プランを決めたい観光客のために、
• 自分にあったサービスから観光マップを組み立てる
• 観光支援サイトです
※“みーぐる”じゃないよ
32
DEMO
33
Meegle概要(for 観光客)
• 観光客が自分達の情報を公開すると、それにあったサー
ビスが提供されます。あとは、気に入ったサービス結んで、
観光名所をめぐる地図(通称:めーぐるマップ)を作成する
だけです
• サービスの予約やキャンセルはめーぐるマップを通じてまとめ
て行われるため自分だけの観光マップを簡単に作ることが
出来ます
• ※レビュー機能やレコメンデーション機能が付加可能か
34
Meegle概要(for 観光名所)
• サービスプロバイダをMeegleにデプロイすることで、適切な
観光客にアプローチ可能です
• 観光名所がユーザーに合わせたサービスを動的に提供するため
のエージェント
• サービスプロバイダには様々なデプロイパターンを用意され
ているため、規模や予算に合わせて使い分け可能です
35
サービスプロバイダ
• 観光名所がユーザーに合
ったサービスを動的に提供
するためのエージェント
• Meegleはサービスプロバイ
ダの実行プラットフォーム
• DIによってデプロイパターン
を増やすことで、参加を多
様に
観光名所
観光名所
サービス
プロバイダ
サービス
プロバイダ
観光名所
サービス
プロバイダ
サービス
サービス
サービス
ユーザー
サービス
ユーザー
36
Meegle アーキテクチャ(UI)
地図の取得
XML
サービスの取得
予約
Ajax (Asynchronous JavaScript + XML )
37
Meegle アーキテクチャ(サーバ)
• JBI/DI上に構築
• ServiceMix (http://servicemix.org/)
• オープンソースのJBIコンテナ
• SpringFrameworkで構築
• 独自拡張で設定ファイル(servicemix.xml)に対応
• アーキテクチャ概略
• JBIのBC/SEは、Springにコンポーネント(bean)として登録
• コンポーネント間のメッセージング処理(NMR)をServiceMixが実
装
• ※WSDLへの依存はオプション(JBIの仕様からは外れる?)
38
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>
39
Meegle アーキテクチャ(JBI/DI)
同期メッセージ
非同期メッセージ
BindingServlet(サーブレット)
XML
①
②
httpBinding(HTTPのBindingComponent)
⑬
XML
⑫
③
asyncForwarder(非同期メッセージへの切り替えるためのダミーSE)
⑪
④
requestRouter/responseRouter(XPathのルーティングエンジン)
⑩
⑦
すべてのSPから
返信があったら
⑨
⑧
⑤
⑥
デプロイされた
サービスプロバイダ
findAggregator/reserveAggregator
(サービス取得や予約の取りまとめ)
40
サービスプロバイダ
• meegle.sp.MeegleSPを実装
• ServiceMixにデプロイするには専用インターフェースを実装する
必要があるので、 Meegleでアダプタを用意してラップ
org.servicemix.MessageExchangeListener
#onMessageExchange(javax.jbi.messaging.MessageExchange)
• デプロイパターンによる参加の多様性を確保
•
•
•
•
•
シンプルサービスプロバイダ
RDBサービスプロバイダ
設定サービスプロバイダ
外部サービスプロバイダ
DIサービスプロバイダ
41
meegle.sp.MeegleSP
public interface MeegleSP {
/** サービスのロード */
MeegleService[] getServices(Map condition);
/** 予約 */
ResultInfo reserve(ReserveInfo reserveServices);
/** 予約キャンセル */
ResultInfo cancel(ReserveInfo cancelInfo);
}
42
シンプルサービスプロバイダ
• 作成したサービスプロバイダを、そのままデプロイ
• シンプルで基本的な作り
43
シンプルサービスプロバイダ
<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 {
//その他
44
RDBサービスプロバイダ
• POJOサービスプロバイダとほぼ同じ
• ただし、Meegleが提供するリソース(今回は
DataSource)をインジェクトする
• Meegle上のリソースを利用することで追加コストをもらう
ビジネスモデルも可能か
• メール配送
• 決済サービス
• などなど
45
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}"/>
…
46
設定サービスプロバイダ
• 設定条件のクラスを提供し、簡単な設定のみでデプロイ
• 動的に文言を切り替えることはできないが、料金を安くで
きる可能性が高い
• 今回は人数によるフィルタリングを実装
• キーワードマッチなどなど
47
設定サービスプロバイダ
<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)"/>
48
外部Webサービスプロバイダ
• 外部接続SPを提供し、実際の処理は外部のサーバで実施
• 本格的な企業/自治体連携の場合に有効
• 今回はServiceMixのアウトバンド用BCを利用して、RESTで
別インスタンスのJBIに接続
• 接続形式は自由
49
外部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
①
XML
②
別サーバ
XML
④
XML
③
50
DIサービスプロバイダ
• デプロイするサービスの粒度を変更自在にするためのテク
ニック
• MeegleSPの実装を、複数のクラスをRemixして実現
• DIのコンポーネントを組み込みDIコンテナで設定
51
DIサービスプロバイダ
• DIコンテナとして基本的な動きをおさらい
ServiMix/Spring
mailResource
interface MeegleSP
2.Inject
1.生成
設定
class DiSP impelemtns MeegleSP
この中を見ると…
52
mailResource
DIサービスプロバイダ
2.Inject
3.動的コンテナに登録
動的コンテナ
mailResource
6.親コンテナのmailResourceを
lookupしてbeanにInject
7.サービス
検索処理Call
8. サービス検索beanを
lookupして処理を実施
組み込みコンテナ
サービス検索
設定
4.組み込みコンテナ
を生成
(動的コンテナを
親コンテナに指定)
5.Beanを生成
予約/キャンセル
53
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);
}
…
54
DIサービス/DiSP
Public 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);
}
…(次のページへ)
55
DIサービス/DiSP
Public 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);
}
56
Summary
• SOAとWeb2.0
• SOAは依存レスなサービスの組み合わせ
• Web2.0的であればWeb2.0
• 開発者視点のSOAとは、企業システムでWeb2.0的
を実現すること
• まずはアプリケーションでSOAを実現する
• DIをうまく使うと、自然にサービスを組み合わせたような、
ロングテールなアプリケーションができる
• しかも、Webサービスに拡張も可能
57
Q&A
58
ダウンロード

SOA as [email protected] Tokyoe 2005講演資料