gRPC + Bazel + Envoy Json 代理 - 如何导入 google/api/annotations.proto

ram*_*tej 3 java json protocol-buffers grpc bazel

我有一个非常简单的 gRPC 服务,定义为:

syntax = "proto3";
package helloworld;
import "annotations.proto";

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello(HelloRequest) returns (HelloReply) {
    option (google.api.http) = {
      post: "/api/v1/hello"
      body: "*"
    }
  }
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;
}
Run Code Online (Sandbox Code Playgroud)

有趣的是,我使用 Envoy gRPC <> JSON 转码过滤器在 HTTP2/Protobuf <> HTTP1/JSON 之间进行“翻译”。有关更多详细信息,请参阅https://www.envoyproxy.io/docs/envoy/latest/api-v1/http_filters/grpc_json_transcoder_filter

此外,我使用 Bazel 构建基于 Java 的 gRPC 服务。Envoy 转码过滤器需要一些注释:

option (google.api.http) = {
  post: "/api/v1/hello"
  body: "*"
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 proto_library ( https://github.com/cgrushko/proto_library ) 从 .proto 定义生成相应的 .java 文件,但我无法添加

import "google/api/annotations.proto";
Run Code Online (Sandbox Code Playgroud)

到 .proto 文件,因为我不知道如何将https://github.com/googleapis/googleapis/blob/master/google/api/annotations.proto导入 bazel 项目。

谢谢。

最好的问候,jj

use*_*136 5

丑陋且难以维护的超快方式:供应商文件

您通常可以将 a 复制.proto到您自己的项目并针对它进行构建;只要上游原型不改变“太多”,它就会继续工作。

例如,如果googleapi调查谁正在使用他们的存储库,那么如果您复制了文件,他们将找不到您的使用情况。

将文件放入存储库后,您可以按照https://github.com/cgrushko/proto_library/blob/04369f0d2ade8c8566727e0b6f3a53f1ba8925c0/src/BUILD中的示例进行操作。

可维护的方式:外部存储库

外部存储库(例如http_archive)允许您依赖另一个 Bazel 项目。使用http_archive,它将被下载并作为构建的一部分进行构建。

对于http_archive,外部项目必须已经使用 Bazel 进行构建,但情况并非如此googleapi:它没有google/api/annotations.proto.

一种选择是与他们交谈,看看他们是否可以添加这样的 BUILD 文件(或自己发送 PR)。另一种选择是使用new_http_archive并提供您自己的 BUILD 文件作为定义的一部分。

将以下内容添加到您的WORKSPACE文件(在项目的根目录下)应该或多或少有效:

new_http_archive(
  name = "googleapi",
  url = "https://github.com/googleapis/googleapis/archive/common-protos-1_3_1.zip",
  strip_prefix = "googleapis-common-protos-1_3_1/",
  build_file_content = "proto_library(name = 'annotations_proto', srcs = ['google/api/annotations.proto'])"
)
Run Code Online (Sandbox Code Playgroud)

然后,您就可以在您的代码中依赖它:

proto_library(
  name = "hellow_world_proto",
  ...
  deps = ["@googleapi//:annotations_proto"],
)
Run Code Online (Sandbox Code Playgroud)