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);
};