Wso2 esb 代理服务器配置1

代理服务是一个虚拟的服务,实际功能由外部的已存在的服务提供。

跟真实的服务一样,代理服务也需要用一个wsdl文件来描述自己的服务内容;这个wsdl文件可以是针对当前代理服务专门编写的,也可以将外部的一个真实服务的wsdl文件作为自己wsdl。

这两种方式在意义上有一些不一样也是显而易见的:

1、当代理服务需要把外部的多个服务整合到一起,任何一个外部服务的wsdl都不足以描述整合后的服务时,需要为代理服务专门编写一个wsdl文件。

2、外部的一个服务足以描述整合后的代理服务,其他外部服务只是为这一个外部服务提供支撑,这时可以用这个外部服务的wsdl作为代理服务的wsdl。

代理服务中的其他一些功能:

1、获取请求消息中的属性,用以判定对请求消息的进一步处理(分发消息到不同的endpoint、生成新的请求消息、缓存请求消息...)。

2、获取响应消息中的属性,用以判定对响应消息的进一步处理(判定响应消息来源、修改响应消息、根据响应生成新的请求消息并发送到另一个服务以组成服务链...)。

用例:

一、直接将一个已有服务通过ESB暴露出来,服务客户端调用外部服务或代理服务所不同的只是url地址;

在代理服务的输入流程中不做任何处理,客户的请求直接转发到target所指向的endpoint。

endpoint配置:

<endpoint xmlns="http://ws.apache.org/ns/synapse" name="hello">

   <address uri="http://192.168.34.41:9090/axis2/services/hello" >

      <suspendOnFailure>

         <progressionFactor>1.0</progressionFactor>

      </suspendOnFailure>

      <markForSuspension>

         <retriesBeforeSuspension>0</retriesBeforeSuspension>

         <retryDelay>0</retryDelay>

      </markForSuspension>

   </address>

</endpoint>

代理服务配置:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="DirectProxy2Hello" transports="https,http" serviceGroup="Hello" statistics="enable" trace="enable" startOnLoad="true">

   <target endpoint="hello">

      <outSequence>

         <send />

      </outSequence>

      <faultSequence>

         <drop />

      </faultSequence>

   </target>

   <publishWSDL uri="http://192.168.34.41:9090/axis2/services/hello?wsdl" />

</proxy>

二、在输入流程中判定请求的服务ACTION,并做标记;在输出流程中根据标记判定响应来源。

<proxy xmlns="http://ws.apache.org/ns/synapse" name="DirectProxy2Hello" transports="https,http" serviceGroup="Hello" statistics="enable" trace="enable" startOnLoad="true">

   <target>

      <inSequence>

<!--获取请求报文头中的soapAction的值-->

<!--以case中的表达式来区分开到不同soapAction的请求,并增加一个state属性方便在response时判定是哪一个soapAction的返回,因为response的报文头中没有soapAction属性>

         <switch source="get-property('Action')">

            <case regex="hello#greet1">

               <property name="STATE" value="GREET1" scope="default" />

               <send>

                  <endpoint key="hello" />

               </send>

            </case>

            <case regex="hello#greet2">

               <property name="STATE" value="GREET2" scope="default" />

               <send>

                  <endpoint key="hello" />

               </send>

            </case>

            <case regex="hello#greet3">

               <property name="STATE" value="GREET3" scope="default" />

               <send>

                  <endpoint key="hello" />

               </send>

            </case>

         </switch>

      </inSequence>

      <outSequence>

<!--此处为输出流程,所有的soapAction的响应消息将经过该流程-->

<!--根据在输入流程中设定的state属性标识来区分response来自哪一个soapAction-->

<!--并在日志中体现出来-->

         <switch source="get-property('STATE')">

            <case regex="GREET1">

               <log level="full">

                  <property name="sequence" value="GREET1_STATE" />

               </log>

               <send />

            </case>

            <case regex="GREET2">

               <log level="full">

                  <property name="sequence" value="GREET2_STATE" />

               </log>

               <send />

            </case>

            <case regex="GREET3">

               <log level="full">

                  <property name="sequence" value="GREET3_STATE" />

               </log>

               <send />

            </case>

         </switch>

      </outSequence>

      <faultSequence>

         <drop />

      </faultSequence>

   </target>

   <publishWSDL uri="http://192.168.34.41:9090/axis2/services/hello?wsdl" />

   <parameter name="cachableDuration">15000</parameter>

</proxy>

三、增加xslt处理响应消息,并调用其他服务:greet1-->greet2-->greet3-->client,这个过程中需要做两次报文转换:1、将greet1的response转换为到greet2的request;2、将greet2的response转换为greet3的request。

soapAction greet1、greet2和greet3拥有同样格式的request和response,就是说他们的soapenv:Body部分是一模一样的,如下:

 

Request:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">

   <soapenv:Body>

      <p:greetRequest xmlns:p="http://192.168.34.41:9090/axis2/services/hello">

         <p:greetInput>?</p:greetInput>

      </p:greetRequest>

   </soapenv:Body>

</soapenv:Envelope>

 

Response:

<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">

   <soapenv:Body>

      <n:greetResponse xmlns:n="http://192.168.34.41:9090/axis2/services/hello">

         <n:greetReturn>? greet2.</n:greetReturn>

      </n:greetResponse>

   </soapenv:Body>

</soapenv:Envelope>

greetToGreet.xslt:

<xsl:stylesheet

  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

  xmlns:fn="http://www.w3.org/2005/02/xpath-functions"

  xmlns:ns="http://192.168.34.41:9090/axis2/services/hello"

  version="2.0"

  exclude-result-prefixes="ns fn">

  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />

  <xsl:template match="/">

    <xsl:apply-templates select="//ns:greetResponse" />

  </xsl:template>

  <xsl:template match="ns:greetResponse">

    <p:greetRequest xmlns:p="http://192.168.34.41:9090/axis2/services/hello">

      <p:greetInput>

        <xsl:value-of select="ns:greetReturn" />

      </p:greetInput>

    </p:greetRequest>

  </xsl:template>

</xsl:stylesheet>

 

ProxyService配置:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="DirectProxy2Hello" transports="https,http" statistics="enable" trace="enable" startOnLoad="true">

   <target>

      <inSequence>

         <switch source="get-property('Action')">

            <case regex="hello#greet1">

               <property name="STATE" value="GREET1" scope="default" />

               <send>

                  <endpoint key="hello" />

               </send>

            </case>

            <case regex="hello#greet2">

               <property name="STATE" value="GREET2" scope="default" />

               <send>

                  <endpoint key="hello" />

               </send>

            </case>

            <case regex="hello#greet3">

               <property name="STATE" value="GREET3" scope="default" />

               <send>

                  <endpoint key="hello" />

               </send>

            </case>

         </switch>

      </inSequence>

      <outSequence>

         <switch source="get-property('STATE')">

            <case regex="GREET1">

               <log level="full">

                  <property name="sequence" value="GREET1_STATE" />

               </log>

 <!--将来自soapAction:hello#greet1的response转换为适合soapAction:hello#greet2的request-->

 <!--发送转换好的request到soapAction:hello#greet2-->

               <xslt key="greetToGreet.xslt" />

               <property name="to" value="http://192.168.34.41:9090/axis2/services/hello" scope="transport" />

               <property name="soapAction" value="hello#greet2" scope="transport" />

               <property name="STATE" value="GREET2" scope="default" />

               <send>

                  <endpoint>

                     <address uri="http://192.168.34.41:9090/axis2/services/hello" />

                  </endpoint>

               </send>

            </case>

            <case regex="GREET2">

               <log level="full">

                  <property name="sequence" value="GREET2_STATE" />

               </log>

               <!--将来自soapAction:hello#greet2的response转换为适合soapAction:hello#greet3的request-->

               <!--发送转换好的request到soapAction:hello#greet3-->

               <xslt key="greetToGreet.xslt" />

               <property name="to" value="http://192.168.34.41:9090/axis2/services/hello" scope="transport" />

               <property name="soapAction" value="hello#greet3" scope="transport" />

               <property name="STATE" value="GREET3" scope="default" />

               <send>

                  <endpoint>

                     <address uri="http://192.168.34.41:9090/axis2/services/hello" />

                  </endpoint>

               </send>

            </case>

            <case regex="GREET3">

               <log level="full">

                  <property name="sequence" value="GREET3_STATE" />

               </log>

               <!--来自soapAction:hello#greet3的response直接发送给客户端-->

               <send />

            </case>

         </switch>

      </outSequence>

      <faultSequence>

         <drop />

      </faultSequence>

   </target>

   <publishWSDL uri="http://192.168.34.41:9090/axis2/services/hello?wsdl" />

</proxy>

四、增加数据缓存:将客户请求中的数据提取出来保存到一个property mediator中,并在需要使用的时候通过get-property函数或者其他方式获得该数据,如下

greet2Client.xslt:

<xsl:stylesheet

  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

  xmlns:fn="http://www.w3.org/2005/02/xpath-functions"

  xmlns:ns="http://192.168.34.41:9090/axis2/services/hello"

  version="2.0"

  exclude-result-prefixes="ns fn">

  <xsl:param name="clientInput" />

  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" />

  <xsl:template match="/">

    <xsl:apply-templates select="//ns:greetResponse" />

  </xsl:template>

  <xsl:template match="ns:greetResponse">

    <p:greetResponse xmlns:p="http://192.168.34.41:9090/axis2/services/hello">

      <p:greetReturn>

        <xsl:value-of select="ns:greetReturn" />

        <xsl:value-of select="$clientInput"/>

      </p:greetReturn>

    </p:greetResponse>

  </xsl:template>

</xsl:stylesheet>

ProxyService配置:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="DirectProxy2Hello" transports="https,http" statistics="enable" trace="enable" startOnLoad="true">

   <target>

      <inSequence>

<!--此处将请求数据缓存到名称为ORG_CLIENTINPUT的property中-->

         <property xmlns:sam="http://192.168.34.41:9090/axis2/services/hello" name="ORG_CLIENTINPUT" expression="//sam:greetRequest/sam:greetInput" />

         <switch source="get-property('Action')">

            <case regex="hello#greet1">

               <property name="STATE" value="GREET1" scope="default" />

               <send>

                  <endpoint key="hello" />

               </send>

            </case>

            <case regex="hello#greet2">

               <property name="STATE" value="GREET2" scope="default" />

               <send>

                  <endpoint key="hello" />

               </send>

            </case>

            <case regex="hello#greet3">

               <property name="STATE" value="GREET3" scope="default" />

               <send>

                  <endpoint key="hello" />

               </send>

            </case>

         </switch>

      </inSequence>

      <outSequence>

         <switch source="get-property('STATE')">

            <case regex="GREET1">

               <log level="full">

                  <property name="sequence" value="GREET1_STATE" />

               </log>

               <xslt key="greet2Greet.xslt" />

               <property name="to" value="http://192.168.34.41:9090/axis2/services/hello" scope="transport" type="STRING" />

               <property name="soapAction" value="hello#greet2" scope="transport" />

               <property name="STATE" value="GREET2" scope="default" />

               <send>

                  <endpoint name="endpoint_urn_uuid_98FAEBB98539804F23358561295178365-689539372">

                     <address uri="http://192.168.34.41:9090/axis2/services/hello" />

                  </endpoint>

               </send>

            </case>

            <case regex="GREET2">

               <log level="full">

                  <property name="sequence" value="GREET2_STATE" />

               </log>

               <xslt key="greet2Greet.xslt" />

               <property name="to" value="http://192.168.34.41:9090/axis2/services/hello" scope="transport" />

               <property name="soapAction" value="hello#greet3" scope="transport" />

               <property name="STATE" value="GREET3" scope="default" type="STRING" />

               <send>

                  <endpoint name="endpoint_urn_uuid_98FAEBB98539804F23358561296153366-1681156269">

                     <address uri="http://192.168.34.41:9090/axis2/services/hello" />

                  </endpoint>

               </send>

            </case>

            <case regex="GREET3">

               <log level="full">

                  <property name="sequence" value="GREET3_STATE" />

               </log>

 <!--将之前缓存的property提取出来,并以参数名clientInput传递到xslt中-->

               <xslt key="greet2Client.xslt">

                  <property name="clientInput" expression="get-property('ORG_CLIENTINPUT')" />

               </xslt>

               <send />

            </case>

         </switch>

      </outSequence>

      <faultSequence>

         <drop />

      </faultSequence>

   </target>

   <publishWSDL uri="http://192.168.34.41:9090/axis2/services/hello?wsdl" />

</proxy>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值