Wso2 esb 代理服务器配置1

来源:互联网 发布:珀莱雅淘宝旗舰店真假 编辑:程序博客网 时间:2024/05/02 00:39

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

跟真实的服务一样,代理服务也需要用一个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>

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子被老师骂怎么办 孩子幼儿园被打怎么办 两个家长吵架老师怎么办 家长和老师矛盾怎么办 孩子特别害怕老师怎么办? 老师排挤孤立孩子怎么办 很害怕一件事怎么办 高中老师误会我怎么办 家长讹老师老师怎么办 小孩子老说头疼怎么办 孩子总是否定自己怎么办 孩子总是否定别人怎么办 老师屏蔽家长该怎么办 初二学生学疲劳怎么办 孩子不愿补英语怎么办 培训班孩子不学怎么办 小孩不想去学校怎么办 讨厌父母的性格怎么办 老师揪孩子耳朵怎么办 老师整天骂孩子怎么办 教师被学生骂怎么办 幼儿园学生骂老师怎么办 学生骂老师外号怎么办 小孩上课很多嘴怎么办 学生老玩手机怎么办 和校长有了矛盾怎么办 家长打了我怎么办 小朋友不想去幼儿园怎么办 小朋友不想上幼儿园怎么办 高中老师打学生家长怎么办 老师偏心学生该怎么办? 老师能打孩子怎么办 有的幼儿打老师怎么办? 孩子特别怕老师怎么办 孩子跟老师认生怎么办 和搭班老师不合怎么办 学生厌学了老师怎么办 孩子很怕我怎么办 斗米报名之后怎么办 孩子鼻子长疮怎么办 六年级孩子不爱学习怎么办