软件测试Python专家之路工具癖python数据分析人工智能机器学习

接口协议工具thrift1快速入门

2018-10-09  本文已影响94人  python测试开发

简介

Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服务,可以使用C#、C++(基于POSIX兼容系统)、Cappuccino、Cocoa、Delphi、Erlang、Go、Haskell、Java、Node.js、OCaml、Perl、PHP、Python、Ruby和Smalltalk。虽然它以前是由Facebook开发的,但它现在是Apache软件基金会的开源项目了。该实现被描述在2007年4月的一篇由Facebook发表的技术论文中,该论文现由Apache掌管。

Thrift包含完整的栈来创建客户端和服务端程序。顶层部分是由Thrift定义生成的代码。而服务则由这个文件客户端和处理器代码生成。在生成的代码里会创建不同于内建类型的数据结构,并将其作为结果发送。协议和传输层是运行时库的一部分。有了Thrift,就可以定义一个服务或改变通讯和传输协议,而无需重新编译代码。除了客户端部分之外,Thrift还包括服务器基础设施来集成协议和传输,如阻塞、非阻塞及多线程服务器。栈中作为I/O基础的部分对于不同的语言则有不同的实现。

Thrift支持众多通讯协议:

支持的传输协议有:

Thrift还提供众多的服务器,包括:

Thrift一些已经明确的优点包括:

image.png

安装

以ubuntu 为例

# apt install thrift-compiler
# pip3 install thrift

快速入门

定义接口文档


service Example {
    string ping(),
    void say(1:string msg)
}

服务器端 server.py


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

from pygen.example import Example


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

    def ping(self):
        return "pong"

    def say(self, msg):
        print(msg)


handler = ExampleHandler()
processor = Example.Processor(handler)
transport = TSocket.TServerSocket(port=30303)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()

server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)

print("Starting python server...")
server.serve()
print("done!")

客户端 client.py


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

from pygen.example import Example


try:
    transport = TSocket.TSocket('localhost', 30303)
    transport = TTransport.TBufferedTransport(transport)
    protocol = TBinaryProtocol.TBinaryProtocol(transport)
    client = Example.Client(protocol)
    transport.open()
    print(client.ping())
    client.say('Hello from Python!')
    transport.close()

except Thrift.TException as tx:
    print(tx.message)

执行:

$ thrift -out pygen/ --gen py example.thrift

$ python3 server.py
Starting python server...
Hello from Python!

$ python3 client.py
pong

参考资料

上一篇 下一篇

猜你喜欢

热点阅读