thrift

Thrift是一种高效的远程服务调用框架,支持多种编程语言。它提供了网络抽象层、协议处理器、处理器工厂、服务器接口和接口定义文件等组件。用户可以定义服务接口,并通过Thrift生成相应的代码,实现跨语言的服务调用。在使用中,首先定义Thrift IDL文件,然后通过Thrift编译器生成客户端和服务器端代码,实现服务的创建和调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Apache ThriftFacebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。

一、简介
1、Transport

Transport是网络读写(socket http等)的网络抽象。用于和其他thrift组件解耦。

Transport的接口包括:open, close, read, write, flush, isOpen, readAll

Server端需要ServerTransport(对监听socket的一种抽象),用于接收客户端连接,接口包括:listen, accept, close

pythonTransport的实现包括:TSocket, THttpServer, TSSLSocket, TTwisted, TZlibTransport,都是对某种协议或框架的实现。还有两个装饰器,用于为已有的Transport添加功能,TBufferedTransport(增加缓冲)和TFramedTransport(添加帧)。

在创建server时,传入的时Tranport的工厂,这些Factory包括:

TTransportFactoryBase(没有任何修饰,直接返回),TBufferedTransportFactory(返回带缓冲的Transport)和TFramedTransportFactory(返回帧定位的Transport)。
2、Protocol

Protocol用于对数据格式抽象,在rpc调用时序列化请求和响应。
TProtocol的实现包括:TJSONProtocolTSimpleJSONProtocolTBinaryProtocolTBinaryPotocolAcceleratedTCompactProtocol

3、Processor

Processorstream读写抽象,最终会调用用户编写的handler已响应对应的service。具体的Processorcompiler生成,用户需要实现service的实现类。

4、Server

Server创建Transport,输入、输出的Protocol,以及响应servicehandler,监听到client的请求然后委托给processor处理。

TServer是基类,构造函数的参数包括:

    1. processor, serverTransport
    1. processor, serverTransport, transportFactory,protocolFactory
    1. processor, serverTransport, inputTransportFactory,outputTransportFactory, inputProtocolFactory, outputProtocolFactory

TServer内部实际上需要3)所列的参数,1)和2)会导致对应的参数使用默认值。

TServer的子类包括:TSimpleServer, TThreadedServer, TThreadPoolServer, TForkingServer, THttpServer, TNonblockingServer, TProcessPoolServer
TServerserve方法用于开始服务,接收client的请求。

5、Code generated
  • constants.py: 包含声明的所有常量
  • ttypes.py: 声明的struct,实现了具体的序列化和反序列化
  • SERVICE_NAME.py:对应service的描述文件,包含了:
  • Iface: service接口定义
  • Client: clientrpc调用桩
二、使用示例
1、定义IDL文件(hello.thrift)
/* thrift接口定义文件 */
service HelloService { 
    string say(1:string msg) 
}

在编辑好定义文件后, 运行如下命令,生成thrift文件。可把hello目录移到当前目录下,便于后面调用。

Thrift  -r --gen py hello.thrift

Server:

# coding: utf-8
"""
thrift_client.py
"""
import socket
import sys
sys.path.append("./gen-py")
from hello import HelloService
from hello.ttypes import *

from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer


class HelloServiceHandler:  # 服务句柄类
    def say(self, msg):
        ret = "Received: " + msg
        print(ret)
        return ret


handler = HelloServiceHandler()  # 句柄类的实例话
processor = HelloService.Processor(handler)  # 定义processor
transport = TSocket.TServerSocket("localhost", 9090)  # 调用Socket传输
tfactory = TTransport.TBufferedTransportFactory()  # 带缓冲的TTransport工厂
pfactory = TBinaryProtocol.TBinaryProtocolFactory()  # 二进制协议工厂

server = TServer.TSimpleServer(
    processor,
    transport,
    tfactory,
    pfactory)  # 初始化TServer

print("Starting thrift server in python...")
server.serve()
print("done!")

Client:

# coding: utf-8
"""
thrift_client.py
"""

import sys
sys.path.append("./gen-py")
from hello import HelloService

from thrift import Thrift
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol

try:
    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 as ex:
    print("%s" % (ex.message))

运行结果:

$ ptyhon thrift_client.py
client - say
server - Received: Hello!

$ python thrift_server.py
Starting thrift server in python...
Received: Hello!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值