TCE
项目全称Tiny Communication Engine,意味着小型的通信引擎
RPC技术:
RPC是指远程过程调用(Remote Procedure Call),这种技术被定义出来应该有成长的历史时间。
RPC技术意在消除网络通信的细节,让开发者只需关心具体的业务而不必考虑由于网络、硬件、系统的异构复杂环境。相关的RPC有DCOM,java的RMI,CORBA,VISIBROKER,ICE(zeroc.com)等等。
xmlRPC是基于xml数据格式的RPC封装,相关的使用项目也不老少,但这东东由于是xml格式,数据流量太大,不建议使用。
使用RPC的原因:
传统端到端的通信方式一般都是基于流的数据传递,应用消息在发送端编码并传送到接收端解码。 这是一个重复造轮子的过程,不同的应用协议由于规格不同,消息到流的序列化和反序列化过程不可避免。这个过程是个容易出错的过程,应用协议的改动则必须再次修改编解码代码,这不该是提倡的,且显得异常无奈和低端。
流式的数据在接收之后必须进行应用类型的消息分拣,以便分派消息到不同的处理函数,这个过程同样也会被重复的编写。
TCE是RPC的实现:
因为是轻量级的,所以很容易被修改、扩展或者被重新定义。
目前已经支持多种开发语言和通信方式。
TCE的功能特点:
1.多通信协议: rpc的消息可以在多种协议上被交换,协议包括:socket,websocket,MQ,http。 socket应用于最常见的端端通信,c,s两端直接socket完成通信; websocket支持html5的javascript与服务器的通信; MQ 指集群系统之间消息队列作为数据传递总线时,Rpc消息作为MQ的消息包被传递交换。
2.基于接口级别的调用: 这种模式完全不同与流消息传递,用户无需关心消息如何被序列化和反序列化,并且无需参与消息类型到处理业务函数的分拣,这一切都是自动的,A只需调用B的一个函数接口即可
3.多语言支持: TCE目前实现的语言有c++,java,javascript,as3,python 支持在这些语言之间互相接口调用。
4.一致的通信服务:
tce内置高性能的通信服务器,c++版本采用boost::asio,python版本采用gevent作为通信引擎
5. 多种调用模式:
normal-call (twoway) - client调用server接口,此刻线程被阻塞,直到server处理返回
oneway-call - client调用server接口之后即刻返回,这种适用于挥发性的调用请求类型,例如:心跳包
timeout-call - client调用server接口,此刻线程被阻塞,直到server处理返回,如果超时,线程会被解除阻塞
async-call - client调用server接口之后即刻返回,server处理返回之后将回调client的异步处理函数
reversed-call - NAT网络模式下,client发起RPC调用时将建立与server的socket连接,并请求server端RPC接口;反向调用指server端凭借此连接调用client端的RPC接口
接口定义语言(IDL):
不同的Rpc的实现都有自己的定义规格,TCE的规格类似与ICE。
文件命名:<interface>.idl
1. 数据类型:
--name size c++ java python as3 javascript
byte 1 int8 byte int byte
short 2 int16 short int
int 4 int32 int int
float 4 float float float
long 8 int64 long int
double 8 double long float
string - std::string String str
bool 1 bool boolean True/False
sequence std::vector Vector [] Array Array
dictionary std::map HashMap {} HashMap Hash
struct struct class class class function
1. module: 系统模块定义,同一个接口文件中可以包含多个module定义
module first{ ... }
module second{ ... }
2. struct : 数据结构定义
struct Student{
int no;
string name;
int grade;
};
3. sequence: 数组
sequence<int> IdList;
sequence<string> StrList;
4. dictionary: 哈希结构
dictionary<string,Student> StudentList;
5. interface : 接口定义
interface GisServer{
string Authorize(string user,string passwd);
GpsData getGpsData(string device_id);
};