使用Servicemix(ESB)發(fā)布一個外部的WebService_第1頁
使用Servicemix(ESB)發(fā)布一個外部的WebService_第2頁
使用Servicemix(ESB)發(fā)布一個外部的WebService_第3頁
使用Servicemix(ESB)發(fā)布一個外部的WebService_第4頁
使用Servicemix(ESB)發(fā)布一個外部的WebService_第5頁
已閱讀5頁,還剩44頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、首先我們需要了解一下相關概念,什么SOA,什么是ESB 面向服務的體系結構(Service-Oriented Architecture,SOA)是一個組件模型,它將應用程序的不同功能單元(稱為服務)通過這些服務之間定義良好的接口和契約聯(lián)系起來。接口是采用中立的方式進行定義的,它應該獨立于實現(xiàn)服務的硬件平臺、操作系統(tǒng)和編程語言。這使得構建在各種這樣的系統(tǒng)中的服務可以一種統(tǒng)一和通用的方式進行交互。這是完整的定義:1 是一個組件模型2 不同功能單元,稱為服務3 服務之間通過接口和約定聯(lián)系起來4 接口是中立的 ESB全稱為Enterprise Service Bus,即企業(yè)服務總線

2、。它是傳統(tǒng)中間件技術與XML、Web服務等技術結合的產(chǎn)物。ESB提供了網(wǎng)絡中最基本的連接中樞,是構筑企業(yè)神經(jīng)系統(tǒng)的必要元素。ESB的出現(xiàn)改變了傳統(tǒng)的軟件架構,可以提供比傳統(tǒng)中間件產(chǎn)品更為廉價的解決方案,同時它還可以消除不同應用之間的技術差異,讓不同的應用服務器協(xié)調運作,實現(xiàn)了不同服務之間的通信與整合。從功能上看,ESB提供了事 件驅動和文檔導向的處理模式,以及分布式的運行管理機制,它支持基于內容的路由和過濾,具備了復雜數(shù)據(jù)的傳輸能力,并可以提供一系列的標準接口。 Servicemix是什么?Servicemix是apache發(fā)布的一種ESB。參考官方頁http:/servicemix

3、. Servicemix上服務的實現(xiàn) Servicemix上可以直接發(fā)布Webservice和POJOs之類的程序或者模塊,也可以發(fā)布一個類似于代理的服務。從流程上來說:Servicemix使用consumer接受到客戶request,在Servicemix的服務列表中尋找服務,并且發(fā)布一個EndPoint,然后再provider中發(fā)布一個指向目標service的服務。 Service Unit  和  Service Assembly如字面意思,service unit就是一個一個的服務單元,而service assembly是這些

4、單元的集合在servicemix上發(fā)布一項服務,其實是發(fā)布一個服務集(SA),在這個集合中,可能存在一個或者多個服務(SU)例如,我們有一個服務需要順序使用兩個webservice,那個我們可以定義兩個SU分別對應不同的webservice,然后使用一個SA將這兩個SU統(tǒng)合起來這樣,我們就可以調用一個暴露在外面的服務(該SA的服務),來達到使用兩個webservice的目的 本文的目標我們的目標是讓Servicemix充當一個Proxy,即將一個外部的WebService發(fā)布到ServiceMix服務當中。使得客戶可以通過調用暴露在外面的Servicemix的服務端口來調用實際上在其

5、他服務器上的 WebService。 實現(xiàn)這個目標,可以通過兩種組件完成。1,Servicemix-Http-bc2,Servicemix-CXF-bc Http-bc的優(yōu)點是使用范圍非常的廣,缺點是使用非常麻煩。也就是說大多數(shù)組件都要我們自己定義。Cxf-bc的優(yōu)點是比較簡單。這個組件本身集成了對現(xiàn)有大多數(shù)Soap/Http形式的支持,對于沒有特定要求的使用來說是足夠了。 順便一提Http-se和Cxf-se,這兩個是相對于上面兩個而言的,這兩個是服務引擎,對象一般是實際的Class或者Application Servicemix的教程參考:http:

6、//tutorials.htmlCXF教程參考:/4- beginner-web-services-with-servicemix-and-cxf.html 本文使用CXF-bc來實現(xiàn),參考:/servicemix-cxf- bc.html 所需工具:apache-Servicemix-3.2.2 release (據(jù)官方說,開源變化很大,最新的比較完備,至少需要3.2以上版本)http:/servicemix.apache.

7、org/download.htmlapache-Maven 2.0以上版本/download.htmlJDK1.5以上版本apache-axis2/axis2/download.cgiapache-tomcatapache eclipse wsdl 插件(Service Archive Wizard - Eclipse Plug-in,Code Generator Wizard - Eclipse Plug-in等)/axis2/tools/index.html 示

8、例:1,安裝好JDK,并且配置好JDK的環(huán)境變量 2,安裝好Maven,并且配置好Maven的環(huán)境變量        環(huán)境變量:        M2_HOME :                       

9、;      解壓Maven的目錄        M2:                        ;           &

10、#160;         &nbs p;M2_HOME%/bin        MAVEN_OPTS :                       - Xms256m -Xmx512m  

11、      Path:                        ;                    %M2%

12、 3,安裝好Servicemix        測試:在CMD下,Servciemix安裝目錄下        運行              cd bin            

13、servicemix        則服務器啟動        在http:/localhost:8192/可以看到服務器已經(jīng)在運行。 4,安裝好Tomcat,并且配置好環(huán)境變量 5,安裝好Axis2,并且配置好環(huán)境變量            注:這里可以使用簡單方式,下載Axis2的war包,直接

14、發(fā)布到Tomcat中就可以。             測試:http:/localhost:8080/下檢查新添加的Axis2服務 6,將Service Archive Wizard - Eclipse Plug-in等插件裝進Eclipse            注:這些插件不是必要的,僅僅可以使工作變得簡單一些。 7,打開E

15、clipse并新建動態(tài)Web工程(Eclipse需要WTP插件)          輸入Project名字HelloWorld,然后點擊finish 8,在新建的工程中添加class        在新建的project的src中添加一個package        package名字為sample  

16、60;       在該包中添加一個class         Class的名字為Hello,點擊Finish         修改java文件的內容如下。  9,生成wsdl文件        這里可以用Code Generator Wizard

17、- Eclipse Plug-in插件生成,也可以用其他插件生成,差別不大          以上兩種方法都可以,第二種只要按照提示來就可以了,分別是選擇class,選擇生成路徑        下面說第一種方法          注:這里如果想測試的話,就把左上條子拉到頂,點擊finish  

18、60;       測試:點擊Operations中剛剛發(fā)布Say          輸入World,看到返回值正常 10,發(fā)布webservice        發(fā)布WebService有很多種方式,可以把它直接發(fā)布Tomcat中,也可以利用Axis來發(fā)布       

19、; 我們使用Axis2來發(fā)布        注意,我們要發(fā)布到Axis2中,所以我們service的address就變了,這里需要根據(jù)實際發(fā)布地址進 行修改         例如本示例修改如上1. <wsdlsoap:address location="http:/localhost:8080/axis2/services/HelloService"/>  

20、;      使用插件Service Archive Wizard - Eclipse Plug-in          點擊Next,然后選擇Class文件的路徑          點擊Next,選擇我們剛剛發(fā)布的wsdl         

21、0;點擊Next,然后來選擇必要的jar包。          點擊Next,勾選自動生成Service.xml          點擊Next,填選Class          點擊Next,填寫發(fā)布路徑        

22、;  點擊Finish,則在目標路徑生成aar文件         將生成的aar文件復制到%Tomcat%/webapps/axis2/WEB-INF/services下,或者在axis2的admin頁面添 加該aar文件          默認的用戶名是admin,密碼是axis2        

23、0; 點擊Upload Service          將剛剛生成的wsdl發(fā)布          發(fā)布成功后,就可以在Service中找到剛剛發(fā)布HelloService          點擊HelloService,我們就可以看到這個服務的具體內容,就是我們剛剛發(fā)布wsdl。

24、60;       至此,我們成功地發(fā)布了一個webservice *以上示例使用的是POJOs形式發(fā)布。 11,運行Servicemix         運行cmd,然后啟動servicemix服務          等待服務完全開啟。       

25、;   當啟動成功之后。我們就可以在JDK的控制臺看到關于ServiceMix的服務信息        運行  %JDK%/bin/jconsole.exe          則我們可以找到servicemix的服務已經(jīng)開啟          點擊連接,則我們可以看到servic

26、emix中的所有信息,包括所有的操作及消息隊列等等,在此不多述。 12,新建一個Servicemix的組件        我們的目的是WebService,所以我們建一個Cxf-bc的組件        在任意路徑下建一個項目工程的目錄,示例建立的是D:/CXFHello        運行cmd,進入該目錄   &#

27、160;    鍵入1. mvn archetype:create -DarchetypeGroupId=org.apache.servicemix.tooling -DarchetypeArtifactId=servicemix- project-root -DgroupId=org.apache.servicemix.tutorial -DartifactId=tutorial-wsdl-cxf-service       

28、0;用來創(chuàng)建一個標準的pom.xml        在這個pom.xml中,對于一些基本的工程配置作了設定          在我們成功建立了之后,會發(fā)現(xiàn)CXFHello文件夾下面多出了一個路徑        則我們在這個新建的路徑下面運行1. mvn install     &

29、#160;   至此,我們已經(jīng)將這個新建的工程發(fā)布到我們的本地 Maven repository 中         下面我們建立一個CXF-BC Service Unit        在我們剛才建立的工程文件夾下面,運行1. mvn archetype:create -DarchetypeGroupId=org.apache.servicemix.tooling 

30、-DarchetypeArtifactId=servicemix- cxf-bc-service-unit -DgroupId=org.apache.servicemix.examples -DartifactId=my-cxf-bc-su        用來創(chuàng)建一個標準的CXF-BC-SU組件         至此,我們建議了一個標準的CXF-BC-SU組件的框子   

31、60;            現(xiàn)在進入新建的組件的文件夾。        我們看到一個pom.xml文件,這個是對這個組件進行配置的一個文件。        打開,我們可以看到詳細內容        現(xiàn)在我們修改這個組件的名字 &

32、#160;      將<name>A Cxf BC Service Unit</name>        改成<name>Cxf-Hello-SU</name> 然后我們需要將我們發(fā)布在Axis2上的Webservice的wsdl復制下來放入servicemix這個bc組建之中。         關于wsdl

33、文件            打開wsdl文件,我們可以發(fā)現(xiàn),wsdl其實定義了webservice的所有規(guī)范,例如它的名字,接 口,方法,參數(shù)等等            而我們需要將wsdl復制到我們要發(fā)布的servicemix當中,是因為我們暴露出去的接口,方法, 參數(shù)等要能和實際服務的webservice一致。所以servicemix當中需要一個由同樣接

34、口定義的wsdl文件         訪問  http:/localhost:8080/axis2/services/HelloService?wsdl                得到我們剛才發(fā)布的webservice的wsdl文件        

35、0; 將這個wsdl文件復制到%/my-cxf-bc-su/src/main/resources  下        其實這里原本就預訂了一個wsdl文件的位置。        注意,我的wsdl名字叫做Hello.wsdl,因此,當復制過來后,原來的service.wsdl就可以刪除了        當然,我們也可以把剛才ecilpse

36、項目中生成的wsdl復制過來,這是一樣的文件                現(xiàn)在我們需要修改這個復制進來的wsdl文件        將webservice服務定義作如下替換1.    <wsdl:service name="HelloServiceProxy"> 2.3.  

37、     <wsdl:port binding="impl:HelloSoapBinding" name="HelloProxy"> 4.5.          <wsdlsoap:address location="http:/localhost:8193/HelloWorld/"/> 6.7.     

38、;  </wsdl:port> 8.9.    </wsdl:service>        結果如下圖         現(xiàn)在我們已經(jīng)完成了對wsdl的設定,現(xiàn)在我們需要在xbean.xml設定consumer和provider來幫定這些東西。        打開xbean.

39、xml,作如下修改            首先,我們需要一個namespace,這個namespace要和我們引用的wsdl中的service和 endpoint的namespace一致,這樣我們才能準確找到service和接口            我們的wsdl定義的targetNamespace="http:/sample"

40、0;           所以我們bc組件中的consumer和provider定義的namespace也必須和上面一樣         現(xiàn)在來定義consumer和provider,基本的定義規(guī)則參照:/servicemix-cxf-bc.html        

41、 則最終修改好的文件如下          注:這里采用輕量級模式,即,將consumer和provider寫在一個service unit內,如果想在中間加入其它程序,則可以將 consumer和provider分成兩個service unit                這樣service unit就建好了,接下來我們建立

42、service assembly         在我們的工程路目下運行1. mvn archetype:create -DarchetypeGroupId=org.apache.servicemix.tooling -DarchetypeArtifactId=servicemix- service-assembly -DgroupId=org.apache.servicemix.examples -DartifactId=my-cxf-sa  

43、       現(xiàn)在可以看到工程目錄中新建出來了SA的文件夾        同樣,我們修改一個名字        <name>Cxf-Hello-SA</name>         接下來,我們要在這個SA中注冊我們剛才制作的SU1.   

44、; 2.  <dependencies> 3.     <dependency> 4.       <groupId>org.apache.servicemix.examples</groupId> 5.       <artifactId>my-cxf-bc-su</artifactId> 6.      

45、; <version>1.0-SNAPSHOT</version> 7.     </dependency> 8.   </dependencies> 9.         好了現(xiàn)在一切就緒,我們在工程目錄下面運行1. mvn install        就可以建立好組件了   

46、      在build successful之后,我們就可以在        %/my-cxf-sa/target        目錄下面看到我們建立好的jar包          將這個jar包復制到servicemix目錄下面的/hotdeploy文件夾,來正式發(fā)布到ser

47、vicemix當中          如此一來,我們就成功的發(fā)布了一個服務到servicemix上                下面讓我們來檢測一下成果        建立一個客戶端html如下 1. <html> 2. <hea

48、d> 3. <title>ServiceMix WSDL -First Example</title> 4. <script type="text/javascript"> 5. var urlToOpen = "http:/localhost:8193/HelloWorld/" /default URL to open 6.7. function getHTTPObject()  8. 

49、60; var xmlhttp = false; 9.10.   /* Compilation conditionnelle d'IE */ 11.   /*cc_on 12.   if (_jscript_version >= 5) 13.      try  14.        

50、 xmlhttp = new ActiveXObject ("Msxml2.XMLHTTP"); 15.       catch (e)  16.         try  17.            xmlhttp = new 

51、;ActiveXObject ("Microsoft.XMLHTTP"); 18.          catch (E)  19.            xmlhttp = false; 20.          21.    &

52、#160;  22.   else 23.      xmlhttp = false; 24.   end */ 25.26.   /* on essaie de créer l'objet si ce n'est pas déjà&nb sp;fait */ 27.  &#

53、160;if (!xmlhttp && typeof XMLHttpRequest != 'undefined')  28.      try  29.         xmlhttp = new XMLHttpRequest (); 30.       catch&

54、#160;(e)  31.         xmlhttp = false; 32.       33.    34.35.   if (xmlhttp)  36.      /* on définit ce qui doit se passer&#

55、160;quand&nbs p;la page répondra */ 37.      xmlhttp.onreadystatechange=function()  38.         if (xmlhttp.readyState = 4)   /* 4 : état "complete&quo

56、t; */ 39.            var response = document.getElementById ("response"); 40.            var responseStatus = "" 41.    

57、        try  42.              responseStatus = xmlhttp.status + "" 43.             catch (e)

58、60; 44.              responseStatus = "ERROR WHILE RETRIEVING STATUS; MAYBE UNABLE TO CONNECT." 45.             46.  

59、60;         response.value = "STATUS: " + responseStatus + "/n" + xmlhttp.responseText; 47.          48.       49.  

60、0; 50.   return xmlhttp; 51. 52.53. function send()  54.   if (document.getElementById("urlToOpen").value != urlToOpen) &&  (document.getElementById("urlToOpen").value != "")  55.  &

61、#160;  /use user entry only if it at least can be oka y 56.     urlToOpen = document.getElementById("urlToOpen").value; 57.      58.   var xmlhttp = getHTT

62、PObject(); 59.   if (!xmlhttp)  60.     alert('cound not create XMLHttpRequest object'); 61.     return; 62.    63.   var request = document.getElementById("request");

63、 64.   var response = document.getElementById("response"); 65.   try  66.     netscape.security.PrivilegeManager.enablePrivilege ("UniversalBrowserRead UniversalBrowserWrite"); 67.    catch (e)&#

64、160; 68.    69.   try  70.     xmlhttp.open("POST", urlToOpen, true); 71.    catch (e)  72.     alert('error opening'); 73.    74.   xmlhttp.send(request.val

65、ue); 75. 76. </script> 77. </head> 78.79. <body> 80.81. <h1>ServiceMix CXF example</h1> 82.83. <p>Welcome to the CXF example for ServiceMix</p> 84.85. <p>Perform a POST into the HTTP binding. This requires JavaScr ipt.</p>  86. <p>Target: <input type="text" size="50&quo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論