博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RPC框架Thrift例子-PHP调用C++后端程序
阅读量:6472 次
发布时间:2019-06-23

本文共 2843 字,大约阅读时间需要 9 分钟。

更新

  • 2016-02-22: Response对象不用主动创建。

前言

前段时间用了一下Facebook的开源RPC框架Thrift,做PHP客户端调用C++后端程序,真心觉得Thrift不错!

本文项目地址:

先看看本文的例子示意图:

 

通信示意图

 

流程

  1. PHP客户端发起请求,请求参数是“Request”类型,里面有studentID参数。
  2. 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 体积更小,对于高并发、大数据量和多语言的环境更有优势。 – 

开发流程

  1. 配置环境。C++的如CMake、make、g++;PHP的如php、php-fpm、Apache(Nginx)。
  2. 根据需求,编写thrift接口定义文件(IDL定义文件)。
  3. 使用thrift程序,为不同的语言生成代码。
  4. 根据需求,修改生成的代码(主要是Server端),编写实际的业务逻辑。
  5. 编译、部署。

Thrift的接口定义文件

在利用Thrift开发的过程中,重点就是编写接口定义文件。

一般来说,接口定义文件决定了RPC过程中的通信数据结构、通信接口定义等。

总的来说,thrift的接口定义语法类似于C语言,包含了struct、enum、map、list等基础数据结构,同时支持大部分基本数据类型,如32位整型“i32”等。

详细的接口定义请参考:

看看本例子中的定义文件“TTG.thrift”:

  1. namespace cpp TTGnamespace php TTGenum ResponseState {    StateOk = 0,    StateError = 1,    StateEmpty = 2}struct Request {    1: i32 studentID = 0}struct Response {    1: i32 studentID = 0,    2: string name,    3: list
    infos, 4: ResponseState state}service TTGService { Response getStudentInfo(1: Request request);}

     

    生成对应语言的代码!先定义命名空间,尽量减少命名冲突。
  2. Request类型:PHP客户端请求的数据类型。
  3. Response类型:CPP服务端返回的数据类型。
  4. ResponseState枚举:定义返回的状态。
  5. TTGService:服务接口定义。

是的,生成代码!这是我觉得Thrift框架最“神奇”的地方。我们只需要执行几条命令,就可以根据接口定义文件“生成”对应语言的代码。然后我们只需要将对应的业务逻辑加入到生成的代码中即可。

如生成CPP服务端的代码:

 

thrift --gen cpp TTG.thrift

 

 然后就会生成如下代码。

TTGService.cppTTGService.hTTGService_server.skeleton.cppTTG_constants.cppTTG_constants.hTTG_types.cppTTG_types.h

 

生成CPP、PHP端的代码以后,我们就可以根据需要修改、添加业务代码。根据需要修改生成的代码

CPP服务端

在生成CPP的代码时,会生成一个“TTGService_server.skeleton.cpp”文件,这个就是我们的CPP服务端的代码“架子”。其中重点如下:

 

//实现调用的接口class TTGServiceHandler : virtual public TTGServiceIf {public:TTGServiceHandler() {    // Your initialization goes here}//接口实现部分,实现getStudentInfo这个接口的具体细节,如根据request创建、返回对应的responsevoid getStudentInfo(Response& _return, const Request& request) {    // Your implementation goes here    printf("getStudentInfo\n");}};//...

 

 我们将其改成:

void getStudentInfo(Response &_return, const Request &request) {    // 输出请求参数    cout<<"Request: "<
<

 

PHP客户端至此,CPP服务端的编写就完成了,接下来我们只需要编译、链接,执行最终生成的可执行文件即可。

PHP客户端的编写比较简单,直接参考代码吧:

编译、链接,运行

用CMake,或者直接编写makefile均可,保证Thrift装好就行了。

直接运行最后生成的可执行文件TTG.run即可。

从浏览器,或者直接运行client.php,即可看到如下输出:

object(TTG\Response)[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是个好东西!就是文档好少=。=总结

参考

http://tutuge.me/2015/04/19/thrift-example-cpp-and-php/?utm_source=tuicool&utm_medium=referral

转载地址:http://krpko.baihongyu.com/

你可能感兴趣的文章
[模板] 快速傅里叶变换/FFT/NTT
查看>>
DecimalFormat 数据格式设置 SimpleDateFormat时间格式的用法介绍 --转载
查看>>
Android 的Margin和Padding属性以及支持的长度单位
查看>>
653. Two Sum IV - Input is a BST
查看>>
HDU ACM 1050 Moving Tables
查看>>
Django templates加载css/js/image等静态资源
查看>>
Eclipse C + GTK2.0环境构筑
查看>>
caffe solver
查看>>
Rhel6-heartbeat+lvs配置文档
查看>>
[CF340D]Bubble Sort Graph/[JZOJ3485]独立集
查看>>
ORACLE分科目统计每科前三名的学生的语句
查看>>
第一次冲刺--查看活动详情用户场景分析
查看>>
0317复利计算的回顾与总结
查看>>
函数对象
查看>>
Sharepoint学习笔记—习题系列--70-573习题解析 -(Q70-Q72)
查看>>
最全最新个税计算公式---今天你税了吗?
查看>>
linux shell 正则表达式(BREs,EREs,PREs)差异比较(转,当作资料查)
查看>>
MongoDB--CSharp Driver Quickstart .
查看>>
#pragma mark 添加分割线 及 其它类似标记 - 转
查看>>
遗传算法实现自动组卷、随机抽题 (转)
查看>>