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是个好东西!就是文档好少=。=
  • 相关阅读:
    171. Excel Sheet Column Number (Easy)
    349. Intersection of Two Arrays (Easy)
    453. Minimum Moves to Equal Array Elements (Easy)
    657. Judge Route Circle (Easy)
    CSS笔记
    保存页面状态
    UI开发总结
    ubuntu 下配置munin
    反向代理配置
    JavaScript 高级程序设计第二版
  • 原文地址:https://www.cnblogs.com/archoncap/p/5219392.html
Copyright © 2011-2022 走看看