为了满足灵活扩展的需要,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开发指南。

spider RPC插件化体系的更多相关文章

  1. spider RPC开发指南

    协议与兼容性 spider使用java语言开发,使用Spring作为IoC容器,采用TCP/IP协议,在此基础上,结合SaaS系统模式的特性进行针对性和重点设计,以更加灵活和高效的满足多租户系统.高可 ...

  2. spider RPC框架的需求来源与特性介绍(一)

    spider RPC 特性介绍 spider RPC 性能测试 spider RPC 入门指南 spider RPC 配置文件参考 spider RPC 开发指南 spider RPC 安全性 spi ...

  3. 有关Android插件化思考

    最近几年移动开发业界兴起了「 插件化技术 」的旋风,各个大厂都推出了自己的插件化框架,各种开源框架都评价自身功能优越性,令人目不暇接.随着公司业务快速发展,项目增多,开发资源却有限,如何能在有限资源内 ...

  4. so插件化

    --摘自<android插件化开发指南> 1.local.properties添加配置 ndk.dir=/Users/jianqiang/Library/Android/sdk/ndk-b ...

  5. fusionjs uber开源的通用web插件化开发框架

    fusionjs uber开源的web 插件化开发框架 核心特性: 基于插件的开发,依赖注入开发 开箱即用的服务器端渲染,构建结果拆分,模块热加载 Tree-shaking 支持 集成的插件 redu ...

  6. spider RPC入门指南

    本部分将介绍使用spider RPC开发分布式应用的客户端和服务端. spider RPC中间件基于J2SE 8开发,因此需要确保服务器上安装了JDK 8及以上版本,不依赖于任何额外需要独立安装和配置 ...

  7. Android组件化和插件化开发

    http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ...

  8. ASP.NET MVC 插件化机制

    概述 nopCommerce的插件机制的核心是使用BuildManager.AddReferencedAssembly将使用Assembly.Load加载的插件程序集添加到应用程序域的引用中.具 体实 ...

  9. Android 插件化

    1.介绍 涛哥写的文章  <Android 插件化的 过去 现在 未来> http://kymjs.com/code/2016/05/04/01#rd

随机推荐

  1. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  2. Linux硬件IO的优化简介

    Linux硬件IO的优化简介 首先简单介绍下有哪些硬件设备如下(由于硬件种类厂家等各种因素我就不在此多做介绍有兴趣的可以自行学习): 1.CPU:中央处理器,是计算机运算控制的核心部件之一,相当于人的 ...

  3. samba服务

    安装samba服务步骤ps -e 查看进程ps -e | grep 文件名 管道符的使用rpm -qa 安装包的查看rpm -qa | grep samba 抓Samba安装包 注释:包与包之间有依赖 ...

  4. PHP 数组浅析

    PHP的数组具有如下特点:1.数组初始化时无需指定长度:2.数组中的元素无需相同类型:3.数组的长度可变4.可使用var_dump(参数)或者print_r(  参数) 函数查看数组变量.5.数组内的 ...

  5. Openfire阶段实践总结

    从3月开始研究Openfire,其实就是要做一套IM系统,也正是这个原因才了解到Openfire.之前还真没想过有这么多的开源产品可以做IM,而且也没想到XMPP这个协议竟然如何强大.看来还是标准为先 ...

  6. mono ios莫名其妙闪退的解决方法

    使用mono进行ios开发也有一年了,一直有个头疼的问题是闪退,而且闪退的时候并没有抛出明确的错误. 前两天在调试一个bug的时候,在序列化的时候又莫名其妙的闪退,后来在一位大神(博客地址)的指导下, ...

  7. Unity3D新手引导开发手记

    最近开始接手新手引导的开发,记录下这块相关的心得 首先客户端是Unity,在接手前,前面的同学已经初步完成了新手引导框架的搭建,这套框架比较简单,有优点也有缺点,稍后一一点评 我们的新手引导是由一个个 ...

  8. Java Spring mvc 操作 Redis 及 Redis 集群

    本文原创,转载请注明:http://www.cnblogs.com/fengzheng/p/5941953.html 关于 Redis 集群搭建可以参考我的另一篇文章 Redis集群搭建与简单使用 R ...

  9. 使用boilerplate模版创建解决方案

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 话不多说,让我们开始干吧!对于还没有接触ABP框架或者接触时间还不是很长的小伙伴来说,我建议还是使用官方建议的做法,那就是到ABP ...

  10. maven archetype二三事

    maven plugin 创建maven archetype 骨架的plugin是 <plugin> <groupId>org.apache.maven.plugins< ...