Apache Thrift는 여러 프로그래밍 언어로 원격 서비스 호출을 지원하는 Facebook에서 구현한 효율적인 프레임워크입니다. 이 기사에서는 Python 개발자의 관점에서 Apache Thrift의 아키텍처, 개발 및 사용을 간략하게 소개합니다.
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) }
정의 파일을 편집한 후 다음 명령을 실행하여 생성합니다. 중고품 파일. 나중에 쉽게 호출할 수 있도록 hello 디렉터리를 현재 디렉터리로 이동할 수 있습니다.
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!
이 문서는 실제 프로젝트에서의 간단한 예일 뿐입니다. , 일반적으로 사육사를 기반으로 서비스의 절약 상태를 등록 및 관리하고 서버와 클라이언트를 추가로 캡슐화하여 프로젝트의 각 모듈에서 호출을 용이하게 합니다.
위 내용은 Python에서 Thrift 샘플 코드 공유에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!