5

在 Python 脚本中mylibrary.py,我使用Protocol Buffers使用以下方法对数据进行建模:

  • 在 .proto 文件中定义消息格式。
  • 使用协议缓冲区编译器。
  • 使用 Python 协议缓冲区 API 在 .py 模块中写入和读取消息。

我想在 App Engine 上实现 Cloud Endpoints Frameworkimports使用上述 Python 脚本,但是 Cloud Endpoints 使用ProtoRPC,而不是“标准” Protocol Buffers

我的 App Engine Python 模块,从而不是使用“离线”编译器main.py导入来生成序列化和反序列化代码:protorpcprotoc

from protorpc import messages
from protorpc import remote

消息不是使用.proto文件定义的。相反,定义了类,继承自protorpc.messages.Message

class MyMessageDefinition(messages.Message)

可以将 Proto Buffers 转换为 Proto RPC 等价物吗?我真的不想mylibrary.py改用 ProtoRPC,因为它不如Protocol Buffers通用。

4

2 回答 2

4

经过八个月的大量实验后,我将添加我的意见。我希望它可以节省一些时间。

首先选择你的框架

Google Cloud 提供不同的 Cloud Endpoint 产品。所有这些都可用于 JSON/REST API。这对我来说不是很清楚。Cloud Endpoints是一个非常高级的短语,涵盖了在多个Google Cloud 后端上开发、部署和管理 API。

这里的重点是,在决定使用 Cloud Endpoints 之后,您仍然必须决定使用后端技术来为您的 API 提供服务。文档感觉有点隐蔽,但我强烈建议从Google Cloud Endpoints 文档开始。

您可以选择:

  1. OpenAPI 规范
  2. 端点框架
  3. gRPC

其次选择您的实施

在每个 API 框架中,您的 API(服务)可以在其上运行的云实现可供选择:

OpenAPI 规范 - 用于实现的JSON/REST API:

  • Google App Engine 柔性环境
  • 谷歌计算引擎
  • 谷歌容器引擎
  • Kubernetes

端点框架 - 用于实现的JSON/REST API:

  • 使用 Java 的 Google App Engine 标准环境
  • 使用 Python 的 Google App Engine 标准环境

gRPC - 用于在以下位置实现的gRPC API:

  • 谷歌计算引擎
  • 谷歌容器引擎
  • Kubernetes

在这里发布问题时,我使用的是在带有 Python 的 Google App Engine 标准环境上运行的Endpoints Frameworks 。然后,我将我的 API(服务)迁移到 Google Compute Engine 上的 gRPC。

细心的人可能会注意到OpenAPI 规范端点框架都可以用于 JSON/REST API,而gRPC只公开了一个 gRPC API。那么我是如何将我的 REST API 从Endpoints Frameworks移植到gRPC的呢?答案是将HTTP/JSON 转码为 gRPC(我在此过程中学到了,但我并没有立即清楚)。所以,不要仅仅因为你想要 REST/HTTP 就排除 gRPC。

答案

那么这与我原来的问题有什么关系呢?

我试图在.proto文件和 gRPC 注释之间进行转换,这意味着我走错了路。

如果您想使用普通.proto文件编写应用程序,请在 Compute Engine 上选择gRPC 。如果您需要将其作为 REST API,则可以这样做,但您需要将ESP添加到后端配置中。它几乎是一个NGINX服务器设置作为反向代理。这里唯一的缺点是你需要一些 Docker 知识来确保 ESP(代理)和你的 gRPC 服务器可以通信(Docker 网络)。

如果您的代码已经在 App Engine 上,并且您希望以最小的努力将其公开为 REST API,并且仍然获得良好的 API 管理功能,请选择Endpoints Frameworks警告:我放弃了这个,因为它太贵了(我每月的账单是 100 美元左右)。

如果您想.protos完全避免,请使用OpenAPI Specification

最后,如果您想提供程序化集成、客户端库,或者您想提供微服务,那么请考虑gRPC。移除 ESP(代理)并在几乎任何机器上运行 gRPC 服务器都很容易(只要安装了Protocol Buffer Runtime

最终,我在 Compute Engine 和 Docker 上选择了 gRPC。我还有一个 ESP 来为 gRPC 提供 HTTP 转码,反之亦然。我喜欢这种方法有几个原因:

  1. 你会学到很多:Docker、Docker 网络、NGINX 配置、协议缓冲区、ESP(云代理)、gRPC 服务器。
  2. 服务(核心业务)逻辑可以用普通的 gRPC 编写。这允许该服务在没有 Web 服务器的任何机器上运行。您的业​​务逻辑是服务器:)
  3. Protocol Buffers / gRPC 非常适合将业务逻辑隔离为服务……或微服务。它们也很适合提供定义良好的接口和库。

避免这些错误

于 2017-10-12T14:19:30.300 回答
0

我发现了一个名为 pyprotobuf ( http://pyprotobuf.readthedocs.io ) 的项目,它可以从 proto 文件开始生成带有 protopc 类的模块。

根据文档(http://pyprotobuf.readthedocs.io/topics/languages/protorpc.html),您需要执行:

protopy --format python example.proto

于 2017-10-11T19:37:31.040 回答