当前位置: 移动技术网 > IT编程>脚本编程>Python > python使用thrift教程的方法示例

python使用thrift教程的方法示例

2019年06月11日  | 移动技术网IT编程  | 我要评论

陈静仪 李宗瑞,网络 赚钱,盲探国语

一、前言:  

thrift 是一种接口描述语言和二进制通信协议。以前也没接触过,最近有个项目需要建立自动化测试,这个项目之间的微服务都是通过 thrift 进行通信的,然后写自动化脚本之前研究了一下。

需要定义一个xxx.thrift的文件, 来生成各种语言的代码,生成之后我们的服务提供者和消费者,都需要把代码引入,服务端把代码实现,消费者直接使用api的存根,直接调用。

和 http 相比,同属于应用层,走 tcp 协议。thrift 优势在于发送同样的数据,request包 和 response包 要比 http 小很多,在整体性能上要优于 http 。

二、使用方法

环境准备:

从官网上下载 windows 版的 thrift.exe:(我这里用的是0.9.3版本)

python版本:python 3.7.1

pip3 install thrift

1.首先使用 thrift 之前需要定义一个 .thrift 格式的文件,比如 test.thrift

service transmit {
string saymsg(1:string msg);
string invoke(1:i32 cmd 2:string token 3:string data)
}

然后运行命令:thrift-0.9.3.exe -gen py test.thrift 生成 python 代码

生成如下结构

2.然后将生成的 python 代码 和 文件,放到新建的 python 项目中。完成后先运行服务器代码。

服务端代码 server.py:

import json
from test import transmit
from test.ttypes import *
from thrift.transport import tsocket
from thrift.transport import ttransport
from thrift.protocol import tbinaryprotocol
from thrift.server import tserver
import socket


class transmithandler:
  def __init__(self):
    self.log = {}

  def saymsg(self, msg):
    msg = json.loads(msg)
    print("saymsg(" + msg + ")")
    return "say " + msg + " from " + socket.gethostbyname(socket.gethostname())

  def invoke(self,cmd,token,data):
    cmd = cmd
    token =token
    data = data
    if cmd ==1:
      return json.dumps({token:data})
    else:
      return 'cmd不匹配'

if __name__=="__main__":
  handler = transmithandler()
  processor = transmit.processor(handler)
  transport = tsocket.tserversocket('127.0.0.1', 8000)
  tfactory = ttransport.tbufferedtransportfactory()
  pfactory = tbinaryprotocol.tbinaryprotocolfactory()
  server = tserver.tsimpleserver(processor, transport, tfactory, pfactory)
  print("starting python server...")
  server.serve()

客户端代码 client.py

import sys
import jsonfrom test import transmit
from test.ttypes import *
from test.constants import *
from thrift import thrift
from thrift.transport import tsocket
from thrift.transport import ttransport
from thrift.protocol import tbinaryprotocol


transport = tsocket.tsocket('127.0.0.1', 8000)
transport = ttransport.tbufferedtransport(transport)
protocol = tbinaryprotocol.tbinaryprotocol(transport)
client = transmit.client(protocol)
# connect!
transport.open()

cmd = 2
token = '1111-2222-3333-4444'
data = json.dumps({"name":"zhoujielun"})
msg = client.invoke(cmd,token,data)
print(msg)
transport.close()

# 执行结果:cmd不匹配

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网