Apache Thrift est un framework efficace implémenté par Facebook qui prend en charge l'invocation de services à distance dans plusieurs langages de programmation. Cet article présentera brièvement l'architecture, le développement et l'utilisation d'Apache Thrift du point de vue des développeurs Python.
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) }
Après avoir modifié le fichier de définition, exécutez la commande suivante pour générer le fichier d'épargne. Le répertoire hello peut être déplacé vers le répertoire actuel pour un appel facile ultérieurement.
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!
Cet article est juste un Un exemple simple. Dans les projets réels, zookeeper est généralement utilisé pour enregistrer et gérer l'état d'épargne des services, et le serveur et le client sont encapsulés pour faciliter les appels dans divers modules du projet.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!