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

搭建一个 gRPC 服务端和客户端

目录

  1. 环境准备
  2. 定义 .proto 文件
  3. 生成 C++ 代码
  4. 编写服务端代码
  5. 编写客户端代码
  6. 编译与运行
  7. 总结

1. 环境准备

  1. 安装 gRPC 和 Protobuf
  • gRPC C++ 依赖 Protobuf 和一些第三方库,安装稍复杂。你可以参考官方gRPC安装文档。
  • 简单来说,你至少需要:
    • 安装 protobuf(协议缓冲库)
    • 安装 gRPC 库和其工具
  1. 安装基本依赖

2. 定义 .proto 文件

创建文件 greeter.proto

syntax = "proto3";package greeter;// 服务定义
service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}
}// 请求消息
message HelloRequest {string name = 1;
}// 响应消息
message HelloReply {string message = 1;
}

3. 生成 C++ 代码

用 protoc 编译 .proto 文件,生成 C++ 需要的 .pb.h.pb.cc 和用于 gRPC 的 .grpc.pb.h.grpc.pb.cc

假设你在 greeter.proto 同目录下,执行命令:

protoc -I=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` greeter.proto
protoc -I=. --cpp_out=. greeter.proto

运行后生成文件有:

  • greeter.pb.h 和 greeter.pb.cc (消息定义和序列化代码)
  • greeter.grpc.pb.h 和 greeter.grpc.pb.cc (服务端和客户端接口代码)

4. 编写服务端代码

文件名:greeter_server.cpp

示例代码:

#include <iostream>
#include <memory>    // 智能指针,用于管理资源
#include <string>#include <grpcpp/grpcpp.h>    // gRPC C++ 的主头文件,包含关键类和函数
#include "greeter.grpc.pb.h"     编译proto生成的代码,包含消息和服务定义// 使用 gRPC 和 proto 定义的命名空间,简化后面代码书写
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using greeter::Greeter;
using greeter::HelloRequest;
using greeter::HelloReply;//这些头文件和命名空间是必备,包含了gRPC核心功能、消息类型和RPC服务定义。
//这里的 greeter.grpc.pb.h 是你用 protoc 从 greeter.proto 文件自动生成的,
//包含了消息类和抽象服务接口。// 实现服务定义的接口,继承 Greeter::Service 并实现 SayHello 方法
//你定义了一个服务类 GreeterServiceImpl,它“实现”了你在 .proto 里定义的服务接口 //Greeter::Service。
//final 表示不能再派生子类,保持简单安全。
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());std::cout << "收到来自客户端的请求,名字:" << request->name() << std::endl;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_address << std::endl;// 阻塞等待服务器关闭server->Wait();
}int main(int argc, char** argv) {RunServer();return 0;
}

5. 编写客户端代码

文件名:greeter_client.cpp

示例代码:

#include <iostream>
#include <memory>
#include <string>#include <grpcpp/grpcpp.h>
#include "greeter.grpc.pb.h"using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using greeter::Greeter;
using greeter::HelloRequest;
using greeter::HelloReply;class GreeterClient {public:// 构造函数,传入服务器地址GreeterClient(std::shared_ptr<Channel> channel): stub_(Greeter::NewStub(channel)) {}// 调用远程 SayHello 方法std::string SayHello(const std::string& user) {HelloRequest request;request.set_name(user);HelloReply reply;ClientContext context;Status status = stub_->SayHello(&context, request, &reply);if (status.ok()) {return reply.message();} else {std::cout << "RPC调用失败:" << status.error_code() << ": " << status.error_message() << std::endl;return "RPC失败";}}private:std::unique_ptr<Greeter::Stub> stub_;
};int main(int argc, char** argv) {GreeterClient greeter(grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()));std::string user("world");if (argc > 1) {user = argv[1];}std::string reply = greeter.SayHello(user);std::cout << "从服务器收到的响应: " << reply << std::endl;return 0;
}

6. 编译与运行

这里给出一个简单的 CMakeLists.txt,方便你用 CMake 编译:

cmake_minimum_required(VERSION 3.5)project(greeter_cpp)# find grpc and protobuf packages
find_package(Protobuf CONFIG REQUIRED)
find_package(gRPC CONFIG REQUIRED)set(CMAKE_CXX_STANDARD 14)# proto 文件路径
set(PROTO_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})# 生成的文件
set(PROTO_FILE greeter.proto)# protoc 指令自动生成的源文件
protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_FILE})
grpc_generate_cpp(GRPC_SRCS GRPC_HDRS ${PROTO_FILE})add_executable(greeter_server greeter_server.cpp ${PROTO_SRCS} ${PROTO_HDRS} ${GRPC_SRCS} ${GRPC_HDRS})
target_link_libraries(greeter_server grpc++ protobuf)add_executable(greeter_client greeter_client.cpp ${PROTO_SRCS} ${PROTO_HDRS} ${GRPC_SRCS} ${GRPC_HDRS})
target_link_libraries(greeter_client grpc++ protobuf)

具体步骤:

  1. 在包含 CMakeLists.txt 的目录下创建 build 子目录:
    mkdir build
    cd build
    cmake ..
    make

  2. 先启动服务端:
    ./greeter_server
    

    你会看到:

    服务器启动,监听端口: 0.0.0.0:50051
     
  3. 打开另一个终端,启动客户端:
    ./greeter_client

    输出如下:

    从服务器收到的响应: Hello, world

    你也可以传参:

    ./greeter_client Alice

    输出:

    从服务器收到的响应: Hello, Alice

    7. 总结

  4. 定义接口和消息 放在 .proto文件里。
  5. 用 protoc 生成对应的 C++ 代码。
  6. 服务端实现接口并启动服务器监听。
  7. 客户端创建存根调用远程接口
  8. 你可以用 CMake 或其他构建工具编译。
  9. 这里用的是不安全(无加密)连接,真实项目推荐用 TLS。
http://www.xdnf.cn/news/261199.html

相关文章:

  • 【Java学习】关于springBoot的自动配置和起步依赖
  • CSS 预处理器 Sass
  • 【2025软考高级架构师】——案例分析总结(13)
  • 如何写好大模型提问提示词:从入门到精通的实战指南
  • 华为云Flexus+DeepSeek征文|快速搭建Dify LLM应用开发平台教程
  • 启发式算法-蚁群算法
  • 2.2 矩阵
  • 前端跨域问题怎么在后端解决
  • flutter3.29 build.gradle.kts设置安卓签名
  • 吾爱出品 [Windows] EndNote 21.5.18513 汉化补丁
  • Linux中安装mysql8,转载及注意事项
  • 机器学习_线性回归
  • QT中的JSON
  • Python 装饰器优化策略模式:电商促销折扣的优雅解法
  • 【网络原理】深入理解HTTPS协议
  • 多多铃声 7.4| 拥有丰富的铃声曲库,满足不同用户的个性化需求,支持一键设置手机铃声
  • 接口隔离原则(ISP)
  • 「Mac畅玩AIGC与多模态15」开发篇11 - 增加输入变量的工作流示例
  • 用定时器做微妙延时注意事项
  • LOJ #193 线段树历史和 Solution
  • day13 python不平衡数据集的处理(补)
  • 数字智慧方案5857丨智慧机场解决方案与应用(53页PPT)(文末有下载方式)
  • 分享国产AI工作流集成数据库完成业务处理
  • apt-mirror搭建ubuntu本地离线源
  • 文件操作--文件下载读取漏洞
  • JavaScript基础-赋值运算符
  • python数据分析(七):Pandas 数据变形与重塑
  • DeepSeek实战--AI技术架构(持续更新)
  • Performance API 性能上报
  • 2025年- H21-Lc129-160. 相交链表(链表)---java版