1概述1.1编制目的通过本地发布ESB服务,来管理平台所有webservice接口,及定制平台输入、输出XML规范,达到webservice集中部署,集中管理,统一规范的目的1.2技术介绍1.2.1有关ESB企业服务总线是一种软件架构的构造,生存在(业务)应用和通信之间。理想情况下,ESB总线上的应用程序能够代替所有直接接触使所有通信通过ESB。ESB通过一个事件驱动和基于标准的消息引擎(总线)提供基本服务。多亏ESB,集成架构师可以利用消息的价值而无需编写代码。开发人员通常使用一类公认标准的中间件基础设施产品技术实现ESB。ESB是一个比较新的概念。仅仅是在最近几年被普遍使用。人们通常将ESB和面向服务的体系结构联系在一起但他们有正交的关系。然而,如SOA、ESB本质上是许多企业软件产品直接实现的企业架构设计模式的集合。WSO2ESB是一种根据ApacheV2.0许可证发布的快速、轻量级和灵活的企业服务总线产品。使用ESB在HTTP、HTTPS、JMS、mail等协议基础上通过业务系统过滤、转换、路由和处理SOAP,二进制、纯XML和文本消息。1.2.2wso2是什么?WSO2企业服务总线(ESB)是一个快速,轻巧,100%开源的和用户友好的开源ESB,分布按照Apache软件许可证2.0版。WSO2ESB允许系统管理员和开发消息路由,调解,改造,记录,任务调度,故障切换路由,负载均衡和更方便地配置。它还支持传输交换,事件,以规则为基础的调解和基于优先级的先进的集成要求调解。ESB运行时的设计是完全异步,非阻塞上ApacheSynapse的调解的引擎和基于流的。WSO2ESB是基于WSO2carbon平台之上发展而来的,一个基于OSGi的SOA通过组件化的框架提供了无缝的模块化开发。此版本还包含了许多新的功能和一系列的可选组件(附件)可以安装自定义ESB的行为。此外,ESB任何现有的而环境不需要的功能都可以很容易的利用底层配置框架的carbon移除。1.2.3ESB体系架构(ESBArchitecture)在企业中的基础应用设施可能是本身就很复杂,包括数百种语义完全不同的应用程序。其中的一些应用是自定义的,一些是从第三方获得还有一些是两者的结合,而且他们可以在不同的系统环境中运行。这些异构应用之间的集成对企业来说是至关重要的,不同的服务可以使用不同的数据格式和不同的通信协议。服务的物理位置可以任意改变,所有的限制意味着应用程序任然是紧密耦合在一起的。ESB可以用来解耦和连接在一起的服务和服务消费者。WSO2ESB是一个为企业准备的完全成熟的ESB。WSO2ESB是建立在ApacheSynapse项目基础上的。ApacheSynapse是使用ApacheAxis2创建的。下图从信息角度描述了WSO2ESB架构,还有一些像Tasks、Events没有在图中描述出来。显示了如何在ESB中处理消息。注意:管道的各种组成部分并不意味着这个图中的热河命令。应用程序发送消息到ESB。该消息由ESBTransport捡起。Transport通过消息管道发送消息。像安全和可靠的消息传递的信息方面的质量受到这个pipe的照顾。在该pipe内部是axis2的流入和流出流。ESB可以有如下两种操作:消息中介:使用单管道代理服务:使用独立的管道运输到不同的代理服务。消息转换和消息路由可以看做一个独立的单元。如图所示,消息转换组件和路由组件之间没有明显的分离。WSO2ESB调用这个中介框架。一些转换发生在路由决定之前,一些转换发生在路由决定之后。这一部分由Synapse执行。然后根据目的地将消息注入到独立的管道。在这里再次确定消息服务方面的质量。传输层负责通过ESB所需的传输协议的转换。该图显示了如何通过ESB的体系架构将请求传到一个实际的endpoint。响应处理是这个操作的反向操作。所有这些组件可以通过WSO2ESB管理控制台管理和检测。2开发指南2.1部署WSO2ESB部署环境:Linuxredhat6,JDK1.6,wso2esb-4.8.0安装linux系统在linux系统上配置jdk1.6环境变量。经测试:wso2esbjdk版本为1.6-1.7,其他版本不行Cd~Vi./.bash_profilePATH=$PATH:$HOME/binJAVA_HOME=/home/esb/Desktop/jdk1.6.0_45;exportJAVA_HOMEPATH=$JAVA_HOME/bin:$PATHexportPATH配置CARBON_HOMECd~Vi./.bash_profilePATH=$PATH:$HOME/binJAVA_HOME=/home/esb/Desktop/jdk1.6.0_45;exportJAVA_HOMECARBON_HOME=/home/esb/Desktop/wso2esb-4.8.0;exportCARBON_HOMEPATH=$JAVA_HOME/bin:$CARBON_HOME/bin:$PATHexportPATH修改repository\conf\axis2\axis2.xml中bind_address和WSDLEPRPrefix,改后在发布的webservice中就会使用服务器ip来访问esb,否则默认是服务器主机名,若没有添加hosts内容,则不会访问到webservice。Cd$CARBON_HOME/repository/conf/axis2Viaxis2.xml启动wso2server.sh访问地址登录账号及密码:admin/admin2.2发布webservice至ESB1.创建Proxy2.创建proxy名称,并载入wsdl文件transportReceivername=httpclass=org.apache.synapse.transport.passthru.PassThroughHttpListener...parametername=bind-addresslocked=false192.170.100.15/parameterparametername=WSDLEPRPrefixlocked=false=httpsclass=org.apache.synapse.transport.passthru.PassThroughHttpSSLListener...parametername=bind-addresslocked=false192.170.100.15/parameterparametername=WSDLEPRPrefixlocked=false路径可以是一个http路径,也可以是一个repository路径;如下file:repository\samples\resources\proxy\sample_proxy_1.wsdl勾选http协议完成后点击“NEXT”3.创建EndPointAddress:webservice处理地址Format:选择SOAP1.1协议完成后点击“NEXT”4.创建OutSequence完成后点击“FINISH”5.查看Proxy信息点击HelloProxy可以再此处对webservice进行监控6.EndPoint地址此地址即发布至ESB后代理地址,可以通过访问HelloProxy地址,来达到访问CalculatorServiceWebservice的效果。7.开发客户端程序,调用ESB使用xfire客户端访问ESB,载入所需jar包,开发client代码publicstaticvoidmain(String[]args)throwsAxisFault{try{Clientclient=newClient(newURL());Object[]obj=client.invoke(add,newObject[]{1,2});System.out.println(obj[0]);}catch(Exceptione){//TODO:handleexceptione.printStackTrace();}}输出信息为:2.3分组管理发布代理当esb上代理服务非常多时,可以采取分组管理services。在Step1时,键入ServiceGroup的名称,其他有同组代理时,填写相同的Group名称即可。ServiceDescription属性是对此代理的备注描述。点击Deployedservicegroup(s)可查看各Groups及其下属代理。2.4Client交叉调用代理交叉调用代理是指按照原有旧模式,若想在一个工程内部调用另一个工程的webservice时,wsdl路径为myxfire4发布的路径,搭建ESB后,直接调用ESB发布的Proxy4地址亦可调用myxfire4的webservice,统一出入口进行services的管理。3问题解析org.codehaus.xfire.fault.XFireFault:Theendpointreference(EPR)fortheOperationnotfoundis/services/CalProxy.CalProxyHttpSoap11EndpointandtheWSAAction=.IfthisEPRwaspreviouslyreachable,pleasecontacttheserveradministrator.atorg.codehaus.xfire.fault.Soap11FaultSerializer.readMessage(Soap11FaultSerializer.java:31)atorg.codehaus.xfire.fault.SoapFaultSerializer.readMessage(SoapFaultSerializer.java:28)atorg.codehaus.xfire.soap.handler.ReadHeadersHandler.checkForFault(ReadHeadersHandler.java:111)atorg.codehaus.xfire.soap.handler.ReadHeadersHandler.invoke(ReadHeadersHandler.java:67)atorg.codehaus.xfire.handler.HandlerPipeline.invoke(HandlerPipeline.java:131)atorg.codehaus.xfire.client.Client.onReceive(Client.java:406)atorg.codehaus.xfire.transport.http.HttpChannel.sendViaClient(HttpChannel.java:139)atorg.codehaus.xfire.transport.http.HttpChannel.send(HttpChannel.java:48)atorg.codehaus.