2005 javaonesm conference | session bof16-08

58
1 2005 JavaOne SM 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

Upload: zubin67

Post on 13-Jun-2015

449 views

Category:

Documents


7 download

TRANSCRIPT

Page 1: 2005 JavaOneSM Conference | Session BOF16-08

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

Page 2: 2005 JavaOneSM Conference | Session BOF16-08

2

SOA と Web2.0 の現状を知り、開発者視点の SOA がどうあるべきかについて考えてみる

さらに、今使える技術で作ってみる[ 明日からでも SOA してみる ]

開発者視点の SOA とは?SOA についてみんなで考えよう

Page 3: 2005 JavaOneSM Conference | Session BOF16-08

3

Agenda With Section Highlights

SOA とは? Web2.0 とは?SOA as Web2.0 ?開発者視点の SOA を実現する技術とは?作ってみました

Page 4: 2005 JavaOneSM Conference | Session BOF16-08

4

SOA とは? 1/5

• 歴史と背景• サービス指向アーキテクチャ( Service Oriented

Architecture )• コンセプトは 10 年以上の歴史がある• 過去のソフトウェア開発の問題を SOA ですべてを解

決できる(はず)• SOA とは、依存レスなサービスを組み合わせて

アプリケーションを構築する• サービスは、プラットフォームに依存しない標準的で

オープンな手法で呼び出せる

Page 5: 2005 JavaOneSM Conference | Session BOF16-08

5

SOA とは? 2/5

• 基本的な構造①プロバイダがディレク

トリサービスに登録を行う

②コンシューマがディレクトリサービスに問い合わせてサービスプロバイダを発見する

③コンシューマがプロバイダのサービスを利用する

サービス・プロバイダ

サービス・コンシューマ

ディレクトリ・サービス①

Page 6: 2005 JavaOneSM Conference | Session BOF16-08

6

SOA とは? 3/5

• Web サービス• SOA を実現するための1つの標準化された手法

• UDDI  ディレクトリサービス• WSDL   API 規約• SOAP  呼び出し• …

• 相互運用性を確保するために HTTP を利用するのが一般的

Page 7: 2005 JavaOneSM Conference | Session BOF16-08

7

SOA とは? 4/5

• ビジネスプロセス• サービス同士の連携を管理す

る• 長期ビジネスプロセスも管理

• BPEL ( Business Process Execution Language for Web Services )• プロセス定義を標準化した言

語の1種• EAI 、 BPM の延長• モデラーや BPEL エンジンが

必要

Page 8: 2005 JavaOneSM Conference | Session BOF16-08

8

SOA とは? 5/5

• ESB ( Enterprise Service Bus )• サービスがメッセージをやり

取りするための伝送経路• SOA 版の Message Broker• ESB エンジンが必要

• JBI ( Java Business Integration )• ESB の標準化を狙ったもの

ESB

Page 9: 2005 JavaOneSM Conference | Session BOF16-08

9

SOA とは? まとめ

• SOA• 依存レスなサービスを組み合わせてアプリケーション

を構築する• 現在の主流

• EAI ( Enterprise Application Integration )の延長線上( Web サービスなどで標準化)

• BPEL/ESB 製品を用意する

Page 10: 2005 JavaOneSM Conference | Session BOF16-08

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  (日本語訳)

Page 11: 2005 JavaOneSM Conference | Session BOF16-08

11

Tim’s Web2.0 1/4

• The Web As Platform• never sold or packaged, but delivered as a service • the long tail

ともかく広がりがある

Page 12: 2005 JavaOneSM Conference | Session BOF16-08

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

みんなの知恵が集まる

Page 13: 2005 JavaOneSM Conference | Session BOF16-08

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.

いろいろ使えるデータが重要 

Page 14: 2005 JavaOneSM Conference | Session BOF16-08

14

Tim’s Web2.0 4/4

• Users must be treated as co-developers • Design for "hackability" and remixability

ユーザーがいろいろできる

Page 15: 2005 JavaOneSM Conference | Session BOF16-08

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

Page 16: 2005 JavaOneSM Conference | Session BOF16-08

16

SOA と Web2.0

• SOA• 依存レスなサービスを組み合わせるアイデアはイイ !• でも、 EAI って言われるとあんまり関係ないなぁ

• Web2.0• Web2.0 的って、すごくイイ!• 楽しそうに盛り上がっているけど、 Java は関係ない

し、仕事で使わないなぁ

• SOA と Web2.0 なんて、比べるも何も違うもの?

Page 17: 2005 JavaOneSM Conference | Session BOF16-08

17

さて、ここからが本題です

Page 18: 2005 JavaOneSM Conference | Session BOF16-08

18

SOA as Web2.0 ?

SOA と Web2.0 は実はよく似ているのでは?

Page 19: 2005 JavaOneSM Conference | Session BOF16-08

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/

Page 20: 2005 JavaOneSM Conference | Session BOF16-08

20

BEA World 2005

• 標準規格やさまざまな「オープンな」コンポーネントで構成される SOA 環境も、こうした Sun の視点から見ると「 Participation Infrastructure 」(参加のためのインフラ)と位置づけられ、だれもが「コンテントプロバイダー」として情報を発信し、ネットワークで共有するためのツールとされる。

http://www.itmedia.co.jp/enterprise/articles/0509/29/news027.html

Page 21: 2005 JavaOneSM Conference | Session BOF16-08

21

つまり本来の SOA とは

企業アプリで Web2.0 を

実現することなのでは?

Page 22: 2005 JavaOneSM Conference | Session BOF16-08

22

SOA as Web2.0

• Web2.0 の思想は企業アプリでも重要• 過去には、 BI 、 HRM 、 KM 、 EIP などと呼ばれていたも

の• エンドユーザーコンピューティングともいえる

• SOA の理想は企業アプリで有効• 依存レスなサービスを組み合わせてアプリを構築する• 保守が容易で、組み替え可能で…

• その両者を組み合わせたものが開発者視点の SOAでは

• では、それを実現する技術は?

Page 23: 2005 JavaOneSM Conference | Session BOF16-08

23

なぜ SOA と Web2.0 が違ってしまっているのかを

考えてみる

Page 24: 2005 JavaOneSM Conference | Session BOF16-08

24

なぜ SOA と Web2.0 は違うのか? 1/3

• 企業を確認• SOA企業

• Web2.0企業

Page 25: 2005 JavaOneSM Conference | Session BOF16-08

25

なぜ SOA と Web2.0 は違うのか? 2/3

• SOA企業と Web2.0企業ではビジネスモデルが違う

• SOA企業• パッケージを買ってもらう• 厚利少売

• Web2.0企業• サービスをロングテールで提供• 薄利多売

Page 26: 2005 JavaOneSM Conference | Session BOF16-08

26

なぜ SOA と Web2.0 は違うのか? 3/3

• SOA企業は SOA を商品先導型で扱った• 「 SOA 的なシステムには、 SOA 製品を」• EAI が中心なのは売上が大きいから

• そのため矛盾が生じてしまった(いる)• 「 SOA で非依存な世界を実現できます。だから、この

製品に依存してください」

• 結果、” SOA企業が定義した SOA” は、実体がつかみにくく、盛り上がりにかけてしまったのではないだろうか?

Page 27: 2005 JavaOneSM Conference | Session BOF16-08

27

では、この状況を変える

SOA as Web2.0 実現の

具体的な技術は?

Page 28: 2005 JavaOneSM Conference | Session BOF16-08

28

SOA as Web2.0 への技術

• 重要なのはロングテールを実現できること• プロダクトの選択肢が広い(商用製品からオープンソ

ース)• 適用アプリケーションが広い(小さなアプリケーショ

ンから EAI )

• 今、使われている技術だけでは難しい• SOA : BPEL 、 ESB 、 SOAP…• Web2.0 : Ajax 、 XML 、 REST…

Page 29: 2005 JavaOneSM Conference | Session BOF16-08

29

Dependency Injection

• DI は「アプリケーションレベルの SOA 」である• SOA とは、依存レスなサービスを組み合わせてアプ

リケーションを構築すること• DI とは、依存レスなコンポーネント( POJO )を組

み合わせてアプリケーションを構築すること

• 大げさではなく、 DI を使っていれば、 SOA の理想を実現しているといえる

Page 30: 2005 JavaOneSM Conference | Session BOF16-08

30

DI のスケーラビリティ

• 依存先のサービスがどこにいるか関係ない• 同 VM内か• BPEL/ESB/SOAP 経由か

• Web サービスにもシームレスに結合可能• 逆に言えば DI を用いないで結合

するのはたいへんESB/BPEL

DI コンテナ

Page 31: 2005 JavaOneSM Conference | Session BOF16-08

31

で、作ってみました。

DI を使ったSOA as Web2.0 なサービス

Page 32: 2005 JavaOneSM Conference | Session BOF16-08

32

マイ観光マップサービス「 Meegle(めーぐる)」

• Meegle は、• 自分で観光プランを決めたい観光客のために、• 自分にあったサービスから観光マップを組み立て

る• 観光支援サイトです

※“ みーぐる” じゃないよ

Page 33: 2005 JavaOneSM Conference | Session BOF16-08

33

DEMO

Page 34: 2005 JavaOneSM Conference | Session BOF16-08

34

• 観光客が自分達の情報を公開すると、それにあったサービスが提供されます。あとは、気に入ったサービス結んで、観光名所をめぐる地図(通称:めーぐるマップ)を作成するだけです

• サービスの予約やキャンセルはめーぐるマップを通じてまとめて行われるため自分だけの観光マップを簡単に作ることが出来ます

• ※レビュー機能やレコメンデーション機能が付加可能か

Meegle概要( for 観光客)

Page 35: 2005 JavaOneSM Conference | Session BOF16-08

35

• サービスプロバイダを Meegle にデプロイすることで、適切な観光客にアプローチ可能です• 観光名所がユーザーに合わせたサービスを動的に提供

するためのエージェント

• サービスプロバイダには様々なデプロイパターンを用意されているため、規模や予算に合わせて使い分け可能です

Meegle概要( for 観光名所)

Page 36: 2005 JavaOneSM Conference | Session BOF16-08

36

サービスプロバイダ

• 観光名所がユーザーに合ったサービスを動的に提供するためのエージェント

• Meegle はサービスプロバイダの実行プラットフォーム• DI によってデプロイパ

ターンを増やすことで、参加を多様に

サービス

観光名所

ユーザー ユーザー

サービス サービス

サービス

観光名所 観光名所

サービスプロバイダ

サービスプロバイダ サービス

プロバイダ

Page 37: 2005 JavaOneSM Conference | Session BOF16-08

37

Meegle アーキテクチャ( UI )

地図の取得サービスの取得予約

Ajax   (Asynchronous JavaScript + XML )

XML

Page 38: 2005 JavaOneSM Conference | Session BOF16-08

38

Meegle アーキテクチャ(サーバ)

• JBI/DI 上に構築• ServiceMix  ( http://servicemix.org/ )

• オープンソースの JBI コンテナ• SpringFramework で構築

• 独自拡張で設定ファイル( servicemix.xml )に対応• アーキテクチャ概略

• JBI の BC/SE は、 Spring にコンポーネント( bean )として登録

• コンポーネント間のメッセージング処理( NMR )をServiceMix が実装

• ※WSDLへの依存はオプション( JBI の仕様からは外れる?)

Page 39: 2005 JavaOneSM Conference | Session BOF16-08

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>

Page 40: 2005 JavaOneSM Conference | Session BOF16-08

40

Meegle アーキテクチャ( JBI/DI )

httpBinding(HTTP の BindingComponent)

asyncForwarder(非同期メッセージへの切り替えるためのダミー SE)

requestRouter/responseRouter ( XPath のルーティングエンジン)

findAggregator/reserveAggregator(サービス取得や予約の取りまとめ)

① ②

⑦⑧

デプロイされたサービスプロバイダ

同期メッセージ非同期メッセージ

XML

XML ⑫

BindingServlet( サーブレット )

すべての SP から返信があったら

Page 41: 2005 JavaOneSM Conference | Session BOF16-08

41

サービスプロバイダ

• meegle.sp.MeegleSP を実装• ServiceMix にデプロイするには専用インターフェース

を実装する必要があるので、 Meegle でアダプタを用意してラップ

org.servicemix.MessageExchangeListener#onMessageExchange(javax.jbi.messaging.MessageExchange)

• デプロイパターンによる参加の多様性を確保• シンプルサービスプロバイダ• RDB サービスプロバイダ• 設定サービスプロバイダ• 外部サービスプロバイダ• DI サービスプロバイダ

Page 42: 2005 JavaOneSM Conference | Session BOF16-08

42

meegle.sp.MeegleSPpublic interface MeegleSP { /** サービスのロード */ MeegleService[] getServices(Map condition);

/** 予約 */ ResultInfo reserve(ReserveInfo reserveServices); /** 予約キャンセル */ ResultInfo cancel(ReserveInfo cancelInfo);}

Page 43: 2005 JavaOneSM Conference | Session BOF16-08

43

シンプルサービスプロバイダ

• 作成したサービスプロバイダを、そのままデプロイ

• シンプルで基本的な作り

Page 44: 2005 JavaOneSM Conference | Session BOF16-08

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 { // その他

Page 45: 2005 JavaOneSM Conference | Session BOF16-08

45

RDB サービスプロバイダ

• POJO サービスプロバイダとほぼ同じ• ただし、 Meegle が提供するリソース(今回は

DataSource )をインジェクトする• Meegle 上のリソースを利用することで追加コス

トをもらうビジネスモデルも可能か• メール配送• 決済サービス• などなど

Page 46: 2005 JavaOneSM Conference | Session BOF16-08

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}"/> …

Page 47: 2005 JavaOneSM Conference | Session BOF16-08

47

設定サービスプロバイダ

• 設定条件のクラスを提供し、簡単な設定のみでデプロイ

• 動的に文言を切り替えることはできないが、料金を安くできる可能性が高い• 今回は人数によるフィルタリングを実装• キーワードマッチなどなど

Page 48: 2005 JavaOneSM Conference | Session BOF16-08

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)"/>

Page 49: 2005 JavaOneSM Conference | Session BOF16-08

49

外部Web サービスプロバイダ

• 外部接続 SP を提供し、実際の処理は外部のサーバで実施

• 本格的な企業 /自治体連携の場合に有効• 今回は ServiceMix のアウトバンド用 BC を利用して、

REST で別インスタンスの JBI に接続• 接続形式は自由

Page 50: 2005 JavaOneSM Conference | Session BOF16-08

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②

③④

別サーバ

Page 51: 2005 JavaOneSM Conference | Session BOF16-08

51

DI サービスプロバイダ

• デプロイするサービスの粒度を変更自在にするためのテクニック

• MeegleSP の実装を、複数のクラスを Remix して実現

• DI のコンポーネントを組み込み DI コンテナで設定

Page 52: 2005 JavaOneSM Conference | Session BOF16-08

52

• DI コンテナとして基本的な動きをおさらい

DI サービスプロバイダ

ServiMix/Spring

interface MeegleSP

class DiSP impelemtns MeegleSP

mailResource

2.Inject

設定1.生成

この中を見ると…

Page 53: 2005 JavaOneSM Conference | Session BOF16-08

53

DI サービスプロバイダmailResource

2.Inject

動的コンテナ

3.動的コンテナに登録

mailResource

組み込みコンテナ

サービス検索

予約 / キャンセル

4. 組み込みコンテナを生成(動的コンテナを親コンテナに指定)

6.親コンテナの mailResource をlookup して bean に Inject

7. サービス検索処理 Call

8. サービス検索 bean をlookup して処理を実施

設定

5.Bean を生成

Page 54: 2005 JavaOneSM Conference | Session BOF16-08

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); }

Page 55: 2005 JavaOneSM Conference | Session BOF16-08

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); }

… (次のページへ)

Page 56: 2005 JavaOneSM Conference | Session BOF16-08

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); }

Page 57: 2005 JavaOneSM Conference | Session BOF16-08

57

Summary

• SOA と Web2.0• SOA は依存レスなサービスの組み合わせ• Web2.0 的であればWeb2.0

• 開発者視点の SOA とは、企業システムでWeb2.0 的を実現すること

• まずはアプリケーションで SOA を実現する• DI をうまく使うと、自然にサービスを組み合わせた

ような、ロングテールなアプリケーションができる• しかも、 Web サービスに拡張も可能

Page 58: 2005 JavaOneSM Conference | Session BOF16-08

58

Q&A