使用Servicemix(ESB)发布一个外部的WebService_第1页
使用Servicemix(ESB)发布一个外部的WebService_第2页
使用Servicemix(ESB)发布一个外部的WebService_第3页
使用Servicemix(ESB)发布一个外部的WebService_第4页
使用Servicemix(ESB)发布一个外部的WebService_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、首先我们需要了解一下相关概念,什么SOA,什么是ESB 面向服务的体系结构(Service-Oriented Architecture,SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以一种统一和通用的方式进行交互。这是完整的定义:1 是一个组件模型2 不同功能单元,称为服务3 服务之间通过接口和约定联系起来4 接口是中立的 ESB全称为Enterprise Service Bus,即企业服务总线

2、。它是传统中间件技术与XML、Web服务等技术结合的产物。ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素。ESB的出现改变了传统的软件架构,可以提供比传统中间件产品更为廉价的解决方案,同时它还可以消除不同应用之间的技术差异,让不同的应用服务器协调运作,实现了不同服务之间的通信与整合。从功能上看,ESB提供了事 件驱动和文档导向的处理模式,以及分布式的运行管理机制,它支持基于内容的路由和过滤,具备了复杂数据的传输能力,并可以提供一系列的标准接口。 Servicemix是什么?Servicemix是apache发布的一种ESB。参考官方页http:/servicemix

3、. Servicemix上服务的实现 Servicemix上可以直接发布Webservice和POJOs之类的程序或者模块,也可以发布一个类似于代理的服务。从流程上来说:Servicemix使用consumer接受到客户request,在Servicemix的服务列表中寻找服务,并且发布一个EndPoint,然后再provider中发布一个指向目标service的服务。 Service Unit  和  Service Assembly如字面意思,service unit就是一个一个的服务单元,而service assembly是这些

4、单元的集合在servicemix上发布一项服务,其实是发布一个服务集(SA),在这个集合中,可能存在一个或者多个服务(SU)例如,我们有一个服务需要顺序使用两个webservice,那个我们可以定义两个SU分别对应不同的webservice,然后使用一个SA将这两个SU统合起来这样,我们就可以调用一个暴露在外面的服务(该SA的服务),来达到使用两个webservice的目的 本文的目标我们的目标是让Servicemix充当一个Proxy,即将一个外部的WebService发布到ServiceMix服务当中。使得客户可以通过调用暴露在外面的Servicemix的服务端口来调用实际上在其

5、他服务器上的 WebService。 实现这个目标,可以通过两种组件完成。1,Servicemix-Http-bc2,Servicemix-CXF-bc Http-bc的优点是使用范围非常的广,缺点是使用非常麻烦。也就是说大多数组件都要我们自己定义。Cxf-bc的优点是比较简单。这个组件本身集成了对现有大多数Soap/Http形式的支持,对于没有特定要求的使用来说是足够了。 顺便一提Http-se和Cxf-se,这两个是相对于上面两个而言的,这两个是服务引擎,对象一般是实际的Class或者Application Servicemix的教程参考:http:

6、//tutorials.htmlCXF教程参考:/4- beginner-web-services-with-servicemix-and-cxf.html 本文使用CXF-bc来实现,参考:/servicemix-cxf- bc.html 所需工具:apache-Servicemix-3.2.2 release (据官方说,开源变化很大,最新的比较完备,至少需要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的环境变量 2,安装好Maven,并且配置好Maven的环境变量        环境变量:        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/可以看到服务器已经在运行。 4,安装好Tomcat,并且配置好环境变量 5,安装好Axis2,并且配置好环境变量            注:这里可以使用简单方式,下载Axis2的war包,直接

14、发布到Tomcat中就可以。             测试:http:/localhost:8080/下检查新添加的Axis2服务 6,将Service Archive Wizard - Eclipse Plug-in等插件装进Eclipse            注:这些插件不是必要的,仅仅可以使工作变得简单一些。 7,打开E

15、clipse并新建动态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中刚刚发布Say          输入World,看到返回值正常 10,发布webservice        发布WebService有很多种方式,可以把它直接发布Tomcat中,也可以利用Axis来发布       

19、; 我们使用Axis2来发布        注意,我们要发布到Axis2中,所以我们service的address就变了,这里需要根据实际发布地址进 行修改         例如本示例修改如上1. <wsdlsoap:address location="http:/localhost:8080/axis2/services/HelloService"/>  

20、;      使用插件Service Archive Wizard - Eclipse Plug-in          点击Next,然后选择Class文件的路径          点击Next,选择我们刚刚发布的wsdl         

21、0;点击Next,然后来选择必要的jar包。          点击Next,勾选自动生成Service.xml          点击Next,填选Class          点击Next,填写发布路径        

22、;  点击Finish,则在目标路径生成aar文件         将生成的aar文件复制到%Tomcat%/webapps/axis2/WEB-INF/services下,或者在axis2的admin页面添 加该aar文件          默认的用户名是admin,密码是axis2        

23、0; 点击Upload Service          将刚刚生成的wsdl发布          发布成功后,就可以在Service中找到刚刚发布HelloService          点击HelloService,我们就可以看到这个服务的具体内容,就是我们刚刚发布wsdl。

24、60;       至此,我们成功地发布了一个webservice *以上示例使用的是POJOs形式发布。 11,运行Servicemix         运行cmd,然后启动servicemix服务          等待服务完全开启。       

25、;   当启动成功之后。我们就可以在JDK的控制台看到关于ServiceMix的服务信息        运行  %JDK%/bin/jconsole.exe          则我们可以找到servicemix的服务已经开启          点击连接,则我们可以看到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;用来创建一个标准的pom.xml        在这个pom.xml中,对于一些基本的工程配置作了设定          在我们成功建立了之后,会发现CXFHello文件夹下面多出了一个路径        则我们在这个新建的路径下面运行1. mvn install     &

29、#160;   至此,我们已经将这个新建的工程发布到我们的本地 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        用来创建一个标准的CXF-BC-SU组件         至此,我们建议了一个标准的CXF-BC-SU组件的框子   

31、60;            现在进入新建的组件的文件夹。        我们看到一个pom.xml文件,这个是对这个组件进行配置的一个文件。        打开,我们可以看到详细内容        现在我们修改这个组件的名字 &

32、#160;      将<name>A Cxf BC Service Unit</name>        改成<name>Cxf-Hello-SU</name> 然后我们需要将我们发布在Axis2上的Webservice的wsdl复制下来放入servicemix这个bc组建之中。         关于wsdl

33、文件            打开wsdl文件,我们可以发现,wsdl其实定义了webservice的所有规范,例如它的名字,接 口,方法,参数等等            而我们需要将wsdl复制到我们要发布的servicemix当中,是因为我们暴露出去的接口,方法, 参数等要能和实际服务的webservice一致。所以servicemix当中需要一个由同样接

34、口定义的wsdl文件         访问  http:/localhost:8080/axis2/services/HelloService?wsdl                得到我们刚才发布的webservice的wsdl文件        

35、0; 将这个wsdl文件复制到%/my-cxf-bc-su/src/main/resources  下        其实这里原本就预订了一个wsdl文件的位置。        注意,我的wsdl名字叫做Hello.wsdl,因此,当复制过来后,原来的service.wsdl就可以删除了        当然,我们也可以把刚才ecilpse

36、项目中生成的wsdl复制过来,这是一样的文件                现在我们需要修改这个复制进来的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>        结果如下图         现在我们已经完成了对wsdl的设定,现在我们需要在xbean.xml设定consumer和provider来帮定这些东西。        打开xbean.

39、xml,作如下修改            首先,我们需要一个namespace,这个namespace要和我们引用的wsdl中的service和 endpoint的namespace一致,这样我们才能准确找到service和接口            我们的wsdl定义的targetNamespace="http:/sample"

40、0;           所以我们bc组件中的consumer和provider定义的namespace也必须和上面一样         现在来定义consumer和provider,基本的定义规则参照:/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、       现在可以看到工程目录中新建出来了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.         好了现在一切就绪,我们在工程目录下面运行1. mvn install        就可以建立好组件了   

46、      在build successful之后,我们就可以在        %/my-cxf-sa/target        目录下面看到我们建立好的jar包          将这个jar包复制到servicemix目录下面的/hotdeploy文件夹,来正式发布到ser

47、vicemix当中          如此一来,我们就成功的发布了一个服务到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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论