Heim > Backend-Entwicklung > Python-Tutorial > Ausführliche Erläuterung der gemeinsamen Nutzung von Thrift-Beispielcode in Python

Ausführliche Erläuterung der gemeinsamen Nutzung von Thrift-Beispielcode in Python

黄舟
Freigeben: 2017-05-07 10:40:59
Original
3386 Leute haben es durchsucht


Vorwort

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.

Thrift-Einführung

Thrift-Netzwerkstapel

Transport

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)。
Nach dem Login kopieren

Protokoll

Protocol用于对数据格式抽象,在rpc调用时序列化请求和响应。
TProtocol的实现包括:TJSONProtocol,TSimpleJSONProtocol,TBinaryProtocol,TBinaryPotocolAccelerated,TCompactProtocol。
Nach dem Login kopieren

Prozessor

Processor对stream读写抽象,最终会调用用户编写的handler已响应对应的service。
具体的Processor有compiler生成,用户需要实现service的实现类。
Nach dem Login kopieren

Server

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的请求。
Nach dem Login kopieren

Code generiert

constants.py: 包含声明的所有常量
ttypes.py: 声明的struct,实现了具体的序列化和反序列化
SERVICE_NAME.py: 对应service的描述文件,包含了:
    Iface: service接口定义
    Client: client的rpc调用桩
Nach dem Login kopieren

Nutzung

Thrift的用法实际上很简单,定义好IDL,然后实现service对应的handler(方法名、参数列表与接口定义一致接口),最后就是选择各个组件。需要选择的包括:Transport(一般都是socket,只是十分需要选择buffed和framed装饰器factory),Protocol,Server。
Nach dem Login kopieren

Beispiel

IDL-Datei

/*
thrift接口定义文件
*/service HelloService {    string say(1:string msg)
}
Nach dem Login kopieren

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
Nach dem Login kopieren

Server

# 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!"
Nach dem Login kopieren

Client

# 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)
Nach dem Login kopieren

Laufergebnisse

$ ptyhon thrift_client.pyclient - say
server - Received: Hello!

$ python thrift_server.pyStarting thrift server in python...Received: Hello!
Nach dem Login kopieren

Zusammenfassung

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage