protobuf 介绍,Python 和 Go 编写 rpc 服务(gRPC) (6)

既然知道了编码之后的数据结构,那么我们就可以使用 Python 进行调用了。

""" 问一句,我们可以使用 requests 进行发送请求吗? 思考一下就知道是不可以的,因为 requests 发送的请求采用的是 HTTP 协议 发送出去的都是 HTTP 协议的文本,当然本质上也是一个字符串,由 header + 请求内容 组成 但是并不代表我们就不能使用 requests 发送,首先使用 requests 是可以连接到 Go 编写的服务端的 因为 HTTP 连接也是基于 TCP 连接的,只不过 Go 的 tcp 服务只负责解析请求的内容 而 requests 发送的数据除了请求内容之外还有很多的 header 但 Go 的 tcp 服务不负责解析这些 header,它只解析请求内容,所以此时采用 requests 是不行的 并不是它不能够发送请求 """ from pprint import pprint import asyncio import simplejson as json # 所以下面我们使用 asyncio 来进行模拟,当然你也可以使用 socket async def f(name: str): # 建立 tcp 连接 reader, writer = await asyncio.open_connection( "localhost", 9999) # type: asyncio.StreamReader, asyncio.StreamWriter # 创建请求体,并且需要编码成字节 payload = json.dumps({"method": "Hello Service.Hello", "params": [name], "id": 0}).encode("utf-8") # 发送数据 writer.write(payload) await writer.drain() # 读取数据 data = await reader.readuntil(b"\n") writer.close() return json.loads(data) async def main(): name_lst = ["古明地觉", "古明地恋", "雾雨魔理沙", "琪露诺", "芙兰朵露"] loop = asyncio.get_running_loop() task = [loop.create_task(f(name)) for name in name_lst] result = await asyncio.gather(*task) return result res = asyncio.run(main()) pprint(res) """ [{\'error\': None, \'id\': 0, \'result\': \'hello 古明地觉\'}, {\'error\': None, \'id\': 0, \'result\': \'hello 古明地恋\'}, {\'error\': None, \'id\': 0, \'result\': \'hello 雾雨魔理沙\'}, {\'error\': None, \'id\': 0, \'result\': \'hello 琪露诺\'}, {\'error\': None, \'id\': 0, \'result\': \'hello 芙兰朵露\'}] """

我们看到此时 Python 也是可以调用的,因此我们就基于 rpc 实现了 Python 和 Go 的交互。当然不仅是 Python,你使用其它的任何语言都是可以的,只要它支持 json 协议即可。

当然我们还可以将 rpc 封装成 http 服务,只不过我们需要手动编写客户端存根和服务端存根对应的逻辑,而这些是可以自动生成的。下面我们就来介绍我们重点:gRPC,以及它所使用的数据序列化协议 protobuf

gRPC 入门

gRPC 是一个高性能、通用的开源 rpc 框架,由 Google 为了面向移动应用开发,而基于 HTTP/2 协议、protobuf(protocol buffers)数据序列化协议所设计。gRPC 是一个通用型框架,适用于微服务开发,支持众多的开发语言,基本上主流语言都支持(都有对应的库)。

gRPC 还提供了一种简单的方法来精确地定义服务,以及为 IOS、Android 和后台支持服务自动生成可靠性很强的客户端功能库。客户端充分利用高级流和链接功能,从而有助于节省带宽、降低 TCP 连接次数、节省 CPU 使用、增加电池寿命等等。

所以 gRPC 是一个 rpc 框架,protobuf 是一个数据序列化反序列化协议,因此 protobuf 是可以独立存在的。比如我们使用 http,我们也可以不返回 json,而是返回一个 protobuf,这也是可以的。

protobuf 简介

1. 习惯了 json、xml 数据存储格式的我们,很少会使用 Protocol Buffer,即便你听说过它,但也很少用它

2. Protocol Buffer 是 Google 开发的一种轻量 & 高效的结构化数据存储格式,性能比 json、xml 强太多

3. protobuf 经历了 protobuf2 和 protobuf3,而 pb3 相比 pb2 简化了许多、变得更加易用,目前主流的版本是 pb3

protobuf 的优缺点

protobuf 介绍,Python 和 Go 编写 rpc 服务(gRPC)

Python 下的 gRPC 初体验

protobuf 还是非常重要的,我们如果想使用 gRPC 服务,就需要先编写一个 protobuf 文件,然后根据这个文件生成对应语言的客户端存根和服务端存根。存根帮我们做好了函数 ID 映射、以及数据序列化反序列化,导入它们即可使用,而我们则只需要专注于业务逻辑即可。

所以使用 gRPC 重点是编写 protobuf 文件,下面我们来感受一下,不过在这之前需要先安装。

pip install grpcio grpcio-tools protobuf -i https://pypi.tuna.tsinghua.edu.cn/simple

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwfsgj.html