RPC框架Thrift例子-PHP调用C++后端程序
更新
- 2016-02-22: Response对象不用主动创建。
前言
前段时间用了一下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”等。
详细的接口定义请参考:
看看本例子中的定义文件“TTG.thrift”:
namespace cpp TTG
namespace php TTG enum ResponseState {
StateOk = ,
StateError = ,
StateEmpty =
} struct Request {
: i32 studentID =
} struct Response {
: i32 studentID = ,
: string name,
: list<string> infos,
: ResponseState state
} service TTGService {
Response getStudentInfo(: 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\n");
} };
//...
我们将其改成:
void getStudentInfo(Response &_return, const Request &request) {
// 输出请求参数
cout<<"Request: "<<request.studentID<<endl; //填充数据,Response对象不用主动创建,进入函数时已经创建好了
_return.studentID = request.studentID;
_return.name = "tutuge";
_return.infos.push_back("Info 1");
_return.infos.push_back("Info 2");
_return.state = ResponseState::StateOk;
}
PHP客户端至此,CPP服务端的编写就完成了,接下来我们只需要编译、链接,执行最终生成的可执行文件即可。
PHP客户端的编写比较简单,直接参考代码吧:https://github.com/zekunyan/ThriftDemo_PHP_CPP/blob/master/PHP/client.php
编译、链接,运行
用CMake,或者直接编写makefile均可,保证Thrift装好就行了。
直接运行最后生成的可执行文件TTG.run即可。
从浏览器,或者直接运行client.php,即可看到如下输出:
object(TTG\Response)[]
public 'studentID' => int
public 'name' => string 'tutuge' (length=)
public 'infos' =>
array (size=)
=> string 'Info 1' (length=)
=> string 'Info 2' (length=)
public 'state' => int
Thrift是个好东西!就是文档好少=。=总结
参考
http://tutuge.me/2015/04/19/thrift-example-cpp-and-php/?utm_source=tuicool&utm_medium=referral
RPC框架Thrift例子-PHP调用C++后端程序的更多相关文章
- .Net RPC框架Thrift的用法
关于Thrift 下面是来自百度百科关于Thrift的介绍: thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和引擎,以构建在 C++, Java, Go ...
- rpc框架: thrift/avro/protobuf 之maven插件生成java类
thrift.avro.probobuf 这几个rpc框架的基本思想都差不多,先定义IDL文件,然后由各自的编译器(或maven插件)生成目标语言的源代码,但是,根据idl生成源代码这件事,如果每次都 ...
- rpc框架thrift
跨语言的rpc框架 新建一个thrift文件 # ping service demoservice PingService { string ping(), ping函数的返回类型是字符串} serv ...
- RPC框架基本原理(三):调用链路分析
本文主要阐述下RPC调用过程中的寻址,序列化,以及服务端调用问题. 寻址 随机寻址 从可用列表中,随机选择地址 一致性寻址 可用服务地址一致性hash管理:根据可服务的地址,构造treemap,计算c ...
- [development][thrift] RPC框架 thrift
一: wiki:https://zh.wikipedia.org/wiki/Thrift 二: 来自IBM的介绍:https://www.ibm.com/developerworks/cn/java/ ...
- cygwin上编译RPC框架thrift
cygwin的配置就不多说了,缺什么就通过安装器安装好了. 在thrift的官网下载 thrift-0.11.0源码,通过cmake编译,生成Makefile之后,make出现编译错误 /cygdri ...
- RPC框架 - thrift 客户端
-------客户端程序 ------ 下载 下载 thrift 源代码包 下载 thrift 的bin包 准备描述文件(使用源代码包的示例文件) \thrift-0.10.0\tu ...
- RPC框架 - thrift 服务端
-------服务端程序 ------ 下载 下载 thrift 源代码包 下载 thrift 的bin包 准备描述文件(使用源代码包的示例文件) \thrift-0.10.0\tu ...
- 分布式架构探索 - 2. WebService RPC框架之Apache CXF
Apache CXF是一个开源的WebService RPC框架. 例子: 1. 新建一个maven web项目, 添加pom 如下: <?xml version="1.0" ...
随机推荐
- 树-哈夫曼树(Huffman Tree)
概述 哈夫曼树:树的带权路径长度达到最小. 构造规则 1. 将w1.w2.-,wn看成是有n 棵树的森林(每棵树仅有一个结点): 2. 在森林中选出根结点的权值最小的两棵树进行合并,作为一棵新树的左. ...
- RPC框架motan: 通信框架netty( 1)
服务器端编程都离不开底层的通信框架,在我们刚学习java的时候,主要接触都是Socket和ServerSocket 的阻塞编程,后来开始了解NIO,这种非阻塞的编程模式,它可以一个线程管理很多的Soc ...
- iOS开发相关图书推荐
Objective-C编程之道:iOS设计模式解析 作 者 [美] Carlo Chung 著:刘威 译 出 版 社 人民邮电出版社 出版时间 2011-11-01 版 次 1 页 ...
- OpenCV中IplImage和Mat间的相互转换
OpenCV中做图像处理经常用到IplImage和Mat间的相互转换. 首先,cv::Mat是opencv2.0中的数据类型:IplImage是opencv1.0中的类型,两种类型并不相同. 1. I ...
- android sdk manager 闪退 打不开问题
android sdk manager 闪退 打不开问题 环境 win8系统 如果访问不了 dl-ssl.google.com 网址,在C:\Windows\System32\Drivers\etc ...
- 关闭SELinux的两种方法
1 永久方法 – 需要重启服务器 修改/etc/selinux/config文件中设置SELINUX=disabled ,然后重启服务器. 2 临时方法 – 设置系统参数 使用命令setenforce ...
- sublime text2 用ctags插件实现方法定位
sublime text2 用ctags插件实现方法定位(转) 我们用sublime几乎都会首先安装这个插件,这个插件是管理插件的功能,先安装它,再安装其他插件就方便了. 点击sublime的菜单栏 ...
- jeecms附件标签用法
[#if content.attachments?size gt 0] [#list content.attachments as attach] <a id="attach${att ...
- python dict{}和set([])
200 ? "200px" : this.width)!important;} --> 介绍 dict(dictionary),在其他语言中也称为map,使用键-值(key- ...
- ecshop收货人信息中修改手机号为必填
Ecshop 修改收货人信息 把电话改成选择填写 手机改为必填 (加强版) 1. 编辑根目录/js/utils.js 增加手机号码的正则表达式 参照Utils.isTel = function ( ...