gRPC for C++ 简介
gRPC 是一个由 Google 开发的现代远程过程调用 (RPC) 框架。它使用 Protocol Buffers (protobuf) 进行数据序列化,并使用 HTTP/2 作为传输协议。对于 C++ 语言,gRPC 提供了原生库,允许您创建高性能的微服务和分布式系统。
在本文中,我们将介绍主要的库、环境配置,并编写一个完整的 C++ 客户端-服务器应用程序示例。
gRPC for C++ 的主要库
要在 C++ 中使用 gRPC,需要安装几个组件:
- grpc — 核心库,包含服务器和客户端的实现。
- grpc++ — gRPC 的 C++ 封装,提供便捷的 API。
- protobuf — 用于处理 Protocol Buffers 的库(类生成、序列化/反序列化)。
- grpc_cpp_plugin — protoc 编译器的插件,用于从 .proto 文件生成 C++ 代码。
可能还需要一些依赖项:abseil-cpp、openssl、zlib 和 c-ares。
安装 gRPC 和 protobuf
推荐的方法是通过 CMake 从源码构建。Linux/macOS 示例:
git clone --recurse-submodules -b v1.60.0 https://github.com/grpc/grpccd grpcmkdir build && cd buildcmake .. -DgRPC_INSTALL=ON -DCMAKE_INSTALL_PREFIX=/usr/localmake -j$(nproc)sudo make install安装后,检查 protobuf 编译器和插件是否可用:
protoc --versionwhich grpc_cpp_plugin通过 .proto 文件定义服务
创建一个 example.proto 文件:
syntax = "proto3";
package example;
service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}
message HelloRequest { string name = 1;}
message HelloReply { string message = 1;}生成 C++ 代码:
protoc --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` example.proto结果将生成以下文件:example.pb.h、example.pb.cc、example.grpc.pb.h、example.grpc.pb.cc。
用 C++ 实现服务器
创建一个 server.cc 文件:
#include <iostream>#include <memory>#include <string>
#include <grpcpp/grpcpp.h>#include "example.grpc.pb.h"
using grpc::Server;using grpc::ServerBuilder;using grpc::ServerContext;using grpc::Status;using example::Greeter;using example::HelloRequest;using example::HelloReply;
class GreeterServiceImpl final : public Greeter::Service { Status SayHello(ServerContext* context, const HelloRequest* request, HelloReply* reply) override { std::string prefix("Hello, "); reply->set_message(prefix + request->name()); return Status::OK; }};
void RunServer() { std::string server_address("0.0.0.0:50051"); GreeterServiceImpl service;
ServerBuilder builder; builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); builder.RegisterService(&service);
std::unique_ptr<Server> server(builder.BuildAndStart()); std::cout << "Server listening on " << server_address << std::endl; server->Wait();}
int main() { RunServer(); return 0;}用 C++ 实现客户端
创建一个 client.cc 文件:
#include <iostream>#include <memory>#include <string>
#include <grpcpp/grpcpp.h>#include "example.grpc.pb.h"
using grpc::Channel;using grpc::ClientContext;using grpc::Status;using example::Gree