spider RPC开发指南
请访问https://git.oschina.net/zhjh256/io-spider获取最新更新。
协议与兼容性
spider使用java语言开发,使用Spring作为IoC容器,采用TCP/IP协议,在此基础上,结合SaaS系统模式的特性进行针对性和重点设计,以更加灵活和高效的满足多租户系统、高可用、分布式部署的要求。
采用JSON作为序列化机制,后续版本可能会考虑支持protobuf(java/c++/c#均有类库支持)。
为了最大化性能以及稳定性,spider基于Sun JDK1.8进行编译并应避免使用deprecated特性。
为了尽可能的适应各环境以及互联网应用,spider应能至少运行于tomcat/jboss应用服务器下。
部署模式
任何时候,Spider可运行于中心化管理模式或独立管理模式之一。
中心化管理模式:中心化模式要求必须启用服务中心。对于有几十个运行节点的大规模部署而言,通常增加或者减少一个节点/拆分服务需要进行的配置文件数量会很多,通常位于新增节点上游的各节点都需要修改相应的路由和对应的服务器参数。采用中心化管理模式,只需要登录服务中心修改相关配置即可,节点的变化会自动推送给相应的上游节点。运行于中心化管理模式时,可在服务中心查看整个平台中所有节点的健康状态、各服务的TPS、响应时间等。
独立管理模式:独立管理模式无需启用服务中心。当节点数量较少,比如整个平台不超过十个节点时,采用独立模式通常会比中心化管理模式更简单。运行于独立管理模式时,可通过spider提供的restful api查看当前节点的运行状态。
服务标识
Spider支持两种服务发布注解。
spider定义了两个自定义注解用于标识spider服务。
服务模块
@Retention(RetentionPolicy.RUNTIME)
public @interface ServiceModule {
String subSystemId() default "0";
}
@ServiceModule只是一个类注解,具有该注解的接口将被认为是spider服务接口类,定义在该接口中是被标识为spider服务的必要条件。
服务接口
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Service {
String serviceId(); // 服务编号,8位ASCII字符,其中00000000-00000099为spider内部保留,00000100-00000199为服务中心保留
String desc(); //服务描述
int timeout() default 0; //超时时间,单位毫秒
boolean needLog() default false; //设置是否记录日志
int broadcast() default 0; //设置该请求是否广播,0:不广播;1:广播但无需相应;2:广播并响应
}
@Service是一个方法注解,其包含三个属性,分别用于设置spider服务号,spider服务描述,spider服务超时时间。其中超时时间可选,默认为spider.xml中设置的超时时间,如果spider.xml中未定义,则默认为300秒。
只有定义在由@ServiceModule注解的接口中由@Service注解的方法才会被标识为spider服务,正确发布后,该接口可用于提供服务或者代理调用远程服务。
对于broadcast=2的服务,其返回值必须包装在com.ld.net.spider.pojo.BroadcastResult的data属性中,具体见该类的javadoc说明。
环境变量
spider有一些环境变量用于控制相关选项,目前有下列可设置的环境变量,如下所示:
l SPIDER_LOG,默认/tmp/spider/stat/${nodeName}
l SPIDER_HOME,默认/usr/local/spider/${nodeName}
l SPIDER_CONFIG,指定spider.xml启动文件,默认classpath:spider.xml,见配置文件一节。
配置文件
参考配置文件一节。
服务发布与代理
服务发布:spider.localService插件下的serviceExportPackage元素定义了spider节点作为服务器时自动对外发布的spider服务的包路径,以;或,分隔。只要服务端在该参数上设置了相关路径,java客户端只要在serviceProxyPackage参数上设置对应路径就可以直接通过@Autowired依赖注入方式调用远程服务端包下提供的相应服务。
服务代理:对于java客户端而言,spider提供了自动代理功能,开发者可像调用本地Spring服务一样调用远程服务器上的spider服务,开发者只需要在spider.localService插件下的serviceExportPackage元素上定义需要自动代理的spider服务的包路径,以;或,分隔。对于非java客户端比如C#或C++客户端而言,开发者需要调用对应的SDK Client。
发布的服务和代理的服务不能有交叉。如果一个服务既需要在本地处理,又需要spider代理转发给下游服务器,则配置在发布列表。此时这些服务无法通过用户编程来远程调用。通常这些服务是用于特殊目的,且被标记为broadcast。
PS:从技术上来说,只要客户端和服务端同一个服务的方法签名和服务号相同就能够调用(也就是方法名无关),不过不建议这么做,在将来的版本中也可能会要求完全匹配。
还需要注意的是,如果某个spider节点希望作为NB的角色,在serviceExportPackage配置了发布路径,同时又包含了某个服务的实现,如果该服务的路由条目被解析到本地处理,则该服务会在该NB节点被处理,而不会继续往后转发,这一点需要注意。所以,对于作为NB的角色,建议除了广播的服务,不要配置在serviceExportPackage下。
各种数据类型支持情况
spider当前版本支持除byte[]外基本上所有类型的数据类型,包括泛型对象。
服务接口定义要求
综合考虑灵活性,性能,开发效率,建议服务参数和返回值均采用对象(现有的RPC框架基本都采用这种模式,比如gRPC,ICE),同时参数继承SpiderBizHead类(其中包含了设置动态路由等相关信息)。如下所示:
入参DTO:
public class ServiceReq extends SpiderBizHead /*如果无需动态路由功能,则不必继承SpiderBizHead*/ {
}
服务签名:
@ServiceModule()
public interface DemoService {
@Service()
public ServiceResp addServer(ServerReq req);
}
还要考虑C++以及其他在用编程语言实现动态代理的简易性。
对于C#,可参考System.Runtime.Remoting.Proxies.RealProxy类实现。
spider RPC开发指南的更多相关文章
- spider RPC入门指南
本部分将介绍使用spider RPC开发分布式应用的客户端和服务端. spider RPC中间件基于J2SE 8开发,因此需要确保服务器上安装了JDK 8及以上版本,不依赖于任何额外需要独立安装和配置 ...
- spider RPC框架的需求来源与特性介绍(一)
spider RPC 特性介绍 spider RPC 性能测试 spider RPC 入门指南 spider RPC 配置文件参考 spider RPC 开发指南 spider RPC 安全性 spi ...
- spider RPC插件化体系
为了满足灵活扩展的需要,spider支持灵活的自定义插件扩展,从功能上来说,插件和过滤器的差别在于过滤器不会阻止请求的执行同时对于主程序不会有API上的影响(比如servlet 过滤器和监听器)(最多 ...
- axis1,xfire,jUnit 测试案列+开Web Service开发指南+axis1.jar下载 代码
axis1,xfire,jUnit 测试案列+Web Service开发指南(中).pdf+axis1.jar下载 代码 项目和资源文档+jar 下载:http://download.csdn. ...
- spider RPC更新至2.0.0-RELEASE
spider使用java语言开发,使用Spring作为IoC容器,采用TCP/IP协议,在此基础上,结合SaaS金融交易系统的特性进行针对性和重点设计,以更加灵活和高效的满足金融交易系统多租户.高可用 ...
- protocol buffer开发指南(官方)
欢迎来到protocol buffer的开发者指南文档,一种语言无关.平台无关.扩展性好的用于通信协议.数据存储的结构化数据序列化方法. 本文档是面向计划将protocol buffer使用的到自己的 ...
- jstorm开发指南-写个简单的jstorm应用
jstorm开发指南-写个简单的jstorm应用 发表于 2015-07-18 | 分类于 大数据 | 暂无评论 jstorm 是阿里巴巴开源的基于storm采用Java重写的一套分布 ...
- Android进程和线程(Android开发指南--译)
(转自:http://www.cnblogs.com/xitang/archive/2011/09/24/2189460.html) Processes and Threads 译者署名: 呆呆大虾 ...
- 基于第三方开源库的OPC服务器开发指南(3)——OPC客户端
本篇将讲解如何编写一个OPC客户端程序测试我们在前文<基于第三方开源库的OPC服务器开发指南(2)——LightOPC的编译及部署>一篇建立的服务器.本指南的目的是熟悉OPC服务器的开发流 ...
随机推荐
- RabbitMQ + PHP (三)案例演示
今天用一个简单的案例来实现 RabbitMQ + PHP 这个消息队列的运行机制. 主要分为两个部分: 第一:发送者(publisher) 第二:消费者(consumer) (一)生产者 (创建一个r ...
- 移动BPM解决方案分享
畅通开放 无边界的渠道 效率倍增 更高效的处理方式 即时共享 更强大的决策能力 各种终端应用 帮您实现:新任务通知.任务预警.催办.任务审批.任何数据汇总提醒消息通知...... 短信 客户端: ...
- android Notification介绍
如果要添加一个Notification,可以按照以下几个步骤 1:获取NotificationManager: NotificationManager m_NotificationManager=(N ...
- POJ1149 PIGS [最大流 建图]
PIGS Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 20662 Accepted: 9435 Description ...
- Object是什么
Object是什么 .Net程序员们每天都在和Object在打交道如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类" ...
- mysql join 和left join 对于索引的问题
今天遇到一个left join优化的问题,搞了一下午,中间查了不少资料,对MySQL的查询计划还有查询优化有了更进一步的了解,做一个简单的记录: select c.* from hotel_info_ ...
- [故障公告]受阿里云部分ECS服务器故障影响,目前无法上传图片与文件
抱歉!今天下午阿里云华东1可用区B的部分ECS服务器出现IO HANG问题,受此影响,我们的图片与文件上传服务器无法访问,由此给您带来麻烦,请您谅解. 16:30左右开始,我们发现图片与文件上传服务器 ...
- Windows 上安装 Jekyll.
Jekyll是一个静态网站生成工具.它允许用户使用HTML.Markdown或Textile来建立静态页面,然后通过模板引擎Liquid(Liquid Templating Engine)来运行. 原 ...
- Direct3D Draw函数 异步调用原理解析
概述 在D3D10中,一个基本的渲染流程可分为以下步骤: 清理帧缓存: 执行若干次的绘制: 通过Device API创建所需Buffer: 通过Map/Unmap填充数据到Buffer中: 将Buff ...
- 跟我一起数据挖掘(23)——C4.5
C4.5简介 C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法.它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类.C4.5的目 ...