调用Google Cloud Datastore方法时,gRPC C ++客户端崩溃

时间:2019-06-21 21:22:15

标签: c++ google-cloud-datastore grpc

我正在尝试使用C ++实现一项服务,该服务需要访问存储在Google Cloud Datastore中的实体。该服务将在Google Cloud上的docker容器中运行。我决定使用gRPC代替REST API。我在python中有一个工作的gRPC示例。但是,C ++ gRPC客户端在存根上调用方法时会崩溃。由于这是我第一次尝试使用gRPC访问Google Cloud,因此我无法保证代码的正确性。我的代码取决于从googleapis生成的protobuf C ++输出以及gRPC。

崩溃在gRPC库中。调用该方法后,它等待,并且可能超过了期限,然后失败。详细的输出或跟踪没有太多帮助。似乎gRPC正在取消引用call_op_set.h:71中的空指针(我的主分支当前位于21c4e7d9f2上)。我还没有使用消毒剂构建gRPC。也许他们可以尽早发现错误。看起来元数据有问题。我的代码可能是错误的,并且可能导致问题的根源。我在互联网上找不到很好的例子。我正在尝试阅读一些Java和Python代码,并将其应用于C ++。

我的主要问题是关于JSON文件。我已经在Google Cloud上创建了一个服务帐户和一个密钥。密钥创建以JSON文件结束。我正在尝试获取其内容,并传递给我的C ++代码中的ServiceAccountJWTAccessCredentials

如果有人可以帮助我发现错误,我将非常高兴。

#include <fstream>
#include <iostream>
#include <sstream>
#include <grpc++/grpc++.h>
#include "google/datastore/v1/datastore.grpc.pb.h"
#include "google/datastore/v1/query.pb.h"

static std::string get_file_contents(const char *filename) {
  if (std::ifstream in(filename, std::ios::in | std::ios::binary); in) {
    std::ostringstream contents;
    contents << in.rdbuf();
    in.close();
    return (contents.str());
  }
  throw std::system_error(errno, std::generic_category());
}

int main() {
  using namespace std::string_literals;

  const std::string project_id = "my project id"s;
  const char *file = "json-file-generated-by-service-account.json";
  const std::string content = get_file_contents(file);

  auto creds = grpc::CompositeChannelCredentials(
      grpc::SslCredentials(grpc::SslCredentialsOptions()),
      grpc::ServiceAccountJWTAccessCredentials(content));

  auto channel = grpc::CreateChannel("datastore.googleapis.com:443"s, creds);
  auto stub = google::datastore::v1::Datastore::NewStub(channel);

  google::datastore::v1::RunQueryRequest qry;
  auto mutq = qry.mutable_query();
  auto k = mutq->mutable_kind();
  auto added = k->Add();
  added->set_name("my_kind"s);
  qry.set_project_id(project_id);
  grpc::ClientContext cli_ctx;
  cli_ctx.set_initial_metadata_corked(true);
  google::datastore::v1::RunQueryResponse resp;
  auto status = stub->RunQuery(&cli_ctx, qry, &resp);
  std::cout << "Error: code: " << status.error_code()
            << "\nMessage: " << status.error_message()
            << "\nDetails: " << status.error_details();
}

0 个答案:

没有答案