标签存档: webservice

Apache Servicemix 教程 – CXFBC

主要介绍下Servicemix最常用的组件之一servicemix cxfbc的使用,官方上有比较详细的文档,英文好的朋友可以直接点击查看

  CXF 同时也是apache的一款webserivce框架.Java开发者可以使用cxf快速的发布webserivce或者作为客户端调用别的webserivce.

  在Java世界里,webserivce本质上就是把java bean对象序列化成xml文本,并包装成SOAP格式的消息传递到服务端,由服务端反序列化xml消息到java bean调用相关服务.

Note:这里的序列化和反序列化,涉及到2个标准,即jax-rpc和jax-ws规范 这2个规范无论是对SOAP的格式还是java-xml间互转都有着本质上的不同.JDK1.5以后,sun已经把jax-rpc移除了jdk中去. JDK1.5开始都采用jax-ws规范. 这里cxf同样只支持jax-ws规范.

  我们先来写一个简单的webservice程序,充当集成的一个系统,我们称这个系统为mock系统. 如何开发一个webserivce不是这里的重点,可以点击此处下载已开发完好的webservice程序,只需把war包扔到Servlet容器内部署即可. 这里我们假设我需要集成一个订单受理系统.

  浏览器内输入 http://localhost:8000/mock/services/order?wsdl   打开如下图,则启动正常

TM截图未命名

好了,我们开始对这个mock系统进行集成,因为是例子,我做的尽量简单,只使用cxfbc一个JBI组件来开发,现实环境中一般还用上xslt作为数据树结构转换,这里我们先不用.

一、编写自定义WSDL,

  CXFBC是一个BC组件,简单来说其实是一个WebService的代理组件,使用这个组件我可以不写任何一行代码,来和一个现有的WebService进行连接,虽然不用写代码,但我们却需要编写一个WSDL文件,这样ESB暴露给别的系统的就是这份WSDL文件,调用后CXFBC组件会把这份WSDL产生的SOAP消息,发往外部系统,这里是我们的mock系统.

大致关系如下:   
Client   — soap –>   ServiceMix(Custom WSDL) – soap – > mock

这里为了演示,我就自己不写WSDL了,直接把mock发布的WDSL拷贝一份即可,但要注意修改几个地方,参考下面WSDL.

 

XML语言: 临时自用代码
<?xml version=”1.0″ ?><wsdl:definitions name=“OrderServerImplService” targetNamespace=“http://www.fengsage.com/order” xmlns:ns1=“http://cxf.apache.org/bindings/xformat” xmlns:soap=“http://schemas.xmlsoap.org/wsdl/soap/” xmlns:tns=“http://www.fengsage.com/order” xmlns:wsdl=“http://schemas.xmlsoap.org/wsdl/” xmlns:xsd=“http://www.w3.org/2001/XMLSchema”>
  <wsdl:types>
<xs:schema attributeFormDefault=“unqualified” elementFormDefault=“unqualified” targetNamespace=“http://www.fengsage.com/order” xmlns=“http://www.fengsage.com/order” xmlns:xs=“http://www.w3.org/2001/XMLSchema”>
<xs:complexType name=“orderDetail”>
<xs:sequence>
<xs:element name=“id” type=“xs:long”></xs:element>
<xs:element minOccurs=“0” name=“name” type=“xs:string”></xs:element>
<xs:element name=“nums” type=“xs:int”></xs:element>
<xs:element minOccurs=“0” name=“remark” type=“xs:string”></xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name=“orderResult”>
<xs:sequence>
<xs:element name=“id” type=“xs:long”></xs:element>
<xs:element minOccurs=“0” name=“name” type=“xs:string”></xs:element>
<xs:element minOccurs=“0” name=“status” type=“xs:string”></xs:element>

</xs:sequence>
</xs:complexType>
<xs:element name=“create” nillable=“true” type=“orderDetail”></xs:element>
<xs:element name=“createResponse” nillable=“true” type=“orderResult”></xs:element>
</xs:schema>
  </wsdl:types>
  <wsdl:message name=“create”>
    <wsdl:part element=“tns:create” name=“create”>
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name=“createResponse”>

    <wsdl:part element=“tns:createResponse” name=“createResponse”>
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name=“OrderMockServer”>
    <wsdl:operation name=“create”>
      <wsdl:input message=“tns:create” name=“create”>
    </wsdl:input>
      <wsdl:output message=“tns:createResponse” name=“createResponse”>
    </wsdl:output>

    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name=“OrderServerImplServiceSoapBinding” type=“tns:OrderMockServer”>
    <soap:binding style=“document” transport=“http://schemas.xmlsoap.org/soap/http”></soap:binding>
    <wsdl:operation name=“create”>
      <soap:operation soapAction=“” style=“document”></soap:operation>
      <wsdl:input name=“create”>
        <soap:body use=“literal”></soap:body>
      </wsdl:input>

      <wsdl:output name=“createResponse”>
        <soap:body use=“literal”></soap:body>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name=“OrderServerImplService”>
    <wsdl:port binding=“tns:OrderServerImplServiceSoapBinding” name=“OrderMockEndPointPort”>
      <soap:address location=“http://localhost:8000/mock/services/order”></soap:address>
    </wsdl:port>

  </wsdl:service>
</wsdl:definitions>

 

注意<wsdl:service name=”OrderServerImplService” 和 <wsdl:port name=”OrderMockEndPointPort” 我们要修改成如下:

XML语言: 临时自用代码
<wsdl:service name=“OrderServerESBService”>
  <wsdl:port binding=“tns:OrderServerImplServiceSoapBinding” name=“OrderESBEndPointPort”>
    <soap:address location=“http://localhost:8000/mock/services/order”></soap:address>
  </wsdl:port>
</wsdl:service>

由于对Servicemix来说,外部系统(mock),也是一个endpoint,所以这里service name和endpoint name不能和外部系统一致,改成不同即可.

二、建立Servicemix工程

  这里使用maven脚本建立.

  1) 创建ROOT目录

C: mvn archetype:create -DarchetypeArtifactId=servicemix-project-root -DarchetypeGroupId=org.apache.servicemix.tooling -DartifactId=Root -DgroupId=com.fengsage.esb

2) 创建CXFBC组件

C:Root>mvn archetype:create -DarchetypeArtifactId=servicemix-cxf-bc-service-unit -DarchetypeGroupId
=org.apache.servicemix.tooling -DartifactId=cxfbc -DgroupId=com.fengsage.esb

3) 把前面自定义的WSDL文件放到srcmainresources 系统classpath 路径下

4) 编辑CXFBC组件的xbean.xml

XML语言: 临时自用代码
<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns=“http://www.springframework.org/schema/beans”
       xmlns:cxfbc=“http://servicemix.apache.org/cxfbc/1.0”
       xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
       xmlns:esb=http://www.fengsage.com/order
       xsi:schemaLocation=“http://servicemix.apache.org/cxfbc/1.0 http://servicemix.apache.org/schema/servicemix-cxfbc-3.2.3.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd”>
  
  <cxfbc:consumer wsdl=“classpath:custom.wsdl”
                service=“esb:OrderServerESBService”
            endpoint=“OrderMockEndPointPort”
                  locationURI=“http://localhost:8193/ESB/1”
            targetService=“esb:OrderServerImplService”
                  targetEndpoint=“OrderMockEndPointPort”/>

  <cxfbc:provider wsdl=“http://localhost:8000/mock/services/order?wsdl”
                service=“esb:OrderServerImplService”
                  endpoint=“OrderMockEndPointPort”/> 
</beans>

5) 创建SA组件,进行打包

C:Root>mvn archetype:create -DarchetypeArtifactId=servicemix-service-assembly -DarchetypeGroupId=or
g.apache.servicemix.tooling -DartifactId=sa -DgroupId=com.fengsage.esb

6) 手动调整SA组件里的POM文件,添加下面几行,通知SA编译时把CXFBC组件打包进去

<dependency>
  <groupId>com.fengsage.esb</groupId>
  <artifactId>cxfbc</artifactId>
  <version>1.0-SNAPSHOT</version>
</dependency>

7) 编译

C:Root>mvn install

8) 发布

  进入SAtarget目录,可以看到有个生成的sa-1.0-SNAPSHOT.jar文件把这个文件放到ApacheService的hotdeploy目录,启动Servicemix即可.或运行下面命令可以直接发布

C:Rootsa>mvn jbi:projectDeploy -o

如无错误,应该有下面提示

INFO  – ServerImpl                     – Setting the server’s publish address to be http://localhost
:8193/ESB/1

10) 打开http://localhost:8193/ESB/1?wsdl 进行浏览,可以看到这个就是我们在ESB发布的WebService了

11) 测试

  我们使用一款免费的WebService测试工具, SOAP UI , 官方地址

<soapenv:Envelope xmlns:soapenv=”http://schemas.xmlsoap.org/soap/envelope/” xmlns:ord=”http://www.fengsage.com/order”>
   <soapenv:Header/>
   <soapenv:Body>
      <ord:create>
         <id>?</id>
         <!–Optional:–>
         <name>?</name>
         <nums>?</nums>
         <!–Optional:–>
         <remark>?</remark>
      </ord:create>
   </soapenv:Body>
</soapenv:Envelope>

Apache Servicemix 教程 – 安装部署

简单介绍下Servicemix安装、使用、部署,并简单介绍下Servicemix简单配置.

安装

  1. 下载Servicemix  http://servicemix.apache.org/download.html 由linux和windows两个不同版本
  2. 解压到指定文件夹(zip/tar.gz)

Note:目前最新版本是3.3.2 和 4.0.0

运行

  1. cd <SERVICEMIX_HOME>
  2. windows:   .binservicemix.bat
    linux:          ./bin/servicemix

Note:由于linux启动servicemix,会随终端退出而关闭,需要使用nohup命令,使其脱离终端独立运行

部署

Servicemix提供2种主要监控方式

  1. 热部署目录. 即把开发好的SA直接放到<SERVICEMIX_HOME>hotdeploy目录中去即可
  2. 脚本部署. Servicemix运行使用ant或maven脚本方式,直接把开发好的SA植入到JBI容器内

Note:Servicemix提供了部署MBena,用户可以使用此MBean开发第三方程序进行部署

监控

Servicemix并没有提供第三方监控工具,而是推荐使用sun的jconsole工具,该工具位于JDK bin目录中和java
、javac等命令在一个目录下,操作如下

  1. 命令行输入jconsole
  2. 在远处连接处输入”service:jmx:rmi:///jndi/rmi://localhost:1099/jmxrmi”  默认用户名和密码都是smx
  3. 点击”连接”按钮即可对Serivicemix内部资源进行监控

Note:Servicemix的第三方生产商FUSE提供了HQ监控工具,但是由于不开源,所以大家无福消受了.

 

关于开发

官方推荐使用maven作为Servicemix的开发工具,个人也强烈推荐,简单方便.详细的maven教程可以参考maven官方网站.http://maven.apache.org/

这里简单讲一下如何建立一个Servicemix工程,后面实例中讲详细介绍

  1. 创建一个root工程
    mvn archetype:create -DarchetypeArtifactId=servicemix-project-root -DarchetypeGroupId=org.apache.servicemix.tooling -DartifactId=Root -DgroupId=com.fengsage.esb
  2. 创建任意SU组件,各个组件对应的maven id 都可以从下面网址中得到
    http://mvnrepository.com/artifact/org.apache.servicemix.tooling
  3. 创建SA组件,对于每个servicemix工程,都需要打包成SA文件才能部署到JBI容器中去.
    mvn archetype:create -DarchetypeArtifactId=servicemix-service-assembly -DarchetypeGroupId=org.apache.servicemix.tooling -DartifactId=Root -DgroupId=com.fengsage.esb
  4. 编译,在root目录下,输入maven install 或 maven clear install 即可完成编译
  5. 打开编译后的*sa文件夹,找到target文件夹,里面有个*.jar文件即使我们打包后得到的SA文件,部署到servicemix容器中即可.

Apache Servicemix 教程 – 介绍及理论

经过一年来ESB学习和工作的部分经验.即给自己总结的时间,把脑海中关于ESB的部分进行整理,也留下点心得,也想和对ESB感兴趣,有研究的朋友进行交流.不足之处望予以批评指正.

基础概念

1. ESB

ESB(Enterprise Service Bus)是为了解决企业生态群落内大量系统间因为交互繁琐导致维护成本增加而产生的.下图是典型的传统多系统间数据交互图.随着生态群落的扩大,越来越多的系统加入,导致维护这些系统的通讯成本越来越多

clip_image002[4]

ESB的诞生就是为了解决上图中的这些问题,下图可以可以看到ESB所解决的实际问题.

clip_image004[4]

2. Apache Servicemix

Apache是著名的开源社区,正对不同应用都有很多对应的开源产品,对开源有兴趣的朋友可以进入官网学习. 对于ESB. Apache主要有2款产品: Synapse 和 Servicemix

  1. Synapse,这款产品是apache早期的一款ESB产品,诞生于JBI规范制定之前,属于众多ESB产品中一个普通的产品,并没有什么太吸引人的地方. 但随着WSO2这款新ESB的兴起,发生了点改变.WSO2是WSO2公司正对Synapse进行二次开发后的产物,因为使用了apache licese因此也开源.并且提供了强大的可视化界面,通过几步简单的配置就能完成系统间接口的集成.
  2. ServiceMix,我们重点讲这款产品.这款产品是目前Apache主推的一款ESB产品,遵循了JBI规范,可以很方便的进行二次扩展,其自带的组件基本能完成一般系统集成的需要,是构建SOA的良好产品.目前Servicemix主要有2个版本在维护,即3.*和4.*两个版本,这里我们讲3.*版本.

3. Apache CXF

目前比较成熟功能比较齐全的webserivce工具.可以用来发布自己的webserice程序,并能作为webserivce的客户端. Servicemix使用cxf作为其webserivce的一个发布工具.

4. Apache Camel

Apache Camel是一个开源的企业应用集成框架。它采用URI来描述各种组件,这样你可以很方便地与各种传输或者消息模块进行交互,比如HTTP、 ActiveMQ、JMS、JBI、SCA、MINA或CXF Bus API。该路由完全参照了《Enterprise Integration Patterns》一书中各种路由模式的规则. Servicemix使用camel作为其核心消息路由器.

5.  Apache derby

Apache一款文件型数据库,可以方便的内嵌到任意程序中去,也可以以内存作为数据库存储.比较适合开发系统初期使用. Servicemix用来对一些NMR消息的记录.

6.  Apache activemq

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用中间仍然扮演着特殊的地位。

7.  JBI

Sun用来规范ESB领域而制定的一个规范,当然目前遵守这一规范的ESB产品不多,Servicemix算是其中一个良民.
Servicemix从本质上来说就是一个JBI的容器,任何符合JBI规范的组件都可以放到这个容器里,成为Servicemix的一部分.JBI协议是smx里的重点,简单来说JBI协议分为下面几部分.

  1. Bind Component(BC) 即消息绑定组件,用于对不同消息进行转换.把收到的各种消息统一转换为JBI消息.也把JBI消息转换成各种协议发往外部系统.eg:
    servicemix-file                 IO组件,允许对把IO文件传入Servicemix
    servicemix-ftp                 支持FTP协议,允许使用FTP上文件传入Servicemix
    servicemix-http               支持Http协议,允许通过Http接受文件
    servicemix-jms                支持JMS协议,允许接受JMS消息
    servicemix-xmpp             支持XMPP协议,允许实时同步消息
    servicemix-cxfbc             支持WebService,允许接受soap消息,此组件不支持jax-rpc规范
    ……
  2. Server Engine(SE) 即服务引擎,简单来说就是把从BC组件收到的消息进行二次处理,比如路由消息,树结构转换, eg:
    servicemix-bean            允许自定义bean,可以自行对消息进行自定义处理
    servicemix-camel           允许对消息路由处理
    servicemix-jsr181           允许自定义通过代码发布WebService接受soap并处理消息
    servicemix-quartz          消息定时处理
    servicemix-saxon           消息格式转换,支持xslt
    servicemix-script            允许在嵌入动态语言对消息进行处理
    ……
  3. Normalized Message Route(NMR) 即标准消息路由,在JBI规范中,BC收到消息后,不能直接传递给下一个BC或者SE进行消息处理,这些传输必须通过NMR转发,NMR转发的消息已经是标准的JBI消息,Servicemix也支持对soap消息进行NMR传递
  4. Delivery channel 即传输通道,上述NMR消息传输的通道
  5. Service Unit (SU) 即服务单元,用户编写的服务的最小单位,每个服务单元都有自己的逻辑进行处理.例如,消息转换,消息路由,通过一个或多个SU的组合完成一次接口调用
  6. Service Assemblys(SA) 即服务集合,简单来说就是把SU大包成SA文件,然后部署到Servicemix中去

先写到这,以后继续补充,ESB设计到太多的J2EE知识,几乎涵盖了J2EE所有特征.