zoukankan      html  css  js  c++  java
  • RPC框架Thrift例子-PHP调用C++后端程序

    RPC框架Thrift例子-PHP调用C++后端程序

    前言
    
    前段时间用了一下Facebook的开源RPC框架Thrift,做PHP客户端调用C++后端程序,真心觉得Thrift不错!
    
    本文项目地址: https://github.com/zekunyan/ThriftDemo_PHP_CPP
    
    先看看本文的例子示意图:
    
    
    
    流程
    
    PHP客户端发起请求,请求参数是“Request”类型,里面有studentID参数。
    CPP服务端收到请求返回数据,返回类型为“Response”,里面包含了student的信息,此处只是简单的示例。
    定义
    
    什么是RPC
    
    远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程。 — 维基百科 - 远程过程调用
    
    通俗点讲,就是跨计算机、跨网络调用。
    
    什么是Thrift
    
    Apache Thrift 是Facebook实现的一种高效的、支持多种编程语言的远程服务调用(RPC)的框架。它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。 — Apache Thrift - 可伸缩的跨语言服务开发框架
    
    开发流程
    
    配置环境。C++的如CMake、make、g++;PHP的如php、php-fpm、Apache(Nginx)。
    根据需求,编写thrift接口定义文件(IDL定义文件)。
    使用thrift程序,为不同的语言生成代码。
    根据需求,修改生成的代码(主要是Server端),编写实际的业务逻辑。
    编译、部署。
    Thrift的接口定义文件
    
    在利用Thrift开发的过程中,重点就是编写接口定义文件。一般来说,接口定义文件决定了RPC过程中的通信数据结构、通信接口定义等。
    
    总的来说,thrift的接口定义语法类似于C语言,包含了struct、enum、map、list等基础数据结构,同时支持大部分基本数据类型,如32位整型“i32”等。
    
    详细的接口定义请参考:
    
    Thrift interface description language
    example.thrift
    看看本例子中的定义文件“TTG.thrift”:
    
    namespace cpp TTG
    namespace php TTG
    
    enum ResponseState {
        StateOk = 0,
        StateError = 1,
        StateEmpty = 2
    }
    
    struct Request {
        1: i32 studentID = 0
    }
    
    struct Response {
        1: i32 studentID = 0,
        2: string name,
        3: list<string> infos,
        4: ResponseState state
    }
    
    service TTGService {
        Response getStudentInfo(1: Request request);
    }
    先定义命名空间,尽量减少命名冲突。
    Request类型:PHP客户端请求的数据类型。
    Response类型:CPP服务端返回的数据类型。
    ResponseState枚举:定义返回的状态。
    TTGService:服务接口定义。
    生成对应语言的代码!
    
    是的,生成代码!这是我觉得Thrift框架最“神奇”的地方。我们只需要执行几条命令,就可以根据接口定义文件“生成”对应语言的代码。然后我们只需要将对应的业务逻辑加入到生成的代码中即可。
    
    如生成CPP服务端的代码:
    
    thrift --gen cpp TTG.thrift
    然后就会生成如下代码。
    
    TTGService.cpp
    TTGService.h
    TTGService_server.skeleton.cpp
    TTG_constants.cpp
    TTG_constants.h
    TTG_types.cpp
    TTG_types.h
    根据需要修改生成的代码
    
    生成CPP、PHP端的代码以后,我们就可以根据需要修改、添加业务代码。
    
    CPP服务端
    
    在生成CPP的代码时,会生成一个“TTGService_server.skeleton.cpp”文件,这个就是我们的CPP服务端的代码“架子”。其中重点如下:
    
    //实现调用的接口
    class TTGServiceHandler : virtual public TTGServiceIf {
     public:
      TTGServiceHandler() {
        // Your initialization goes here
      }
    
      //接口实现部分,实现getStudentInfo这个接口的具体细节,如根据request创建、返回对应的response
      void getStudentInfo(Response& _return, const Request& request) {
        // Your implementation goes here
        printf("getStudentInfo
    ");
      }
    
    };
    //...
    我们将其改成:
    
    void getStudentInfo(Response &_return, const Request &request) {
      // 输出请求参数
      cout<<"Request: "<<request.studentID<<endl;
      // 创建返回数据
      Response *response = new Response();
      //填充数据
      response->studentID = request.studentID;
      response->name = "tutuge";
      response->infos.push_back("Info 1");
      response->infos.push_back("Info 2");
      response->state = ResponseState::StateOk;
      //返回
      _return = *response;
    }
    
    至此,CPP服务端的编写就完成了,接下来我们只需要编译、链接,执行最终生成的可执行文件即可。
    
    PHP客户端
    
    PHP客户端的编写比较简单,直接参考代码吧:https://github.com/zekunyan/ThriftDemo_PHP_CPP/blob/master/PHP/client.php
    
    编译、链接,运行
    
    用CMake,或者直接编写makefile均可,保证Thrift装好就行了。
    
    直接运行最后生成的可执行文件TTG.run即可。
    
    从浏览器,或者直接运行client.php,即可看到如下输出:
    
    object(TTGResponse)[9]
      public 'studentID' => int 100
      public 'name' => string 'tutuge' (length=6)
      public 'infos' => 
        array (size=2)
          0 => string 'Info 1' (length=6)
          1 => string 'Info 2' (length=6)
      public 'state' => int 0
    总结
    
    Thrift是个好东西!就是文档好少=。=
  • 相关阅读:
    Akka(2):Actor生命周期管理
    Akka(1):Actor
    Akka(0):聊聊对Akka的初步了解和想法
    FunDA:一个开源的函数式数据处理工具库,也是Slick的补充
    FunDA(17)- 示范:异常处理与事后处理
    FunDA(16)- 示范:整合并行运算
    FunDA(15)- 示范:任务并行运算
    FunDA(14)- 示范:并行运算,并行数据库读取
    FunDA(13)- 示范:用户自定义操作函数
    thinkjs中自定义sql语句
  • 原文地址:https://www.cnblogs.com/archoncap/p/5219392.html
Copyright © 2011-2022 走看看