为了满足灵活扩展的需要,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. 面向对象相关知识点xmind

  2. Struts2入门(六)——国际化

    一.前言 1.1.国际化简介 国际化是指应用程序在运行的时候,根据客户端请求来自的国家地区.语言的不同而显示不同的界面(简单说就是根据你的地区显示相关地区的语言,如果你现在在英国,那么显示的语言就是英 ...

  3. SharePoint 2013管理中心里【管理服务器上的服务】不见了

    打开管理中心,准备配置Managed Metadata Service,发现"管理服务器上的服务"不见了 那我自己拼url直接访问:http://xxxx/_admin/Serve ...

  4. Android——eclipse下运行android项目报错 Conversion to Dalvik format failed with error 1解决

    在eclipse中导入android项目,项目正常没有任何错误,但是运行时候会报错,(clean什么的都没用了.....)如图: 百度大神大多说是jdk的问题,解决: 右键项目-Properties如 ...

  5. Toast显示图文界面——Android开发之路1

    Toast的多种使用方法 Toast其实是一个功能特别强大的组件,不仅仅可以吐司一个文本内容,还可以吐司图片以及图文混排的界面.具体用法如下: 第一种:简单的纯文本内容的吐司: Toast.makeT ...

  6. asp.net core 负载均衡集群搭建(centos7+nginx+supervisor+kestrel)

    概述 本文目的是搭建三台asp.net core 集群, 并配上 nginx做负载均衡   首先准备要运行的源码 http://pan.baidu.com/s/1c20x0bA 准备三台服务器(或则虚 ...

  7. echo命令

    linux的echo命令, 在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的, 因此有必要了解下echo的用法echo命令的功能是在显示器上显示一段文字,一般起到一个提示的 ...

  8. Lesson 18 He often does this!

    Text After I had had lunch at a village pub, I looked for my bag. I had left it on a chair beside th ...

  9. 揭秘Windows10 UWP中的httpclient接口[2]

    阅读目录: 概述 如何选择 System.Net.Http Windows.Web.Http HTTP的常用功能 修改http头部 设置超时 使用身份验证凭据 使用客户端证书 cookie处理 概述 ...

  10. 虚拟机体验之 VirtualBox 篇 —— 性能强大的经典架构

    前两篇体验了 QEMU 和经过 KVM 加速的 QEMU,并体验了第三方虚拟机管理工具 virt-manager,让我们见识了开源社区的强大和开源虚拟机软件的高质量和高性能.这一篇,我来剖析一下 Vi ...