来现在这个公司之后,开始接触了thrift接口,从开始的一窍不通,到现在终于是能够理解并且熟练使用了,当然理解的不是很深,但是足够可以用了,一直想找个时间总结一下的。现在终于是可以简单的总结一下了。
百度百科是这样定义thrift的thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
有一定开发经验的人,都应该懂利用接口和模块化的好处。thrift可以很方便的实现跨语言的通信,并且其效率非常的高。是由facebook开发的。其实其原理是根据开发人员定义的.thrift文件,用生成器生成相应语音的接口脚本。这个脚本主要是由数据类型和server组成。并且是强类型的。对于php开发人员来说也是要特别注意的,因为php是弱类型的。你用’1′和1在其他时候使用可能感觉不到,但是在用thrift时就要注意了。下面就结合一个thrift文件简单将一下。
thrift文件内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
include "Exception.thrift" #通用返回值类型 enum paramType { STRING = 1, ILIST = 2, MAP = 3, MAPLIST = 4, MAPMAP = 5, } #通用返回值数据类型 struct ParamItem{ 1: required string name, 2: required paramType paramtype, 3: optional string valString, 4: optional list<string> valList, 5: optional map<string,string> valMap, 6: optional list<map<string,string>> valMaplist, 7: optional map<string,map<string,string>> valMapMap, } #通用接口数据类型 struct GenData { 1:required string nameSpace, 2:required string funcName, 3:required list<map<string, string>> params, 4:optional string token, } #服务端接口 service AmcService { #通用接口 ParamItem multiCall(1:GenData genData) throws (1:Exception.AnonymousException e), } |
首先看service,定义了一个multiCall方法,传入参数是GenData类型的一个数据,后面这个genData不用关系可以随便定义,因为这就好像是funtion a($b)里面的$b一样,他是给接口内部使用的,接收传入参数的,需要注意的是,这个数据类型是前面定义的,struct GenData这个数据类型,他有4个参数,三个必选参数,一个可选参数。一个string类型的nameSpace,一个string类型的funcName,一个二维数组的params,一个可选的string类型的token。这几个参数是需要一一对应的,名字,类型也需要一样。ParamItem是一个返回类型,即调用这个接口后的返回值,同理也是在上面定义的。大家可以看一下是一个道理。包含文件,是thrift的一个文件。总体的意思就是,你客户端的传入产生和服务端的返回参数要符合接口文件的定义。
这个文件有了,就需要用接口编译工具编译一下,下载一个thrift.exe,我用的是0.8的。
1 2 3 |
thrift -gen php:server Hello.thrift 生成php的服务端需要加server thrift -gen py Hello.thrift 生成python 。。。。等等 |
我以php为例;编译后会生成一个gen-php目录,目录里面是以接口文件定义的service目录,里面有两个文件,一个server一个类型,都是php文件。
使用:
客户端:
这里也使用php做客户端,用什么语言做客户端,你需要下载对应语言的thrift框架库,包含。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//加载Thrift主文件 require BASEPATH.'/ThriftGen/Thrift.php'; //Buffer下发使用 require $GLOBALS['THRIFT_ROOT'].'/transport/TMemoryBuffer.php'; require $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php'; require $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php'; require $GLOBALS['THRIFT_ROOT'].'/transport/TServerSocket.php'; require $GLOBALS['THRIFT_ROOT'].'/transport/THttpClient.php'; require $GLOBALS['THRIFT_ROOT'].'/transport/TTransportFactory.php'; require $GLOBALS['THRIFT_ROOT'].'/transport/TPhpStream.php'; require $GLOBALS['THRIFT_ROOT'].'/server/TSimpleServer.php'; require $GLOBALS['THRIFT_ROOT'].'/packages/AmcService/AmcService.php'; $socket = new THttpClient($_SERVER['HTTP_HOST'], 80, '/index.php?srv=Server_Amc'); $transport = new TBufferedTransport($socket, 1024, 1024); $protocol = new TBinaryProtocol($transport); $client = new AmcServiceClient($protocol); $data = new GenData(); $list = array ( 0=>array( 'id' =>110, ), 1=>array( 'id' => 111, ), ); $data->nameSpace = 'aa'; $data->funcName = 'bb'; $data->params = $list; $data->token = ""; print_r($client->multiCall($data)); |
这样服务端就可以接收到
服务端根据传入参数进行操作就可以了。就是需要满足接口文件返回值数据类型的定义。只要参数可以传递,我们就可以根据自己的需要和逻辑加上彼此的约定来实现功能了。
使用起来还是很好用的。尤其是配合try catch使用
程序本天成,妙手偶得之!我们只是代码的搬运工!
转载请注明:http://www.521php.com/archives/1691/
2014年04月26日 下午 1:56 任务易 | 引用 | #1
谢谢分享,学习了