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

时间:2017-12-21 18:46:37

标签: 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;
}

有趣的是,我正在使用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服务。特使转码过滤器需要一些注释:

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

2 个答案:

答案 0 :(得分:2)

丑陋,无法维护的超快速方式:供应商文件

您通常可以将.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文件。< / p>

一种选择是与他们交谈,看他们是否可以添加这样的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"],
)

答案 1 :(得分:2)

我遵循了第二个提案(可维护的方式:外部存储库)并最终得到:

WORKSPACE:

@NonNull
@Override
public Filter getFilter() {

    return new Filter() {
        final Object object = new Object();

        @Override
        public String convertResultToString(Object resultValue) {
         return resultValue.toString();

        }

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {




            FilterResults filterResults = new FilterResults();
            List<Customer> customers = new ArrayList<>();

            if (constraint != null) {

                for (Customer customer : customerList) {
                    if (department instanceof SearchableStrings) {
                        if (customer.getname().toLowerCase().contains(constraint.toString().toLowerCase())) {
                            customers.add(customer);

                        }

                    } 
                    if (customers.size() > 1) {
                        filterResults.values = customers;
                        filterResults.count =      customers.size();
                    } else {
                        filterResults.values = null;
                        filterResults.count = 0;


                }



            }
            //notifyDataSetChanged();
            return filterResults;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {

            // mObjects.clear();
            if (results != null && results.count > 0) {
               clear();
                // avoids unchecked cast warning when using customerList.addAll((ArrayList<Customer>) results.values);
                for (Object object : (List<?>) results.values) {
                    add(object);


                }
                notifyDataSetChanged();
            }
        }


    };

BUILD.googleapi

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文件中的annotation.proto的引用:

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'])

此致 JJ