rpc thrift/thriftpy2 python

蔚落 2023-06-09 15:27 108阅读 0赞

Thrift使用
1、 安装thrift的python库
Pip install thrift

  1. 安装 Thrift 的 IDL 编译工具
    Windows:
    从官网上下载 windows 版的 thrift.exe:http://archive.apache.org/dist/thrift/0.9.3/ (我这里用的是0.9.3版本)
    Linux:
    Mac:

3、定义一个.thrift格式的文件,如test.thrift

  1. service Transmit {
  2. string sayMsg(1:string msg);
  3. string invoke(1:i32 cmd 2:string token 3:string data)
  4. }

4、然后运行命令thrift-0.9.3.exe -gen py test.thrift 生成 python 代码
在这里插入图片描述
5、编辑服务器端代码

  1. import json
  2. import threading
  3. from test import Transmit
  4. from test.ttypes import *
  5. from thrift.transport import TSocket
  6. from thrift.transport import TTransport
  7. from thrift.protocol import TBinaryProtocol
  8. from thrift.server import TServer
  9. import socket
  10. class TransmitHandler:
  11. def __init__(self):
  12. self.log = { }
  13. def sayMsg(self, msg):
  14. msg = json.loads(msg)
  15. print(threading.get_ident())
  16. print("sayMsg(" + msg + ")")
  17. return "say " + msg + " from " + socket.gethostbyname(socket.gethostname())
  18. def invoke(self, cmd, token, data):
  19. cmd = cmd
  20. token = token
  21. data = data
  22. if cmd == 1:
  23. return json.dumps({ token: data})
  24. else:
  25. return 'cmd不匹配'
  26. if __name__ == "__main__":
  27. handler = TransmitHandler() # 处理程序
  28. processor = Transmit.Processor(handler)
  29. transport = TSocket.TServerSocket('127.0.0.1',
  30. 8000) # 基于TCP socket实现TTransport的接口 https://www.cnblogs.com/brucewoo/p/3226858.html
  31. """ TSocket:使用阻塞的TCP Socket进行数据传输,也是最常见的模式 THttpTransport:采用Http传输协议进行数据传输 TFileTransport:文件(日志)传输类,允许client将文件传给server,允许server将收到的数据写到文件中 TZlibTransport:与其他的TTransport配合使用,压缩后对数据进行传输,或者将收到的数据解压 """
  32. tfactory = TTransport.TBufferedTransportFactory() # 将原始传输转换为一个适合的应用传输 装饰器模式
  33. """ TBufferedTransport:对某个Transport对象操作的数据进行buffer,即从buffer中读取数据进行传输,或者将数据直接写入buffer TFramedTransport:同TBufferedTransport类似,也会对相关数据进行buffer,同时,它支持定长数据发送和接收(按块的大小,进行传输)。 TMemoryBuffer:从一个缓冲区中读写数据 """
  34. pfactory = TBinaryProtocol.TBinaryProtocolFactory() # 为TTransport创建一个输入和输出 把TTransport中的字节流转化为数据流(Data Stream)
  35. """ TBinaryProtocol: 二进制格式 TCompactProtocol: 高效率的、密集的二进制编码格式 TJSONProtocol: 使用 JSON 的数据编码协议进行数据传输 TSimpleJSONProtocol: 提供JSON只写协议, 生成的文件很容易通过脚本语言解析。 TDebugProtocol: 使用易懂的可读的文本格式,以便于debug """
  36. server = TServer.TThreadedServer(processor, transport, tfactory, pfactory) # 单线程服务器
  37. """ TServer.TSimpleServer 单线程服务器 TServer.TThreadedServer 多线程服务器 TServer.TThreadPoolServer 线程池服务器 TForkingServer 多进程服务器 """
  38. print("Starting python server...")
  39. server.serve()

6、编写客户端代码

  1. import sys
  2. import json
  3. from test import Transmit
  4. from test.ttypes import *
  5. from test.constants import *
  6. from thrift import Thrift
  7. from thrift.transport import TSocket
  8. from thrift.transport import TTransport
  9. from thrift.protocol import TBinaryProtocol
  10. import time
  11. try:
  12. # Make socket
  13. transport = TSocket.TSocket('127.0.0.1', 8000)
  14. # Buffering is critical. Raw sockets are very slow
  15. transport = TTransport.TBufferedTransport(transport)
  16. # Wrap in a protocol
  17. protocol = TBinaryProtocol.TBinaryProtocol(transport)
  18. # Create a client to use the protocol encoder
  19. client = Transmit.Client(protocol)
  20. # Connect!
  21. transport.open()
  22. cmd = 1
  23. token = '1111-2222-3333-4444'
  24. data = json.dumps({ "name": "zhoujielun"})
  25. msg = client.invoke(cmd, token, data)
  26. time.sleep(5)
  27. bad = client.sayMsg(json.dumps("zhoujielun"))
  28. transport.close()
  29. except Thrift.TException as tx:
  30. print("%s" % (tx.message))

这里要说两个问题,首先,thriftpy2是第三方封装的一个三方库,相对于thrift的使用更加方便,不用安装插件生成代码,网上随便搜一个教程就可以,缺点是每次调用都需要生成新的socket,无法实现长连接。所以采用的是thrift更自由,更容易客制化。

Thrift2使用教程

thriftpy2中服务端和客户端都需要调用thriftpy2.load方法,对thrift文件进行解析,会在内存中构建相应的module
1.thriftpy2构建服务端
调用thriftpy.load方法对thrift文件进行解析,在内存中构建对应的module
调用make_server将构建的module和完成具体业务功能的class绑定,同时完成传输层和协议层的设置,生成thrift服务器端
调用server.serve方法启动服务器
2.thriftpy2构建客户端接口
调用thriftpy.load方法对thrift文件进行解析,在内存中构建对应的module
调用make_client绑定上一步构建的module,同时完成传输层和协议层的设置,生成Thirft客户端
根据生成的客户端调用响应的接口
由于微服务基本都会用docker来运行,用docker来搭建python微服务,大家可以参考下https://blog.csdn.net/qq\_35394891/article/details/84144936

通过IDL(接口定义语言) -> 来定义 RPC(远程过程调用)的接口和数据类型 -> thrift编译器生成不同语言的代码 -> 负责RPC协议层和传输层的实现
通过定义IDL文件,来来关联客户端和服务端
IDL文件中定义的内容,定义我们要运行的服务,需要的变量等

thriftpy2框架是以pythonic方式实现的,不需要通过thrift文件,生成SDK,只需要动态导入thrift文件即可
使用方法:
1、pip install thriftpy2
2、我们需要定义thrift文件,来描述服务接口

  1. service PingPong {
  2. string ping(),
  3. }

3、定义客户端代码

  1. import thriftpy2
  2. pingpong_thrift = thriftpy2.load("pingpong.thrift", module_name="pingpong_thrift")
  3. from thriftpy2.rpc import make_client
  4. client = make_client(pingpong_thrift.PingPong, '127.0.0.1', 6000)
  5. print(client.ping())

4、定义服务端代码

  1. import thriftpy2
  2. pingpong_thrift = thriftpy2.load("pingpong.thrift", module_name="pingpong_thrift")
  3. from thriftpy2.rpc import make_server
  4. class Dispatcher(object):
  5. def ping(self):
  6. return "pong"
  7. server = make_server(pingpong_thrift.PingPong, Dispatcher(), '127.0.0.1', 6000)
  8. server.serve()

支持异步:
Client:

  1. import thriftpy2
  2. import asyncio
  3. from thriftpy2.rpc import make_aio_client
  4. echo_thrift = thriftpy2.load("echo.thrift", module_name="echo_thrift")
  5. async def request():
  6. client = await make_aio_client(
  7. echo_thrift.EchoService, '127.0.0.1', 6000)
  8. print(await client.echo('hello, world'))
  9. client.close()

server:

  1. import asyncio
  2. import thriftpy2
  3. from thriftpy2.rpc import make_aio_server
  4. echo_thrift = thriftpy2.load("echo.thrift", module_name="echo_thrift")
  5. class Dispatcher(object):
  6. async def echo(self, param):
  7. print(param)
  8. await asyncio.sleep(0.1)
  9. return param
  10. def main():
  11. server = make_aio_server(
  12. echo_thrift.EchoService, Dispatcher(), '127.0.0.1', 6000)
  13. server.serve()
  14. if __name__ == '__main__':
  15. main()

两个学习链接:https://www.cnblogs.com/mumuxinfei/category/597031.html
http://zheming.wang/blog/2014/08/28/94D1F945-40EC-45E4-ABAF-3B32DFFE4043/

发表评论

表情:
评论列表 (有 0 条评论,108人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Swoft 2.x Rpc调用

    Swoft框架的初始化 Swoft初始化有六个步骤: 1. ENV环境文件初始化 2. 注解信息扫描收集 3. 配置初始化 4. 注册类到bean容器 5.

    相关 python rpc讲解

    rpyc (Remote Python Call)为分布式计算环境提供了优良的基础平台。 使用rpyc编写c/s结构程序,完全不用考虑老式的socket编程,现在只用编写简单的