将proto缓冲区转换为ProtoRPC

时间:2017-03-25 17:56:26

标签: python google-app-engine protocol-buffers protorpc

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

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

我想实现imports main.py并使用前面提到的Python脚本,但是Cloud Endpoints使用Cloud Endpoints Framework on App Engine,而不是'标准' ProtoRPC

我的App Engine Python模块protorpcprotoc导入,而不是使用' offline' from protorpc import messages from protorpc import remote 编译器生成序列化和反序列化代码:

.proto

使用protorpc.messages.Message文件定义 消息。而是定义了类,继承自class MyMessageDefinition(messages.Message)

mylibrary.py

Proto Buffers可以转换为Proto RPC等价物吗?我真的不想改变public static int CountWhoHasTwoSameSons(BinNode<int> Head) { if (Head == null) return 0; if (IsLeaf(Head)) return 1; if ((Head.HasLeft() && Head.HasRight()) && (Head.GetRight() == Head.GetLeft())) // It happens with this if statement! return 1 + CountWhoHasTwoSameSons(Head.GetLeft()) + CountWhoHasTwoSameSons(Head.GetRight()); } 使用ProtoRPC,因为它不如Protocol Buffers那么通用。

2 个答案:

答案 0 :(得分:4)

经过八个月的大量实验,我将加入我的观点。我希望能节省一些时间。

首先选择您的框架

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

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

您可以选择:

  1. OpenAPI Specification
  2. Endpoints Frameworks
  3. gRPC
  4. 选择您的实施第二

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

    OpenAPI Specification   - 在上实施 JSON / REST API:

    • Google App Engine灵活环境
    • Google Compute Engine
    • Google容器引擎
    • Kubernetes

    Endpoints Frameworks   - 在上实施 JSON / REST API:

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

    gRPC   - 对于 gRPC API实施:

    • Google Compute Engine
    • Google容器引擎
    • Kubernetes

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

    您之间的观察者可能会注意到OpenAPI SpecificationEndpoints Frameworks都可用于JSON / REST API,而gRPC仅公开gRPC API。那么我如何将我的REST API从Endpoints Frameworks移植到gRPC?答案是Transcoding HTTP/JSON to gRPC(我在学习过程中学到了这一点,但我并不是很清楚)。所以,不要因为你想要REST / HTTP而排除gRPC。

    答案

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

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

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

    如果您的代码已经在App Engine上,并且您希望以最少的工作量将其公开为REST API并且仍然获得良好的API管理功能,请选择Endpoints Frameworks警告:我离开了这个地方,因为它过于昂贵(我每月收费100美元)。

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

    最后,如果您想提供程序化集成,客户端库,或者您想提供microservice,那么请务必考虑gRPC。只需安装Protocol Buffer Runtime,就可以轻松删除ESP(代理)并在几乎任何计算机上运行gRPC服务器。

    最终,我决定使用Docker在计算引擎上使用gRPC。我还有一个ESP为gRPC提供HTTP转码,反之亦然。我喜欢这种方法有几个原因:

    1. 您学到了很多东西:Docker,Docker Networking,NGINX配置,协议缓冲区,ESP(云代理),gRPC服务器。
    2. 服务(核心业务)逻辑可以使用普通的gRPC编写。这允许服务在没有Web服务器的任何机器上运行。您的业​​务逻辑是服务器:)
    3. 协议缓冲区/ gRPC非常适合将业务逻辑隔离为服务...或微服务。它们也非常适合提供定义良好的接口和库。
    4. 避免这些错误

      • 实现您找到的第一个框架/架构。如果我可以重新开始,我不会选择Endpoints Frameworks。这是昂贵的,并使用注释而不是.proto文件,IMO使代码更难移植。

      • 在决定框架和实施之前阅读Always Free Usage LimitsEndpoints Frameworks使用后端 App Engine实例 - 几乎没有免费配额。令人困惑,前端 App Engine实例非常generous free quota

      • 考虑本地发展。 Cloud Endpoints本地开发服务器没有得到官方支持(至少在我的问题时他们还没有)。相反,有一整页关于运行Local Extensible Service Proxy

答案 1 :(得分:0)

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

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

protopy --format python example.proto