两台安装有 Python 的主机 C 和 S,C 上有 JSON 格式的输入数据, S 上有 Python 编写的复杂(例如机器学习)算法, 通过下面的步骤实现 C 将输入文件发给 S,S 计算出结果返回给 C:
- S 和 C 都安装 gRPC 环境:用 pip 安装 grpcio, grpcio-tools 两个包
- 编写通讯协议文件(扩展名为 proto),并编译为 Python 代码给 S 和 C
- 在 S 上编写服务端 Python 脚本并启动 gRPC 服务
- 在 C 上编写客户端 Python 脚本并向 A 的地址(和端口)发送数据,得到计算结果。
gRPC 与 REST 的区别:
- gRPC 基于 HTTP/2,REST 基于 HTTP 1.1,前者是二进制协议, 支持多路复用,性能更优
- gRPC 能够实现双向传输,REST 只能 client request, server response
- gRPC 表达能力更强:不使用 REST 的资源 (resource, 名词) 描述方法, 而是基于某种特定语言的 interface, function 以及数据结构
- gRPC 使用的 protobuf 是带类型的,定义更严格
- gRPC 目前主要使用的领域是后台服务(微服务)间的信息传输, REST 主要使用在 Web 服务向外界提供服务
Ref: REST vs. gRPC: Battle of the APIs
wikipedia 的 Interface description language (IDL) 解释的很清楚,这是跨编程语言的 API 描述方法, 例如 JSON, CORBA, COM, DCOM by Microsoft, Protocol buffers by Google 等。
grpc 的 Python 版 helloworld 实例见 helloworld 中的 greeter_server.py 和 greeter_client.py, 传输协议(protobuf 格式)定义在 helloworld.proto 文件中,使用 protocol buffer compiler 编译成 Python 源码文件 helloworld_pb2.py, 供 server 和 client 使用。
另一个 protobuf 接口定义见 polyline.proto.