[转]thrift 轻松实现多语言跨…
来源:互联网 发布:java 手机短信验证码 编辑:程序博客网 时间:2024/06/04 19:11
作者:ys250
来源:http://www.ys250.com/2010/07/03/thrift_py_php/
thrift是由facebook开发的轻量级跨语言的服务框架,现在已经移交到apache基金会下。和他类似的是google出的protocolbuffer和ice。 thrift的一大优势就是支持的语言很丰富,它使用自己的IDL语言来描述服务接口和数据交换的格式。
官方网站:http://incubator.apache.org/thrift/
一、安装:
yum -y install gcc-c++ autoconf automake sysconftool boost / boost-devel libtool perl-ExtUtils-MakeMaker gettext-base / gettext gettext-devel liblocale-gettext-perl zlib-devel / byacc bison flex pkgconfig python-develwget http://apache.freelamp.com/incubator/thrift/0.2.0-incubating/thrift-0.2.0-incubating.tar.gz ./bootstrap.sh ./configure --prefix=/usr/local/thrift --with-ruby=no --with-erlang=no --with-java=no --with-csharp=no --enable-gen-java=no --enable-gen-csharp=no --enable-gen-rb=no --enable-gen-erl=nomakemake install
二、IDL描述:
[c] viewplaincopyprint?
-
"50" rows= "15"name= "code"class="c-sharp"># 1.支持的变量类型 -
- 类型
描述 - bool
# false - byte
#8位的有符号整数 - i16
#16位的有符号整数 - i32
#32位的有符号整数 - i64
#64位的有符号整数 - double
#64位的浮点数 - string
#UTF-8编码的字符串 - binary
#字符数组 - struct
#结构体 - list
#有序的元素列表,类似于STL的vector - set
#无序的不重复元素集,类似于STL的set - map
#key-value型的映射,类似于STL的map - exception
#是一个继承于本地语言的exception基类 - service
#服务包含多个函数接口(纯虚函数) -
- #
2.摘一段例子上来,让瞧瞧这是啥东东。(本例子文件名为:tutorial.thrift,是本身带的教程。) - include
"shared.thrift" -
-
- namespace
cpp tutorial - namespace
java tutorial - namespace
php tutorial - namespace
perl tutorial - namespace
smalltalk.category Thrift.Tutorial -
- typedef
i32 MyInteger -
- const
i32 INT32CONSTANT = 9853 - const
map 'hello':'world',MAPCONSTANT = { 'goodnight':'moon'} -
- enum
Operation { -
ADD = 1, -
SUBTRACT = 2, -
MULTIPLY = 3, -
DIVIDE = 4 - }
-
- struct
Work { -
1: i32 num1 = 0, -
2: i32 num2, -
3: Operation op, -
4: optional string comment, - }
-
- exception
InvalidOperation { -
1: i32 what, -
2: string why - }
-
- service
Calculator extends shared.SharedService { -
-
void ping(), -
-
i32 add(1:i32 num1, 2:i32 num2), -
-
i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch), -
-
oneway void zip() -
- }
-
- #
3. 我们来写个 helloworld.thrift -
- service
HelloWorld{ -
string ping(1: string name), -
string getpng(), - }
[c] viewplaincopyprint?
三、编译 helloworld:
[php] viewplaincopyprint?
- /usr/local/thrift/bin/thrift
-r --gen py helloworld.thrift - /usr/local/thrift/bin/thrift
-r --gen php helloworld.thrift - #会在当前目录下生成
gen-* 目录。
四、编写服务器端:
[python] viewplaincopyprint?
- import
sys - sys.path.append('./gen-py')
-
- from
helloworld importHelloWorld - from
helloworld.ttypes import* -
- from
thrift.transport importTSocket - from
thrift.transport importTTransport - from
thrift.protocol importTBinaryProtocol - from
thrift.server importTServer -
- class
HellowordHandler: -
def __init__ self):( -
pass -
-
def ping self,( name): -
print name '+ from server.' -
return "%s from server." % name -
def getpng self):( -
f = open("./logo.png", "rb") -
c = f.read() -
f.close() -
return c - handler
= HellowordHandler() - processor
= HelloWorld.Processor(handler) - transport
= TSocket.TServerSocket(9090) - tfactory
= TTransport.TBufferedTransportFactor y() - pfactory
= TBinaryProtocol.TBinaryProtocolFactory() -
- server
= TServer.TSimpleServer(processor, transport, tfactory, pfactory) -
- #
You could do one of these for a multithreaded server - #server
= TServer.TThreadedServer(processor, transport, tfactory, pfactory) - #server
= TServer.TThreadPoolServer(processor, transport, tfactory, pfactory) -
- print
'Starting the server...' - server.serve()
- print
'done.'
五、编写客户端:
[php] viewplaincopyprint?
- \<\?php
- try{
-
-
$GLOBALS['THRIFT_ROOT'] = './php/src'; -
require_once $GLOBALS['THRIFT_ROOT'].'/Thrift.php'; -
require_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php'; -
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php'; -
require_once $GLOBALS['THRIFT_ROOT'].'/transport/THttpClient.php'; -
require_once $GLOBALS['THRIFT_ROOT'].'/transport/TBufferedTransport.php'; -
error_reporting(E_NONE); -
$GEN_DIR = './gen-php'; -
require_once $GEN_DIR.'/helloworld/HelloWorld.php'; -
error_reporting(E_ALL); -
-
$socket = newTSocket( '*.*.*.*',9090); -
$transport = newTBufferedTransport( $socket,1024, 1024); -
$protocol = newTBinaryProtocol( $transport); -
$client = newHelloWorldClient( $protocol); -
-
$transport->open(); -
-
$a = $client->ping('xyq' ); -
echo $a; -
-
$transport->close(); -
-
} catch (TException $tx) { -
print 'TException: ' .$tx->getMessage()."/n"; -
} -
- \?\>
按上面的流程就可以写自己的thrift了,我使用py做服务端,用php做客户端,当然也可以使用c++来做服务端。
相关文章:
thrift 安装
redis + thrift + mongodb 数据测试
Thrift基本使用
0 0
- [转]thrift 轻松实现多语言跨…
- [转]thrift 轻松实现多语言跨服务器通信
- thrift 轻松实现多语言跨服务器通信
- thrift 轻松实现多语言跨服务器通信
- thrift 轻松实现多语言跨服务器通信
- 基于Thrift实现跨语言服务
- 用thrift实现多语言相互调用
- Thrift白皮书《Thrift:可扩展的跨语言服务实现》 中文完整翻译
- 轻松实现SQL Server与Access…
- localForage——轻松实现 Web&n…
- Thrift:可扩展的跨语言服务实现
- Java跨语言调用实现方案 protobuf thrift Hadoop avro
- Golang通过Thrift框架完美实现跨语言调用
- Golang通过Thrift框架完美实现跨语言调用
- Golang通过Thrift框架完美实现跨语言调用
- 轻松实现Ecshop商城多语言切换
- thrift服务端的c++语言实现
- 翻译:Thrift: Scalable Cross-Language Services Implementation中文翻译(Thrift:可扩展的跨语言服务实现)
- 让你的HTML5&CSS3网站在老IE中也能…
- Java 理论与实践: 描绘线程安全性
- PHPFastCGI进程管理器PHP-FPM详解
- nginx的 CPU参数worker_proce…
- PHP-CGI 进程 CPU …
- [转]thrift 轻松实现多语言跨…
- navigation bar下面有一条黑线
- JS中的prototype
- PHP页面输出缓存控制
- mysql主从同步配置
- MySQL主从复制配置(包括备份原始数…
- 设计模式-PHP实现单件模式的几种…
- JS读取UserAgent信息并做判断
- Redis数据类型学习