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>
- Wso2 esb 代理服务器配置1
- WSO2 ESB(1)
- WSO2 ESB(1)
- wso2——(1)esb安装
- wso2——(1)esb安装
- WSO2 ESB(2)
- WSO2 ESB(3)
- WSO2 ESB(4)
- WSO2 ESB(5)
- WSO2 ESB介绍
- 关于WSO2 ESB
- WSO2基础ESB架构分析
- WSO2 ESB 5.0.0 文档
- WSO2 ESB 学习(二) ---安装篇
- WSO2 ESB 学习(二) ---安装篇
- wso2 ——(4)esb 汉化
- wso2 ——(4)esb 汉化
- WSO2-IoTServer Linux配置
- 基于MCP2515的Linux CAN总线驱动程序设计(三)
- 在C++代码的陪伴下成长
- std::vector sort containing classes
- 学习fcntl
- 2013.6.28.1~阅读程序(十六周任务)
- Wso2 esb 代理服务器配置1
- #ifdef DEBUG
- C++ Primer 有感(顺序容器)
- HDU-1008 Elevator
- android 软键盘 InputMethodManager
- 网页栅格设计系统
- x window配置
- Configuring and Managing Cluster Resources (Command Line)
- Android退出程序的若干方法