前段时间用了一下Facebook的开源RPC框架Thrift,作PHP客户端调用C++后端程序,真心以为Thrift不错!php
本文项目地址: https://github.com/zekunyan/ThriftDemo_PHP_CPPjava
先看看本文的例子示意图:git
远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通讯协议。该协议容许运行于一台计算机的程序调用另外一台计算机的子程序,而程序员无需额外地为这个交互做用编程。 — 维基百科 - 远程过程调用程序员
通俗点讲,就是跨计算机、跨网络调用。github
Apache Thrift 是Facebook实现的一种高效的、支持多种编程语言的远程服务调用(RPC)的框架。它采用接口描述语言定义并建立服务,支持可扩展的跨语言服务开 发,所包含的代码生成引擎能够在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等建立高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优点。 — Apache Thrift - 可伸缩的跨语言服务开发框架apache
在利用Thrift开发的过程当中,重点就是编写接口定义文件。通常来讲,接口定义文件决定了RPC过程当中的通讯数据结构、通讯接口定义等。编程
总的来讲,thrift的接口定义语法相似于C语言,包含了struct、enum、map、list等基础数据结构,同时支持大部分基本数据类型,如32位整型“i32”等。后端
详细的接口定义请参考:浏览器
看看本例子中的定义文件“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); }
是的,生成代码!这是我以为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的代码时,会生成一个“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 *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客户端的编写比较简单,直接参考代码吧: https://github.com/zekunyan/ThriftDemo_PHP_CPP/blob/master/PHP/client.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是个好东西!就是文档好少=。=