首先安装gRPC环境并定义.proto接口文件,接着生成C++代码,然后分别实现服务端和客户端逻辑,最后编译链接并运行程序完成RPC通信。

在C++中使用gRPC进行远程过程调用(RPC),需要经过几个关键步骤:定义服务接口、生成代码、实现服务端和客户端逻辑,并运行通信。下面详细介绍如何操作。
1. 安装gRPC环境
要使用gRPC,先确保系统中安装了gRPC开发库。可以通过源码编译或包管理器安装。
Ubuntu/Debian 示例:安装依赖:
- sudo apt-get update
- sudo apt-get install build-essential autoconf libtool pkg-config
- git clone -b v1.50.1 https://github.com/grpc/grpc.git
- cd grpc && git submodule update --init
- mkdir -p cmake/build && cd cmake/build
- cmake ../..
- make -j4
- sudo make install
这会安装gRPC核心库和Protocol Buffers编译器(protoc)。
立即学习“C++免费学习笔记(深入)”;
2. 定义 .proto 文件
使用 Protocol Buffers 定义服务接口和数据结构。创建一个 helloworld.proto 文件:
syntax = "proto3";package example;
// 定义请求消息 message HelloRequest { string name = 1; }
// 定义响应消息 message HelloReply { string message = 1; }
// 定义服务 service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); }
这个文件声明了一个名为 SayHello 的远程方法,接收一个字符串参数并返回一条消息。
3. 生成 gRPC 代码
使用 protoc 编译器生成 C++ 代码:
- protoc --grpc_out=. --cpp_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` helloworld.proto
执行后会生成四个文件:
- helloworld.pb.h
- helloworld.pb.cc
- helloworld.grpc.pb.h
- helloworld.grpc.pb.cc
这些是序列化消息和服务存根的基础。
4. 实现服务端
编写服务端代码,继承生成的服务类并重写方法:
#include#include #include #include #include "helloworld.grpc.pb.h" using grpc::Server; using grpc::ServerBuilder; using grpc::Status; using grpc::StatusCode; using example::HelloRequest; using example::HelloReply; using example::Greeter;
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(builder.BuildAndStart()); std::cout << "Server listening on " << server_address << std::endl; server->Wait(); } int main() { RunServer(); return 0; }
5. 实现客户端
客户端创建存根并调用远程方法:
#include#include #include "helloworld.grpc.pb.h" using grpc::Channel; using grpc::ClientContext; using grpc::Status; using example::HelloRequest; using example::HelloReply; using example::Greeter;
class GreeterClient { public: GreeterClient(std::sharedptr
channel) : stub (Greeter::NewStub(channel)) {}std::string SayHello(const std::string& user) { HelloRequest request; request.set_name(user);
HelloReply reply; ClientContext context; Status status = stub_-youjiankuohaophpcnSayHello(&context, request, &reply); if (status.ok()) { return reply.message(); } else { std::cout zuojiankuohaophpcnzuojiankuohaophpcn "RPC failed: " zuojiankuohaophpcnzuojiankuohaophpcn status.error_code() zuojiankuohaophpcnzuojiankuohaophpcn ": " zuojiankuohaophpcnzuojiankuohaophpcn status.error_message() zuojiankuohaophpcnzuojiankuohaophpcn std::endl; return "RPC failed"; }}
private: std::uniqueptr<:stub> stub; };
int main(int argc, char** argv) { GreeterClient client(grpc::CreateChannel( "localhost:50051", grpc::InsecureChannelCredentials())); std::string user("world"); std::string reply = client.SayHello(user); std::cout
6. 编译与运行
编译时需链接 gRPC 和 Protobuf 库。示例 Makefile 片段:
CXX = g++ CXXFLAGS = -std=c++11 PROTOBUF_LIB = -lprotobuf GRPC_LIB = -lgrpc++ -lgrpc LIBS = $(PROTOBUF_LIB) $(GRPC_LIB)all: greeter_client greeter_server
greeter_client: helloworld.pb.o helloworld.grpc.pb.o client.o $(CXX) $^ -o $@ $(LIBS)
greeter_server: helloworld.pb.o helloworld.grpc.pb.o server.o $(CXX) $^ -o $@ $(LIBS)
clean: rm -f *.o greeter_client greeter_server
运行流程:
- 先启动服务端:./greeter_server
- 再运行客户端:./greeter_client
- 客户端将输出:Response: Hello, world
基本上就这些。按照这个流程,你可以在C++项目中成功集成gRPC实现远程调用。关键是理解.proto定义、代码生成机制和服务/客户端的交互模式。











