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

    一、前言:  

      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)
    }
    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不匹配
  • 相关阅读:
    实例讲解Springboot以Repository方式整合Redis
    Spark join 源码跟读记录
    数理统计与参数估计杂记
    常见的距离算法和相似度(相关系数)计算方法
    生成模型(Generative Model)与判别模型(Discriminative Model)
    Java 积累复习用
    RangePartitioner 实现简记
    Spark常见问题汇总
    2016年终总结
    学习资料库
  • 原文地址:https://www.cnblogs.com/hls91/p/15798139.html
Copyright © 2011-2022 走看看