spider RPC插件化体系

请访问https://git.oschina.net/zhjh256/io-spider获取最新更新。 

      为了满足灵活扩展的需要,spider支持灵活的自定义插件扩展,从功能上来说,插件和过滤器的差别在于过滤器不会阻止请求的执行同时对于主程序不会有API上的影响(比如servlet 过滤器和监听器)(最多改变后一步的执行路径),而插件不仅可以改变请求后一步的执行路径,还可以完全阻止请求往后继续执行,在插件内部完成所有的处理,甚至可能会要求主程序不得不做出变动(比如j2ee 7中新增的websocket api),当然也可以什么都不做。

        从本质上来说,插件的地位同等于目标服务器或者spider.localService,从执行流程上来说,请求找到路由目标或者spider.localService后,在本节点的处理就已经终止,但是插件可以决定请求的下一处理者仍然是插件(自己除外),在插件中,甚至可以和正常的spider客户端一样,调用远程服务。

 

        在配置了自定义插件的情况下,插件、过滤器、本地处理器、路由的执行顺序如下:

        customPluginName1;customPluginName2;spider.beforeFilter; spider.localService;spider.channel;spider.afterFilter

   customPluginName1;customPluginName2;为插件配置的顺序。

        其中spider.filter、spider.localService、spider.channel为内置约定的最佳顺序。自定义插件顺序可通过事先配置,也可以在实现的doService()接口中通过不同的返回码运行时改变插件执行顺序或者跳过某些插件进入spider.localService或spider.channel、甚至直接终止请求。如果没有在流水线中配置至少第一个应执行的插件,则所有相关插件均不会被执行;否则,插件实现可运行时指定下一个处理插件或者顺序执行所有后续配置的插件。如果配置了超过一个自定义插件,则不管实际实现了几个插件,最多只会执行流水线中指定的插件。所以,建议要么只配置第一个自定义插件,其它运行时指定;要么,列出所有的自定义插件,运行时除非必要,否则按照配置的顺序往后执行。

 

实现一个自定义插件包含两个步骤:

实现com.ld.net.spider.plugin. SpiderPlugin接口。SpiderPlugin的签名如下:

public interface SpiderPlugin {

    /**

     * 解析spider自定义插件

     * @param customPluginEle spider.xml中的customPlugin节点

     */

    public void doParse(Element customPluginEle);

   

    /**

     * 插件处理逻辑实现

     * @param packet spider请求包完整上下文,具体可查看SpiderPacketPluginReq定义

     * @return

     */

    public SpiderPacketPluginResp doService(SpiderPacketPluginReq packet);

}

 

1、 在spider.xml中配置该插件。建议所有的自定义插件都遵循如下的配置格式:

    <customPlugin name=”” class=””>

             <args>

                      <arg name=”factorType”></arg>

                      <arg name=”factors”></arg>

                      <arg name=”degree”></arg>

             </args>

    </customPlugin>

         其中,customPlugin为固定名称,标识该节点为自定义插件,name属性指定插件的名称,class属性指定插件的实现类。args以及其子节点arg为插件自定义参数,开发者自行定义和扩展。

         为了避免潜在的业务不一致性,当插件加载失败时,spider将中止启动。

 

         注1:广播请求不受自定义插件影响。

         注2:抓包在自定义组件之前。

内置插件

       spider内置了一些实用的插件,这里做简单的介绍。

并行执行插件

       为了获得某些批处理场景下更低的响应时间,spider支持灵活的并行执行架构,在当前的版本中,系统支持以下两种并行计算因子的指定:

1、客户端枚举指定;

2、调用功能号自动计算;

 

并行计算支持配置自定义维度,其通过配置在customPlugin元素的参数中,该插件没有配置参数,如下所示:

<customPlugin name=”” class=””></customPlugin>

 

   客户端可以通过在可变报文头中指定并行计算的相关参数,具体参见com.ld.net.spider.meta.SpiderBizHead。目前支持如下参数:

n  factorType:<!--1:客户端枚举指定;2: 调用功能号自动计算-->

n  factors:<!--并行因子,对于枚举指定,以”,”分隔的字符串;对于调用功能号,则指定功能号(该功能号必须能从本节点路由到达)。

n  degree:<!—并行度,默认max(4, cpu数量/4)-->

n  factorDriver:<!—当factorType=2时,调用功能号的查询条件。factorType=1时自动被忽略,可传可不传-->

n  condJsonPath:指定并行查询的条件字段,用于计算出并行条件后插件会写到请求参数,这样可以保证服务的设计与并行执行完全弱相关。

   基于CNB/ANB作为高速路由的考虑,并行执行插件仅在第一个NP节点才开始进行并行化(在到达随后的节点时,并行计算参数自动清除),节点的角色可通过配置文件中的role属性进行设置。

 

由于并行计算是一个fork and join的流程,因此为了尽可能地简化应用层的特殊考虑,spider在BaseResp的基础上扩展了一个ParallelBaseResp,用于并行计算。当用户希望使用并行计算特性时,需要使用该类作为基类,同时增加一个data字段作为业务执行结果,data可以是任何类型(字段名必须是data,放在其他字段上的信息均会丢失),如下所示:

public class SpiderBaseResp {

    private String errorNo = SpiderErrorNoConstant.ERROR_NO_SUCCESS;

    private String errorInfo = SpiderErrorNoConstant.ERROR_INFO_SUCCESS;

}

 

public class ParallelBaseResp extends SpiderBaseResp {

    private String clusterName = "-1";

    private String ip = "-1";

    private int port = -1;

}

 

客户端可以得到每个并行执行子进程的执行结果以及业务返回值。

       由于并行计算本身会引入额外的进程或线程间交互成本,因此建议仅在运行超过30秒以上的场景中使用并行执行特性。

       并行执行的具体使用可参考spider开发指南。

posted @ 2016-11-24 07:53  zhjh256  阅读(311)  评论(0编辑  收藏  举报