pythonthrift教程
本⽂主要简单记录rpc框架thrift的使⽤,详细可查
第⼀步:安装thrift
命令⾏输⼊ brew install thrift    (此⽅法仅适⽤于mac,其他安装⽅法查看教程)
第⼆步:编写⼀个.thrift⽂件
⾸先这个.thrift⽂件是什么作⽤呢?其实这个⽂件主要⽤类c语⾔的写法定义⼀些常量、结构、类和⽅法。
然后为什么要定义这个.thrift⽂件呢?我们知道thrift RPC框架是可以⽀持20多中语⾔的如python、java、go、php、C++等,我们需要定义这个.thrift⽂件,然后通过thrift程序把它转换成你需要语⾔的格式,也就是我们第三步要做的。
这⾥我们写个rpc.thirft⽂件⽰例:
namespace py rpc
namespace java rpc
namespace go rpc
//上⾯内容可以省略
//定义常量⽰例
const string HELLO_WORLD = "world"
//定义结构体⽰例
struct Resp{
1: i32 Code=0,
2: string Msg="",
}
//定义接⼝⽰例
service HelloWorld {
void ping(),      //接⼝⽅法
Resp sayHello(),  /接⼝的返回值为Resp结构体形式
string sayMsg(1:string msg)
}
第三步:把根据我们定义的.thrift⽂件,thrift⾃动⽣成代码
命令⾏输⼊thrift --gen <language> <Thrift filename>
例如我们是python语⾔,然后⽂件名为rpc.thrift所以我们输⼊命令
thrift --gen py pc.thrift
在你输⼊完命令刷新后,会⾃动出现gen-py⽬录,我们可以将它理解为我们RPC程序的脚⼿架
第四步:有了脚⼿架后,我们就可以编写客户端和服务端了
客户端⽂件⽰例 client.py:
import sys
sys.path.append('./gen-py')
from rpc import HelloWorld
pes import *
stants import *
from thrift import Thrift
ansport import TSocket
ansport import TTransport
from thrift.protocol import TBinaryProtocol
try:
# Make socket
transport = TSocket.TSocket('127.0.0.1', 30303)
# Buffering is critical. Raw sockets are very slow
transport = TTransport.TBufferedTransport(transport)
# Wrap in a protocol
protocol = TBinaryProtocol.TBinaryProtocol(transport)
# Create a client to use the protocol encoder
client = HelloWorld.Client(protocol)
# Connect!
transport.open()
client.ping()
print("ping()")
pycharm安装教程和使用
msg = client.sayHello()
print(msg, type(msg))
  # 这⾥发送的是之前⽂件中定义的常量HELLO_WORD
msg = client.sayMsg(HELLO_WORLD)
print(msg)
transport.close()
except Thrift.TException as tx:
print("%s" % (tx.message))
然后编写服务端程序service.py:
import sys
sys.path.append('./gen-py')
from rpc import HelloWorld
pes import *
ansport import TSocket
ansport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer
import socket
class HelloWorldHandler:
def__init__(self):
self.log = {}
def ping(self):
print("ping()")
def sayHello(self):
print("sayHello()")
     # 这⾥我返回的是之前定义的Resp结构体
return Resp(1, "hahah")
def sayMsg(self, msg):
print(1212)
return msg
handler = HelloWorldHandler()
processor = HelloWorld.Processor(handler)
transport = TSocket.TServerSocket('127.0.0.1', 30303)
tfactory = TTransport.TBufferedTransportFactory()
pfactory = TBinaryProtocol.TBinaryProtocolFactory()
server = TServer.TSimpleServer(processor, transport, tfactory, pfactory) print("Starting ")
server.serve()
print("done!")
这两个⽂件放在gen-py⽬录下
第五步:先启动service端,然后再启动client端
然后你查看控制台就可以看到,客户端与服务端之间的通信输出了如:service端:
/usr/local/bin/python3.7 /Users/bytedance/PycharmProjects/untitled5_django/rpc/service.py Starting
ping()
sayHello()
1212
client端输出:
/usr/local/bin/python3.7 /Users/bytedance/PycharmProjects/untitled5_django/rpc/client.py ping()
Resp(Code=1, Msg='hahah') <pes.Resp'>
world
Process finished with exit code 0

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。