当前位置: 首页 > 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。

相关文章:

  • 青少年ctf练习平台--做题wp(2)
  • 使用python加edge-tts实现文字转语音
  • C++ 简单工厂模式详解
  • 游戏开发的TypeScript(3)匿名函数的常见和不常见用法
  • 基于 vue-flow 实现可视化流程图
  • Java学习手册:关系型数据库基础
  • C++ 中 virtual 的作用
  • 什么是函数重载?
  • 【开源免费】二维码批量识别-未来之窗——C#-仙盟创梦IDE
  • 在 Ubuntu 上安装 cPanel
  • 20:深度学习-多层感知器原理
  • Linxu基本操作
  • 计算机系统结构 第二章 :缓存优化
  • Java中深拷贝与浅拷贝的深入探讨
  • C++抽象基类三重防线:纯虚函数与保护构造的深度实践
  • springAop代理责任链模式源码解析
  • 《解锁GCC版本升级:开启编程新世界大门》
  • Python蓝桥杯真题代码
  • 工作记录 2015-06-01
  • 数据库介绍以及windows下mysql安装
  • 解放军报八一锐评:青春无限好,奋斗正当时
  • 五四青年节|青春韵脚
  • 长三角铁路今日预计发送390万人次,昨日客发量同比增长10.5%
  • 德雷克海峡发生6.4级地震,震源深度10千米
  • 香港发生车祸致22人受伤,4人伤势严重
  • 戴上XR头盔,五一假期在上海也能体验“登陆月球”