thirft使用socket进行数据传输,数据以特定的格式发送,接收方进行解析。我们定义好thrift的IDL文件后,就可以使用thrift的编译器来生成双方语言的接口、model,在生成的model以及接口代码中会有解码编码的代码。
TTransport层 代表thrift的数据传输方式
- TSocket: 阻塞式socket;
- TFramedTransport: 以frame为单位进行传输,非阻塞式服务中使用;
- TFileTransport: 以文件形式进行传输;
TProtocol层 代表thrift客户端和服务端之间传输数据的协议,通俗讲就是客户端和服务端之间传输数据的格式(例如json等)
- TBinaryProtocol: 二进制格式;
- TCompactProtocol: 压缩格式;
- TJSONProtocol: JSON格式;
- TSimpleJSONProtocol: 提供只写的JSON协议;
thrift支持的Server模型
- TSimpleServer: 简单的单线程服务模型,常用于测试;
- TThreadPoolServer: 多线程服务模型,使用标准的阻塞式IO;
- TNonBlockingServer: 多线程服务模型,使用非阻塞式IO(需要使用TFramedTransport数据传输方式);
- THsHaServer: THsHa引入了线程池去处理,其模型读写任务放到线程池去处理,Half-sync/Half-async处理模式,Half-async是在处理IO事件上(accept/read/write io),Half-sync用于handler对rpc的同步处理;
# test_client:
socket = TSocket.TSocket(host, port)
socket.setTimeout(400)
transport = TTransport.TBufferedTransport(socket) # 1 TTransport层: 数据传输方式
protocol = TBinaryProtocol.TBinaryProtocol(transport) # 2 TProtocol层: 传输数据格式
client = Experiment.Client(protocol) # 3 Client
transport.open()
resp = client.method(req)
transport.close()
# test_server
handler = Handler()
processor = Experiment.Processor(handler) # 封装了从输入数据流中读数据和向数据流中写数据的操作
socket = TSocket.TServerSocket(host, port)
transport = TTransport.TBufferedTransportFactory()
protocol = TBinaryProtocol.TBinaryProtocolFactory()
server = TServer.TThreadedServer(processor, socket, transport, protocol)
server.serve()