Apache Thrift ist ein effizientes, von Facebook implementiertes Framework, das den Aufruf von Remote-Diensten in mehreren Programmiersprachen unterstützt. In diesem Artikel wird die Architektur, Entwicklung und Verwendung von Apache Thrift aus der Sicht von Python-Entwicklern kurz vorgestellt.
Transport网络读写(socket,http等)抽象,用于和其他thrift组件解耦。 Transport的接口包括:open, close, read, write, flush, isOpen, readAll。 Server端需要ServerTransport(对监听socket的一种抽象),用于接收客户端连接,接口包括:listen, accept, close。 python中Transport的实现包括:TSocket, THttpServer, TSSLSocket, TTwisted, TZlibTransport,都是对某种协议或框架的实现。还有两个装饰器,用于为已有的Transport添加功能,TBufferedTransport(增加缓冲)和TFramedTransport(添加帧)。 在创建server时,传入的时Tranport的工厂,这些Factory包括:TTransportFactoryBase(没有任何修饰,直接返回),TBufferedTransportFactory(返回带缓冲的Transport)和TFramedTransportFactory(返回帧定位的Transport)。
Protocol用于对数据格式抽象,在rpc调用时序列化请求和响应。 TProtocol的实现包括:TJSONProtocol,TSimpleJSONProtocol,TBinaryProtocol,TBinaryPotocolAccelerated,TCompactProtocol。
Processor对stream读写抽象,最终会调用用户编写的handler已响应对应的service。 具体的Processor有compiler生成,用户需要实现service的实现类。
Server创建Transport,输入、输出的Protocol,以及响应service的handler,监听到client的请求然后委托给processor处理。 TServer是基类,构造函数的参数包括: 1) processor, serverTransport 2) processor, serverTransport, transportFactory, protocolFactory 3) processor, serverTransport, inputTransportFactory, outputTransportFactory, inputProtocolFactory, outputProtocolFactory TServer内部实际上需要3)所列的参数,1)和2)会导致对应的参数使用默认值。 TServer的子类包括:TSimpleServer, TThreadedServer, TThreadPoolServer, TForkingServer, THttpServer, TNonblockingServer, TProcessPoolServer TServer的serve方法用于开始服务,接收client的请求。
constants.py: 包含声明的所有常量 ttypes.py: 声明的struct,实现了具体的序列化和反序列化 SERVICE_NAME.py: 对应service的描述文件,包含了: Iface: service接口定义 Client: client的rpc调用桩
Thrift的用法实际上很简单,定义好IDL,然后实现service对应的handler(方法名、参数列表与接口定义一致接口),最后就是选择各个组件。需要选择的包括:Transport(一般都是socket,只是十分需要选择buffed和framed装饰器factory),Protocol,Server。
/* thrift接口定义文件 */service HelloService { string say(1:string msg) }
Nachdem Sie die Definitionsdatei bearbeitet haben, führen Sie den folgenden Befehl aus, um die Thrift-Datei zu generieren. Das Hallo-Verzeichnis kann zum späteren einfachen Aufrufen in das aktuelle Verzeichnis verschoben werden.
thrift -r -gen py hello.thrift
# coding: utf-8""" thrift_client.py """import socketimport sysfrom hello import HelloServicefrom hello.ttypes import *from thrift.transport import TSocketfrom thrift.transport import TTransportfrom thrift.protocol import TBinaryProtocolfrom thrift.server import TServerclass HelloServiceHandler: def say(self, msg): ret = "Received: " + msg print ret return ret handler = HelloServiceHandler() processor = HelloService.Processor(handler) transport = TSocket.TServerSocket("localhost", 9090) tfactory = TTransport.TBufferedTransportFactory() pfactory = TBinaryProtocol.TBinaryProtocolFactory() server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)print "Starting thrift server in python..."server.serve()print "done!"
# coding: utf-8""" thrift_client.py """import sysfrom hello import HelloServicefrom thrift import Thriftfrom thrift.transport import TSocketfrom thrift.transport import TTransportfrom thrift.protocol import TBinaryProtocoltry: transport = TSocket.TSocket('localhost', 9090) transport = TTransport.TBufferedTransport(transport) protocol = TBinaryProtocol.TBinaryProtocol(transport) client = HelloService.Client(protocol) transport.open() print "client - say" msg = client.say("Hello!") print "server - " + msg transport.close()except Thrift.TException, ex: print "%s" % (ex.message)
$ ptyhon thrift_client.pyclient - say server - Received: Hello! $ python thrift_server.pyStarting thrift server in python...Received: Hello!
Dieser Artikel ist Nur ein einfaches Beispiel: In tatsächlichen Projekten wird zookeeper im Allgemeinen zum Registrieren und Verwalten des Sparsamkeitsstatus von Diensten verwendet, und der Server und der Client werden weiter gekapselt, um Aufrufe in verschiedenen Modulen des Projekts zu erleichtern.
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der gemeinsamen Nutzung von Thrift-Beispielcode in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!