spider RPC插件化体系
为了满足灵活扩展的需要,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插件化体系的更多相关文章
- spider RPC开发指南
		协议与兼容性 spider使用java语言开发,使用Spring作为IoC容器,采用TCP/IP协议,在此基础上,结合SaaS系统模式的特性进行针对性和重点设计,以更加灵活和高效的满足多租户系统.高可 ... 
- spider RPC框架的需求来源与特性介绍(一)
		spider RPC 特性介绍 spider RPC 性能测试 spider RPC 入门指南 spider RPC 配置文件参考 spider RPC 开发指南 spider RPC 安全性 spi ... 
- 有关Android插件化思考
		最近几年移动开发业界兴起了「 插件化技术 」的旋风,各个大厂都推出了自己的插件化框架,各种开源框架都评价自身功能优越性,令人目不暇接.随着公司业务快速发展,项目增多,开发资源却有限,如何能在有限资源内 ... 
- so插件化
		--摘自<android插件化开发指南> 1.local.properties添加配置 ndk.dir=/Users/jianqiang/Library/Android/sdk/ndk-b ... 
- fusionjs uber开源的通用web插件化开发框架
		fusionjs uber开源的web 插件化开发框架 核心特性: 基于插件的开发,依赖注入开发 开箱即用的服务器端渲染,构建结果拆分,模块热加载 Tree-shaking 支持 集成的插件 redu ... 
- spider RPC入门指南
		本部分将介绍使用spider RPC开发分布式应用的客户端和服务端. spider RPC中间件基于J2SE 8开发,因此需要确保服务器上安装了JDK 8及以上版本,不依赖于任何额外需要独立安装和配置 ... 
- Android组件化和插件化开发
		http://www.cnblogs.com/android-blogs/p/5703355.html 什么是组件化和插件化? 组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Modul ... 
- ASP.NET MVC 插件化机制
		概述 nopCommerce的插件机制的核心是使用BuildManager.AddReferencedAssembly将使用Assembly.Load加载的插件程序集添加到应用程序域的引用中.具 体实 ... 
- Android 插件化
		1.介绍 涛哥写的文章 <Android 插件化的 过去 现在 未来> http://kymjs.com/code/2016/05/04/01#rd 
随机推荐
- DDD领域驱动设计 - 设计文档模板
			设计文档模板: 系统背景和定位 业务需求描述 系统用例图 关键业务流程图 领域语言整理,主要是整理领域中的各种术语的定义,名词解释 领域划分(分析出子域.核心域.支撑域) 每个子域的领域模型设计(实体 ... 
- iOS10之Expected App Behaviors
			昨天上架到appStore的时候碰到个问题,构建好后上传到itunesconnect的的包都用不了, 显示错误为:此构建版本无效. 或者英文显示为:ITC.apps.preReleaseBuild.e ... 
- 设置Hyper-V和VMware多个服务之间共存
			这个方法是解决多个服务之间不能共存,下面相当于是以Hyper-V和VMware做例子,其他的也适用. 今天准备安装VMware Workstation 10,然后玩玩MAC OS. 没想到,淡定的我双 ... 
- Linux初识
			在这篇文章中你讲看到如下内容: 计算机的组成及功能: Linux发行版之间的区别和联系: Linux发行版的基础目录及功用规定: Linux系统设计的哲学思想: Linux系统上获取命令帮助,及man ... 
- FineReport:任意时刻只允许在一个客户端登陆账号的插件
			在使用FineReport报表系统中,处于账户安全考虑,有些企业希望同一账号在任意时刻智能在统一客户端登录.那么当A用户在C1客户端登陆后,该账号又在另外一个C2客户端登陆,服务器如何取判断呢? 开发 ... 
- Visual Studio Code 配置指南
			Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器.在我看来它是「一款完美的编辑器」. 本文是有关 VS Code 的特性介绍与配置指 ... 
- Electron 不完全快速手册
			Electron能干嘛 Vscode 基于Electron开发的,他是用来开发桌面软件的,可以轻易的跨平台 他的前身是atomshell,图标很丑,不用在意,一点也不像vscode也不用在意. L ... 
- ABP框架 - 缓存
			文档目录 本节内容: 简介 ICacheManager ICache ITypedCache 配置 实体缓存 EntityCache 是如何工作 Redis 缓存集成 简介 ABP提供了一个缓存接口, ... 
- Android点滴
			1,View中getWidth(),getLayoutParams.width,getMeasureedWidth()的区别 2,setCompoundDrawables和setCompoundDra ... 
- php使用CI发送qq和163邮件
			1.需求 发送邮件 2.介绍 使用CI框架的email类库发送邮件,这里演示QQ和163 3.163使用教程 a.先去163邮件开启smtp邮件. b.在CI的控制器里写下面的代码 $this-> ... 
