快速入门|c++|gRPC

快速入门

本指南通过一个简单的工作示例,C++开始使用 gRPC。

在C++世界中,没有普遍接受的项目管理标准 依赖。在生成和运行之前,需要生成并安装 gRPC 本快速入门的 Hello World 示例。

生成并本地安装 gRPC 和协议缓冲区
本节中的步骤说明如何生成和本地安装 gRPC 和 使用 .如果您更愿意使用cmakebazel看Building from source(bazel这个网站我这打不开没法添加链接,有需要的自行搜索,谢谢)

设置

选择一个目录来保存本地安装的软件包。假定环境变量保存此目录路径。例:MY_INSTALL_DIR

export MY_INSTALL_DIR=$HOME/.local

确保目录存在:

mkdir -p $MY_INSTALL_DIR

将本地文件夹添加到路径变量,例如:bin

export PATH="$MY_INSTALL_DIR/bin:$PATH"

安装cmack

需要 的 3.13 或更高版本。安装方式 按照以下说明操作:cmake

Linux目录

sudo apt install -y cmake

macOS:

brew install cmake

有关一般安装说明,请参阅cmake安装 CMake

检查的版本:cmake

cmake --version
cmake version 3.19.6

在 Linux 下,系统范围的版本通常可能太旧。你 可以将更新的版本安装到本地安装目录中,作为 遵循:cmake

wget -q -O cmake-linux.sh https://github.com/Kitware/CMake/releases/download/v3.19.6/cmake-3.19.6-Linux-x86_64.sh
sh cmake-linux.sh -- --skip-license --prefix=$MY_INSTALL_DIR
rm cmake-linux.sh

安装其他必需的工具

安装生成 gRPC 所需的基本工具:

Linux目录

sudo apt install -y build-essential autoconf libtool pkg-config

macOS:

brew install autoconf automake libtool pkg-config

克隆存储库grpc

克隆存储库及其子模块:grpc

git clone --recurse-submodules -b v1.55.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc

生成并安装 gRPC 和协议缓冲区

虽然不是强制性的,但 gRPC 应用程序通常利用协议缓冲区用于服务定义和数据序列化,示例代码使用原型3.

以下命令生成并本地安装 gRPC 和协议缓冲区:

cd grpc
mkdir -p cmake/build
pushd cmake/build
cmake -DgRPC_INSTALL=ON \
      -DgRPC_BUILD_TESTS=OFF \
      -DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR \
      ../..
make -j 4
make install
popd

注意

强烈建议在本地安装 gRPC — 使用 适当设置 — 因为没有简单的方法 以在全局安装 gRPC 后将其卸载。CMAKE_INSTALL_PREFIX

更多信息:
可以在 中找到有关生成 gRPC C++的完整说明集Building from source.
有关如何将 gRPC 作为依赖项添加到C++的一般说明 项目,请参见开始使用Start using gRPC C++

构建示例

示例代码是存储库源的一部分,您将其克隆为存储库源的一部分 上一节的步骤。grpc

1、切换到示例的目录:

cd examples/cpp/helloworld

使用以下方法构建示例:cmake

mkdir -p cmake/build
pushd cmake/build
cmake -DCMAKE_PREFIX_PATH=$MY_INSTALL_DIR ../..
make -j 4

注意

遇到构建失败? 在这一点上,大多数问题都是 安装错误。确保您拥有正确版本的 和 仔细重新检查您的安装cmake

试试吧!

从示例构建目录运行示例:examples/cpp/helloworld/cmake/build

1、运行服务器:

./greeter_server

2、从不同的终端运行客户端并查看客户端输出:

./greeter_client
Greeter received: Hello world

祝贺!你刚刚使用 gRPC 运行了客户端-服务器应用程序。

更新 gRPC 服务

现在让我们看看如何使用额外的方法来更新应用程序 客户端调用的服务器。我们的 gRPC 服务是使用协议定义的 缓冲区;可以在 gRPC 简介和基础知识中找到有关如何在文件中定义服务的详细信息 教程。现在你需要知道的是,两者 服务器和客户端存根有一个 RPC 方法,该方法从客户端获取参数并从 服务器,并且此方法定义如下:.protoSayHello()HelloRequestHelloReply

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

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

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

打开examples/protos/helloworld.proto并添加一个新方法,其中 相同的请求和响应类型:SayHelloAgain()

// The greeting service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  // Sends another greeting
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

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

// The response message containing the greetings
message HelloReply {
  string message = 1;
}

记得保存文件!

重新生成 gRPC 代码

在使用新的服务方法之前,需要重新编译更新的 原型文件。

从示例构建目录 中,运行:examples/cpp/helloworld/cmake/build

make -j 4

这将再生和 , 包含生成的客户端和服务器类,以及 填充、序列化和检索我们的请求和响应类型。helloworld.pb.{h,cc}helloworld.grpc.pb.{h,cc}

更新并运行应用程序

您有新生成的服务器和客户端代码,但仍需要实现 并在示例应用程序的人工编写部分中调用新方法。

更新服务器

从示例的根目录打开。实施新的 方法如下:greeter_server.cc

class GreeterServiceImpl final : public Greeter::Service {
  Status SayHello(ServerContext* context, const HelloRequest* request,
                  HelloReply* reply) override {
     // ...
  }

  Status SayHelloAgain(ServerContext* context, const HelloRequest* request,
                       HelloReply* reply) override {
    std::string prefix("Hello again ");
    reply->set_message(prefix + request->name());
    return Status::OK;
  }
};

更新客户端

存根中现在提供了一种新方法。我们将遵循 与已经存在的模式相同,并将新方法添加到:SayHelloAgain()SayHello()SayHelloAgain()GreeterClient

class GreeterClient {
 public:
  // ...
  std::string SayHello(const std::string& user) {
     // ...
  }

  std::string SayHelloAgain(const std::string& user) {
    // Follows the same pattern as SayHello.
    HelloRequest request;
    request.set_name(user);
    HelloReply reply;
    ClientContext context;

    // Here we can use the stub's newly available method we just added.
    Status status = stub_->SayHelloAgain(&context, request, &reply);
    if (status.ok()) {
      return reply.message();
    } else {
      std::cout << status.error_code() << ": " << status.error_message()
                << std::endl;
      return "RPC failed";
    }
  }

最后,在 中调用此新方法:main()

int main(int argc, char** argv) {
  // ...
  std::string reply = greeter.SayHello(user);
  std::cout << "Greeter received: " << reply << std::endl;

  reply = greeter.SayHelloAgain(user);
  std::cout << "Greeter received: " << reply << std::endl;

  return 0;
}

跑!

像以前一样运行客户端和服务器。执行以下命令 从示例构建目录:examples/cpp/helloworld/cmake/build

1、在进行更改后构建客户端和服务器:

make -j 4

2、运行服务器:

./greeter_server

3、在不同的终端上,运行客户端:

./greeter_client

你将看到以下输出:

Greeter received: Hello world
Greeter received: Hello again world

最后

若对客户端和服务器的异步版本感兴趣,可以看看greeter_async_{client,server}.cc示例的源目录

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值