当前位置: 首页 > news >正文

gRPC for C++ 实战全流程 —— 从零搭建到同步/异步服务

目录

    • 1. gRPC 项目流程概览
    • 2. 编写 proto 文件
    • 3. 生成 C++ 代码
    • 4. 同步 gRPC Server 端
      • 4.1 实现服务类
      • 4.2 启动服务
    • 5. 同步 gRPC Client 端
    • 6. 异步 gRPC Server 端
      • 6.1 每个接口封装一个子类
      • 6.2 一个类封装多个接口


1. gRPC 项目流程概览

gRPC 在 C++ 中的开发流程可以用以下步骤概括:

  1. 编写 proto 文件
  2. 生成 C++ 源码(包含 Protobuf 序列化代码和 gRPC 服务框架代码)
  3. 实现 gRPC Server 端(继承并重写 Service 接口)
  4. 实现 gRPC Client 端(通过 Stub 调用服务)
  5. 编译运行
  6. (可选)实现异步 Server 端

2. 编写 proto 文件

示例 IM.Login.proto 定义了两个 RPC 接口:注册和登录。

syntax = "proto3";
package IM.Login;service ImLogin {rpc Regist (IMRegistReq) returns (IMRegistRes) {}rpc Login (IMLoginReq) returns (IMLoginRes) {}
}message IMRegistReq {string user_name = 1;string password = 2;
}message IMRegistRes {string user_name = 1;uint32 user_id = 2;uint32 result_code = 3; // 0 表示成功
}message IMLoginReq {string user_name = 1;string password = 2;
}message IMLoginRes {uint32 user_id = 1;uint32 result_code = 2; // 0 表示成功
}

3. 生成 C++ 代码

需要生成两类文件:

  • Protobuf 序列化代码*.pb.h / *.pb.cc
  • gRPC 服务框架代码*.grpc.pb.h / *.grpc.pb.cc

命令示例:

protoc -I . --cpp_out=. IM.Login.proto
protoc -I . --grpc_out=. \--plugin=protoc-gen-grpc=`which grpc_cpp_plugin` \IM.Login.proto

执行后会生成:

IM.Login.pb.h / IM.Login.pb.cc
IM.Login.grpc.pb.h / IM.Login.grpc.pb.cc

4. 同步 gRPC Server 端

4.1 实现服务类

继承 ImLogin::Service,重写 RegistLogin 方法。

class IMLoginServiceImpl : public ImLogin::Service {Status Regist(ServerContext* context, const IMRegistReq* request,IMRegistRes* response) override {response->set_user_name(request->user_name());response->set_user_id(10);response->set_result_code(0);return Status::OK;}Status Login(ServerContext* context, const IMLoginReq* request,IMLoginRes* response) override {response->set_user_id(10);response->set_result_code(0);return Status::OK;}
};

4.2 启动服务

void RunServer() {std::string addr("0.0.0.0:50051");IMLoginServiceImpl service;ServerBuilder builder;builder.AddListeningPort(addr, grpc::InsecureServerCredentials());builder.RegisterService(&service);auto server = builder.BuildAndStart();std::cout << "Server listening on " << addr << std::endl;server->Wait();
}

5. 同步 gRPC Client 端

class ImLoginClient {
public:ImLoginClient(std::shared_ptr<Channel> channel): stub_(ImLogin::NewStub(channel)) {}void Regist(const std::string& user, const std::string& pwd) {IMRegistReq req;req.set_user_name(user);req.set_password(pwd);IMRegistRes res;ClientContext ctx;Status status = stub_->Regist(&ctx, req, &res);if (status.ok())std::cout << "注册成功: user_id=" << res.user_id() << std::endl;}void Login(const std::string& user, const std::string& pwd) {IMLoginReq req;req.set_user_name(user);req.set_password(pwd);IMLoginRes res;ClientContext ctx;Status status = stub_->Login(&ctx, req, &res);if (status.ok())std::cout << "登录成功: user_id=" << res.user_id() << std::endl;}private:std::unique_ptr<ImLogin::Stub> stub_;
};

6. 异步 gRPC Server 端

异步服务基于 CompletionQueue状态机 实现,有两种封装方式。

6.1 每个接口封装一个子类

  • 优点:逻辑分离清晰
  • 缺点:接口多时类文件多

每个接口一个 CallData 类,内部维护状态:

CREATE -> PROCESS -> FINISH

PROCESS 状态中创建新对象以处理后续请求。

6.2 一个类封装多个接口

  • 优点:代码集中
  • 缺点:所有接口的成员变量都会被初始化,占用内存

参考:

  • 0voice · GitHub
http://www.dtcms.com/a/322901.html

相关文章:

  • vw和vh:CSS中的视口相对单位
  • Linux下管道的实现
  • 第十四节 代理模式
  • Android 设置/修改系统NTP服务地址
  • 2010-2024 地级市、上市公司“信息惠民国家试点城市”DID
  • Jenkins全链路教程——条件判断与流程控制
  • 从夯到拉,锐评MC所有武器
  • RK3568笔记九十九:基于FFMPEG拉取RTSP流MPP硬解码视频显示
  • 第5章 Excel公式与函数应用指南(2):数学函数
  • 【C语言】深入探索预处理
  • 系统蓝屏,黑屏,花屏,绿屏,白屏等问题统一解决软件,驱动人生下载
  • SOLi-LABS Page-3 (Stacked injections) --39-53关
  • 在 Vue 中动态引入SVG图标的实现方案
  • spring声明式事务未提交引发的线上问题
  • Vue 3 + TypeScript:深入理解组件引用类型
  • 2025年渗透测试面试题总结-09(题目+回答)
  • 【自动化运维神器Ansible】playbook实践示例:HTTPD安装与卸载全流程解析
  • Blender 快捷键速查表 (Cheat Sheet)
  • 推荐系统学习笔记(十)多目标排序模型
  • “戴着镣铐”的AI推理:中国如何打破算力枷锁,赢得“最后一公里”?
  • Nvidia 开源 KO 驱动学习配置入门
  • 基于51单片机温湿度检测系统无线蓝牙APP上传设计
  • 化工安防误报率↓82%!陌讯多模态融合算法实战解析
  • 【前端八股文面试题】DOM常⻅的操作有哪些?
  • 深入理解对话状态管理:多轮交互中的上下文保持与API最佳实践
  • Linux 中CentOS Stream 8 - yum -y update 异常报错问题
  • 【LLM】Openai之gpt-oss模型和GPT5模型
  • PNPM总结
  • 【SQL进阶】用EXPLAIN看透SQL执行计划:从“盲写“到“精准优化“
  • 如何解决 Vue 项目启动时出现的 “No such module: http_parser” 错误问题