2026-02-24 17:22:28
gRPC是由Google开发的一款开源高性能RPC框架,支持跨语言、跨平台,使用Protocol Buffers进行数据序列化,基于HTTP/2协议,提供双向流和认证机制。以下是一个简单的C++实现示例,展示如何使用gRPC进行远程过程调用。
1. 安装gRPC首先,需要安装gRPC和Protocol Buffers。可以参考官方文档进行安装:
使用Protocol Buffers定义服务和消息格式。创建一个文件mathtest.proto:
syntax = "proto3";package mathtest;service MathTest { rpc Multiply (MathRequest) returns (MathReply) {}}message MathRequest { int32 a = 1; int32 b = 2;}message MathReply { int32 result = 1;}3. 生成gRPC代码使用Protocol Buffers编译器生成C++代码:
protoc --grpc_out=. --cpp_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` mathtest.proto这将生成mathtest.pb.h、mathtest.pb.cc、mathtest.grpc.pb.h和mathtest.grpc.pb.cc文件。
4. 实现服务端创建一个服务端实现文件server.cc:
#include <iostream>#include <memory>#include <string>#include <grpcpp/grpcpp.h>#include <grpcpp/health_check_service_interface.h>#include <grpcpp/ext/proto_server_reflection_plugin.h>#include "mathtest.grpc.pb.h"using grpc::Server;using grpc::ServerBuilder;using grpc::ServerContext;using grpc::Status;using mathtest::MathRequest;using mathtest::MathReply;using mathtest::MathTest;class MathTestServiceImpl final : public MathTest::Service { Status Multiply(ServerContext* context, const MathRequest* request, MathReply* reply) override { int a = request->a(); int b = request->b(); reply->set_result(a * b); return Status::OK; }};void RunServer() { std::string server_address("0.0.0.0:50051"); MathTestServiceImpl service; grpc::EnableDefaultHealthCheckService(true); grpc::reflection::InitProtoReflectionServerBuilderPlugin(); 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(int argc, char argv) { RunServer(); return 0;}5. 实现客户端创建一个客户端实现文件client.cc:
#include <iostream>#include <memory>#include <string>#include <grpcpp/grpcpp.h>#include "mathtest.grpc.pb.h"using grpc::Channel;using grpc::ClientContext;using grpc::Status;using mathtest::MathRequest;using mathtest::MathReply;using mathtest::MathTest;class MathTestClient {public: MathTestClient(std::shared_ptr<Channel> channel) : stub_(MathTest::NewStub(channel)) {} int Multiply(int a, int b) { MathRequest request; request.set_a(a); request.set_b(b); MathReply reply; ClientContext context; Status status = stub_->Multiply(&context, request, &reply); if (status.ok()) { return reply.result(); } else { std::cout << status.error_code() << ": " << status.error_message() << std::endl; return -1; } }private: std::unique_ptr<MathTest::Stub> stub_;};int main(int argc, char argv) { std::string target_str = "localhost:50051"; MathTestClient client(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials())); int a = 5; int b = 10; int result = client.Multiply(a, b); std::cout << "Result: " << a << " * " << b << " = " << result << std::endl; return 0;}6. 编译和运行使用CMake或直接使用g++编译上述代码。以下是一个简单的CMakeLists.txt示例:
cmake_minimum_required(VERSION 3.5.1)project(MathTest)find_package(Protobuf REQUIRED)find_package(gRPC REQUIRED)protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS mathtest.proto)grpc_generate_cpp(GRPC_SRCS GRPC_HDRS mathtest.proto)add_executable(server server.cc ${PROTO_SRCS} ${GRPC_SRCS})target_link_libraries(server ${Protobuf_LIBRARIES} ${gRPC_LIBRARIES})add_executable(client client.cc ${PROTO_SRCS} ${GRPC_SRCS})target_link_libraries(client ${Protobuf_LIBRARIES} ${gRPC_LIBRARIES})编译并运行:
mkdir build && cd buildcmake ..make./server &./client总结通过上述步骤,我们实现了一个简单的gRPC服务,客户端可以调用服务端的乘法功能。gRPC的高效性和跨语言特性使其在工业界得到广泛应用。更多示例和详细文档可以参考