RibbonFilter

说明

负载均衡插件,根据配置的servers=ip1:port,ip2: port属性,实现负载均衡。其中多个ip之间通过逗号隔开,当配置的交易请求第一个ip的服务,如果交易处理成功,则成功;如果交易处理失败则交易请求第二个ip的服务,以此类推,实现负载均衡。

配置实例

下面以请求http服务为例

客户端请求的配置


<transaction id="ribbonTest" version="2.0">
    <step id="1">
        <filter ref="publicFilter" type="in">
            <field tag="servers" value="127.0.0.1:10004,127.0.0.2:10004"/>
            <field tag="reqmap" type="map"/>
            <field value="${reqmap.put('interface','test')}"/>
            <field value="${reqmap.put('transaction','httpClient')}"/>
            <field value="${reqmap.put('server',servers)}"/>
            <field value="${reqmap.put('rootUrl','/')}"/>
            <field value="${reqmap.put('mapping','test')}"/>
            <field value="${reqmap.put('body','我是body里的数据')}"/>
            <field value="${reqmap}" scope="this"/>
        </filter>
        <!--负载均衡-->
        <filter ref="ribbonFilter" type="in"/>
        <!--请求响应-->
        <filter type="in" ref="publicFilter">
            <field tag="msg" value="${this}"/>
            <field tag="content" value="${msg.content}"/>
            <log value="请求响应============${content}"/>
        </filter>
    </step>
</transaction>

其中servers是服务的配置,多个服务之间用逗号隔开;interface和transaction分别是请求服务的接口名和交易名,也就是请求服务的逻辑应该写在此交易中;以上三项为ribbonFilter必填项,其他的参数为处理服务的交易所需要的参数。上面所配置的rootUrl和mapping以及body是交易httpClient所需的参数。

httpClient交易配置

该交易主要实现http请求,如果此交易失败则会使用第二个ip端口重新调起交易,以此类推


<transaction id="httpClient" version="2.0">
    <step id="1">
        <filter type="in" ref="publicFilter">
            <!--接收参数-->
            <field tag="reqmap" value="${this[0]}"/>
            <field tag="ip" value="${reqmap.get('ip')}"/>
            <field tag="port" value="${reqmap.get('port')}"/>
            <field tag="rootUrl" value="${reqmap.get('rootUrl')}"/>
            <field tag="mapping" value="${reqmap.get('mapping')}"/>

            <log value="发起HTTP/POST请求,ip=${ip},port=${port},mapping=${mapping}"/>
            <field value="${reqmap}" scope="this"/>
        </filter>
        <connection ref="httpConnectionBetter" type="out">
            <property name="server" value="${ip}:${port}"/>
            <property name="rootUrl" value="${rootUrl}"/>
            <property name="mapping" value="${mapping}"/>
            <property name="charset" value="UTF-8"/>
            <property name="method" value="post"/>
        </connection>
    </step>
</transaction>

http服务端配置

接收http客户端请求


<service id="httpServer" state="on" type="http">
    <property name="port" value="10004"/>
    <property name="uri" value="/test"/>
    <property name="class" value="classes.CowsRecvServlet"/>
    <property name="interfaceName" value="test"/>
    <property name="transactionName" value="becall"/>
</service>

http服务端交易配置

处理http服务端接收的数据的交易

 <!--服务端处理交易-->
<transaction id="becall" version="2.0">
    <step id="1">
        <filter type="in" ref="publicFilter">
            <field tag="request" value="${this[0]}"/>
            <field tag="response" value="${this[1]}"/>
            <field tag="msg" value="${IOUtils:toString(request.getInputStream(),'#{KCMS_ENCODING}')}"/>
            <log value="接收的参数:${msg}"/>
            <!--组装发送的数据-->
            <field tag="common_tmp" type="map"/>
            <field value="${common_tmp.put('rtncode','00000')}"/>
            <field value="${common_tmp.put('body','请求成功')}"/>
            <field value="${common_tmp}" scope="this"/>
        </filter>
    </step>
</transaction>

效果展示

首先启动http服务 service.bat

然后执行 client.bat test ribbonTest

服务端处理交易中的日志:

d2e8c740d1de7d0b756b94c2c3027d6

请求交易中的日志:

bde95b2877316fc0df19d2045870fb0

results matching ""

    No results matching ""