编写自己的RPC通信框架-1

编写自己的RPC通信框架-1
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);
          };

             

你可能感兴趣的:(编写自己的RPC通信框架-1)