gRPC + Bazel + Envoy Json 代理 - 如何导入 google/api/annotations.proto
gRPC + Bazel + Envoy Json Proxy - How to import google/api/annotations.proto
我有一个非常简单的 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;
}
有趣的是,我在 HTTP2/Protobuf <> HTTP1/JSON 之间使用 Envoy gRPC <> JSON 转码过滤器到 "translate"。有关详细信息,请参阅 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: "*"
}
我正在使用 proto_library (https://github.com/cgrushko/proto_library) 从 .proto 定义生成相应的 .java 文件,但我无法添加
import "google/api/annotations.proto";
到 .proto 文件,因为我不知道如何将 https://github.com/googleapis/googleapis/blob/master/google/api/annotations.proto 导入 bazel 项目。
谢谢。
此致,
jj
丑陋、难以维护的超快速方式:供应文件
您通常可以将 .proto
复制到您自己的项目中并对其进行构建;只要上游协议没有改变 "too much" 它就会继续工作。
例如,如果 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'])"
)
然后,您就可以依赖它来编写您的代码了:
proto_library(
name = "hellow_world_proto",
...
deps = ["@googleapi//:annotations_proto"],
)
我遵循了第二个建议(可维护的方式:外部存储库)并最终得到:
工作空间:
http_archive(
name = "com_google_protobuf",
sha256 = "cef7f1b5a7c5fba672bec2a319246e8feba471f04dcebfe362d55930ee7c1c30",
strip_prefix = "protobuf-3.5.0",
urls = ["https://github.com/google/protobuf/archive/v3.5.0.zip"],
)
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="BUILD.googleapi"
)
BUILD.googleapi
package(default_visibility=['//visibility:public'])
proto_library(
name = 'annotations_proto',
srcs = ['google/api/annotations.proto'],
deps = [
":http_proto",
"@com_google_protobuf//:descriptor_proto"
],
)
proto_library(
name = 'http_proto',
srcs = ['google/api/http.proto'])
建造
最后是 BUILD 文件中对 annotation.proto 的引用:
proto_library(
name = "GreeterServices_proto",
srcs = ["GreeterServices.proto"],
deps = [
"@googleapi//:annotations_proto",
])
此致,
jj
我有一个非常简单的 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;
}
有趣的是,我在 HTTP2/Protobuf <> HTTP1/JSON 之间使用 Envoy gRPC <> JSON 转码过滤器到 "translate"。有关详细信息,请参阅 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: "*"
}
我正在使用 proto_library (https://github.com/cgrushko/proto_library) 从 .proto 定义生成相应的 .java 文件,但我无法添加
import "google/api/annotations.proto";
到 .proto 文件,因为我不知道如何将 https://github.com/googleapis/googleapis/blob/master/google/api/annotations.proto 导入 bazel 项目。
谢谢。
此致, jj
丑陋、难以维护的超快速方式:供应文件
您通常可以将 .proto
复制到您自己的项目中并对其进行构建;只要上游协议没有改变 "too much" 它就会继续工作。
例如,如果 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'])"
)
然后,您就可以依赖它来编写您的代码了:
proto_library(
name = "hellow_world_proto",
...
deps = ["@googleapi//:annotations_proto"],
)
我遵循了第二个建议(可维护的方式:外部存储库)并最终得到:
工作空间:
http_archive(
name = "com_google_protobuf",
sha256 = "cef7f1b5a7c5fba672bec2a319246e8feba471f04dcebfe362d55930ee7c1c30",
strip_prefix = "protobuf-3.5.0",
urls = ["https://github.com/google/protobuf/archive/v3.5.0.zip"],
)
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="BUILD.googleapi"
)
BUILD.googleapi
package(default_visibility=['//visibility:public'])
proto_library(
name = 'annotations_proto',
srcs = ['google/api/annotations.proto'],
deps = [
":http_proto",
"@com_google_protobuf//:descriptor_proto"
],
)
proto_library(
name = 'http_proto',
srcs = ['google/api/http.proto'])
建造
最后是 BUILD 文件中对 annotation.proto 的引用:
proto_library(
name = "GreeterServices_proto",
srcs = ["GreeterServices.proto"],
deps = [
"@googleapi//:annotations_proto",
])
此致, jj