我的博客

Thrift简单使用的例子

目录

Apache Thrift软件框架,可以允许不同语言通过网络相互调用,支持的语言有C++,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,JavaScript,Node.js,Smalltalk,OCaml和Delphi等,官方网站是 http://thrift.apache.org/ 使用Apache Thrift的步骤是(此处以python调用java函数为例)

  1. 安装thrift 官方网站有exe和源码下载 http://thrift.apache.org/download
  2. 编写thrift文件,定义接口
  3. 使用thrift编译器由thrift文件产生python的代码和java的代码。
  4. 在自己写python和java的程序中分别import上一步自动生成的代码以及thrift的库

此处以两数相加的函数为例,详细的步骤如下 1、编写thrift文件 文件calculator.thrift

service Calculator {
i32 add(1:i32 num1, 2:i32 num2)
}

serveice Calculator声明了一个服务, i32 add(1: i32 num1, 2:i32 num2) 声明了一个函数add,i32是变量类型——32为有符号整型,add函数需要两个参数num1和num2,类型都是i32,返回值的类型也是i32 2、自动生成代码 一条命令 thrift-0.11.0.exe --gen py calculator.thrift 这是在windows平台下,直接下载一个exe文件就可以,Linux平台好像需要从源码编译 命令的结果是在当前目录下生成了gen-py文件夹,里面有空的__init__.py和calculator文件夹,calculator文件夹里有我们需要的Calculator.py 3、python服务端编写 需要import上一步生成的Calculator.py,在gen-py/calculator/里 需要安装依赖 pip install thrift

import Calculator

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer

class CalculatorHandler:
def __init__(self):
self.log = {}

def add(self, n1, n2):
    print('add(%d,%d)' % (n1, n2))
    return n1 + n2

if __name__ == ‘__main__‘:
handler = CalculatorHandler()
processor = Calculator.Processor(handler)
transport = TSocket.TServerSocket(host=’127.0.0.1’, port=9090)
tfactory = TTransport.TBufferedTransportFactory()
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.')

4、python客户端端编写 同样需要第2步生成的Calculator.py和安装依赖thrift

from gen_py.calc import Calculator

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol

def main():

# Make socket
transport = TSocket.TSocket('localhost', 9090)

# Buffering is critical. Raw sockets are very slow
transport = TTransport.TBufferedTransport(transport)

# Wrap in a protocol
protocol = TBinaryProtocol.TBinaryProtocol(transport)

# Create a client to use the protocol encoder
client = Calculator.Client(protocol)

# Connect!
transport.open()

sum_ = client.add(1, 1)
print('1+1=%d' % sum_)

transport.close()

if __name__ == ‘__main__‘:
try:
main()
except Thrift.TException as tx:
print(‘%s’ % tx.message)

5、测试 先运行服务端,再执行客户端可以看到服务端打印了客户端发送的请求,客户端也返回了服务端传回的结果

评论无需登录,可以匿名,欢迎评论!