Python thrift使用实例

1. 什么是Thrift
Apache Thrift(简称thrift)是一种高效的、通用的远程过程调用(RPC)框架,它允许不同的应用程序使用不同的编程语言进行通信。
开发者可以使用Thrift定义他们自己的数据类型和服务,然后根据这些定义生成不同语言的代码文件,使得不同语言的应用能够相互通信。
Thrift的主要特点包括跨语言、高性能、可扩展性和可插拔性。它支持多种编程语言,例如Java、C++、Python等,并且可以使用多种传输协议,如TCP、HTTP等。
2. 安装Thrift
在使用Thrift之前,我们需要先安装它。下面是Thrift的安装步骤:
- 下载并解压Thrift的源代码包。
wget http://apache.fayea.com/thrift/0.14.1/thrift-0.14.1.tar.gz tar -xzvf thrift-0.14.1.tar.gz
- 进入解压后的目录,并执行以下命令进行编译和安装。
cd thrift-0.14.1 ./configure make make install如果你在编译过程中遇到了依赖错误,可以根据错误提示进行相应的依赖安装。 
- 
安装完成后,可以使用 thrift --version命令来验证是否安装成功。thrift 0.14.1
3. 编写Thrift文件
在进行Thrift编程之前,我们需要先定义数据类型和服务。Thrift使用IDL(Interface Definition Language)语言来实现这一目的。
下面是一个简单的Thrift文件示例:
namespace python tutorial
struct Person {
    1: required string name,
    2: required i32 age,
    3: optional string email
}
service HelloWorldService {
    string sayHello(1: string name),
    void sayGoodbye()
}
上面的Thrift文件定义了一个tutorial的命名空间,包含了一个Person结构体和一个HelloWorldService服务。
Person结构体有三个字段,分别是name、age和email。其中name和age是必需的字段,而email是可选的。
HelloWorldService服务定义了两个方法:sayHello和sayGoodbye。sayHello方法接受一个参数name,返回一个字符串;sayGoodbye方法不接受任何参数,也没有返回值。
4. 生成代码
在Thrift文件定义完成后,我们需要根据这个文件生成对应的代码文件。Thrift提供了命令行工具thrift来实现这一功能。
下面是使用thrift命令生成Python代码的示例:
thrift -r --gen py tutorial.thrift
命令行参数解释:
- -r:递归处理导入文件,比如在Thrift文件中引入了其他Thrift文件。
- --gen py:生成Python代码。
执行完上述命令后,Thrift会在当前目录下生成一个gen-py目录,其中包含了生成的Python代码。
5. 编写服务端代码
在生成了Python代码之后,我们可以开始编写实际的服务端和客户端代码了。
下面是一个简单的Thrift服务端代码示例:
import sys
sys.path.append('./gen-py')
from tutorial import HelloWorldService
from tutorial.ttypes import Person
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
class HelloWorldHandler:
    def sayHello(self, name):
        return 'Hello, {}!'.format(name)
    def sayGoodbye(self):
        print('Goodbye!')
if __name__ == '__main__':
    handler = HelloWorldHandler()
    processor = HelloWorldService.Processor(handler)
    transport = TSocket.TServerSocket(port=9090)
    tfactory = TTransport.TBufferedTransportFactory()
    pfactory = TBinaryProtocol.TBinaryProtocolFactory()
    server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
    print('Starting the server...')
    server.serve()
    print('Server stopped.')
上面的代码导入了生成的Python代码,并定义了一个HelloWorldHandler类作为服务端的具体实现。
HelloWorldHandler类实现了HelloWorldService服务的具体方法。
在main函数中,我们创建了一个HelloWorldHandler实例和一个HelloWorldService.Processor实例,并将它们传递给TSimpleServer。
为了使得Thrift能够在网络上进行通信,我们需要指定一个传输层和一个协议层。在上面的代码中,我们使用了TSocket.TServerSocket作为传输层,使用了TBinaryProtocol.TBinaryProtocolFactory作为协议层。
最后,我们通过调用server.serve()方法来启动Thrift服务端。
6. 编写客户端代码
下面是一个简单的Thrift客户端代码示例:
import sys
sys.path.append('./gen-py')
from tutorial import HelloWorldService
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
if __name__ == '__main__':
    transport = TSocket.TSocket('localhost', 9090)
    transport = TTransport.TBufferedTransport(transport)
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    client = HelloWorldService.Client(protocol)
    transport.open()
    result = client.sayHello('Alice')
    print(result)
    client.sayGoodbye()
    transport.close()
上面的代码导入了生成的Python代码,并创建了一个HelloWorldService.Client实例作为客户端的代理。
在main函数中,我们创建了一个TSocket.TSocket实例并指定了服务器的主机和端口。
然后,我们创建了一个TTransport.TBufferedTransport实例作为传输层,并创建了一个TBinaryProtocol.TBinaryProtocol实例作为协议层。
接下来,我们通过调用transport.open()方法来打开与服务端的连接。
最后,我们调用client.sayHello方法向服务端发送请求,并打印返回的结果。
7. 运行示例代码
为了运行上述的服务端和客户端示例代码,我们需要执行以下命令来启动服务端:
python server.py
服务端将会监听在本地的9090端口。
然后,我们可以执行以下命令来启动客户端:
python client.py
客户端将会连接到本地的9090端口,并发送请求给服务端。
服务端收到请求后会返回响应,客户端打印响应结果。
8. 总结
本文介绍了如何使用Python编写Thrift的服务端和客户端代码,并通过一个简单的示例来演示Thrift的使用过程。
Thrift作为一种跨语言的远程过程调用框架,具有高性能、可扩展性和可插拔性等优点,适合用于构建分布式系统。
使用Thrift的步骤包括安装Thrift、编写Thrift文件、生成代码、编写服务端代码和客户端代码。
在编写Thrift文件时,我们可以定义数据类型和服务。Thrift支持多种数据类型,并且可以指定字段的必要性和可选性。
生成代码的过程是将Thrift文件转换成对应编程语言的代码文件,这样我们就可以在代码中使用生成的类和接口来实现服务端和客户端。
在编写服务端和客户端代码时,我们需要导入生成的代码,并根据Thrift文件定义的接口和方法来编写具体的实现。
服务端需要指定传输层和协议层,来实现网络通信。客户端需要创建代理对象,并通过代理对象来调用远程方法。
最后,我们可以通过启动服务端和客户端来测试整个Thrift通信过程。
Thrift不仅仅支持Python语言,还支持多种其他编程语言,这使得不同语言的应用程序可以方便地进行通信。
通过使用Thrift,我们可以减少底层网络通信的开发工作量,提高系统的开发效率和性能。
 极客教程
极客教程