zoukankan      html  css  js  c++  java
  • python 使用 thrift 教程

    https://www.cnblogs.com/shenh/p/10529073.html

    一、前言:  

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

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

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

    二、使用方法

    环境准备:

    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不匹配
  • 相关阅读:
    【iBoard电子学堂开发板例程】【12个 stm32 例程发布】
    【iCore双核心组合是开发板例程】【12个 verilog 中级实验例程发布】
    【新产品发布】【iHMI43 智能液晶模块 2013 版】
    【新产品发布】【EVC8001 磁耦隔离式 USB 转 RS-485】
    【iHMI43真彩液晶模块】发布新版 DEMO 软件包,版本号为 0.14
    【新产品发布】【iCore2 ARM / FPGA 双核心板】
    急性淋巴瘤化疗术后高热不退案
    产后便秘案
    药疹治案
    胃癌化疗后急救案
  • 原文地址:https://www.cnblogs.com/fengff/p/11492057.html
Copyright © 2011-2022 走看看