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
随机推荐
- cesium核心类Viewer简介
1.简单描述Viewer Viewer类是cesium的核心类,是地图可视化展示的主窗口,cesium程序应用的切入口,扮演必不可少的核心角色. 官网的英文解析如下: A base widget fo ...
- Maven仓库搭建和配置
maven在本地搭建仓库的实际需求maven在项目构建过程需要下载一些必要的软件包,这些默认的下载链接都是访问maven的远程中央仓库Central Repo.如果项目中的成员,每次第一次构建的时候都 ...
- IIS启动失败,启动Windows Process Activation Service时,出现错误13:数据无效 ;HTTP 错误 401.2 - Unauthorized 由于身份验证头无效,您无权查看此页
因为修改过管理员账号的密码后重启服务器导致IIS无法启动,出现已下异常 1.解决:"启动Windows Process Activation Service时,出现错误13:数据无效&quo ...
- 凭吊一下ASP.NET 5,然后跨平台,越跨越开心
ASP.NET 5 is dead ASP.NET 5在今年早些时候被宣判死刑了.但是这并不影响我们之前在ASP.NET 5乃至ASP.NET MVC平台上的经验累积--没错,微软改名部门又立功了!他 ...
- 电商系统中的商品模型的分析与设计—续
前言 在<电商系统中的商品模型的分析与设计>中,对电商系统商品模型有一个粗浅的描述,后来有博友对货品和商品的区别以及属性有一些疑问.我也对此做一些研究,再次简单的对商品模型做一个介 ...
- ABP框架 - 领域事件(EventBus)
文档目录 本节内容: EventBus 注入 IEventBus 获取默认实例 定义事件 预定义事件 处理完异常 实体修改 触发事件 处理事件 处理基类事件 处理程序异常 处理多个事件 处理程序注册 ...
- Entity Framework 6 Recipes 2nd Edition(10-4)译 -> 从存储过程返回一个复杂类型
10-4. 从存储过程返回一个复杂类型 问题 想在方法中使用一个返回复杂类型的存储过程 解决方案 假设我们已经有如Figure 10-3.所示的模型,该Employee (雇员)模型包含Employe ...
- C++ std::array
std::array template < class T, size_t N > class array; Code Example #include <iostream> ...
- 从 Everything 到 Listary,自 Launch 归 Wox
人生即在于体验,而体验源于去尝试,去折腾,去改变,去塑新.要知道:"过一个平凡无趣的人生实在太容易了,你可以不读书,不冒险,不运动,不写作,不外出,不折腾--但是,人生最后悔的事情就是:我本 ...
- Java 设计模式 —— 单例模式
1. 概念: 单例模式是一种常用的软件设计模式.核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果 ...