Linux C++ 实战:基于 gRPC 编写同步 Server 与 Client
在分布式系统中,gRPC 是 Google 开源的高性能 RPC 框架。本文聚焦于同步模式(Synchronous),通过完整的 C++ 示例,带你从零搭建支持四种 RPC 模式的同步服务端与客户端。
一、Proto 文件定义
服务接口定义是 gRPC 的基石。我们需要明确四种基本的 RPC 调用模式:一元 RPC、服务端流、客户端流以及双向流。
syntax = "proto3";
package example;
// 定义四种 RPC 模式的服务
service ExampleService {
// 1. 一元 RPC (Unary):客户端发一个请求,服务端回一个响应
rpc UnaryCall(Request) returns(Response);
// 2. 服务端流式 RPC (Server Streaming):客户端发一个请求,服务端回多个响应
rpc ServerStream(Request) returns(stream Response);
// 3. 客户端流式 RPC (Client Streaming):客户端发多个请求,服务端回一个响应
rpc ClientStream(stream Request) returns(Response);
// 4. 双向流式 RPC (Bidirectional Streaming):双方互相发多个消息
rpc BidiStream(stream Request) returns(stream Response);
}
// 请求消息
message Request {
string data = 1;
}
// 响应消息
message Response {
string data = 1;
}
二、同步服务端实现
服务端的核心在于实现 Service 类并注册到 ServerBuilder。在同步模式下,每个 RPC 方法都会阻塞当前线程,直到处理完成。
/*
* 同步服务端
*/
#include <grpcpp/grpcpp.h>
#include "./build/example.grpc.pb.h"
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::ServerReader;
using grpc::ServerWriter;
using grpc::ServerReaderWriter;
using grpc::Status;
using example::ExampleService;
using example::Request;
using example::Response;
// 服务实现类
class ExampleServiceImpl final : public ExampleService::Service {
// 1. 一元 RPC
Status UnaryCall(ServerContext* context, Request* req, Response* res) {
res->( + req->());
Status::OK;
}
{
( i = ; i < ; ++i) {
Response res;
res.( + std::(i) + + req->());
writer->(res);
}
Status::OK;
}
{
std::string combined;
Request req;
(reader->(&req)) {
combined += req.() + ;
}
res->( + combined);
Status::OK;
}
{
Request req;
(stream->(&req)) {
Response res;
res.( + req.());
stream->(res);
}
Status::OK;
}
};
{
;
ExampleServiceImpl service;
ServerBuilder builder;
builder.(addr, grpc::());
builder.(&service);
;
server->();
}
{
();
;
}


