ZBLOG

grpc的c++语言通信调用流程

以下是 gRPC C++ 的通信调用流程详解,分为服务端客户端两部分:


1. 定义服务(Protocol Buffers)

首先需要编写 .proto 文件定义服务和消息格式:

  1. syntax = "proto3";
  2. service MyService {
  3. rpc MyMethod (MyRequest) returns (MyResponse);
  4. }
  5. message MyRequest {
  6. string request_data = 1;
  7. }
  8. message MyResponse {
  9. string response_data = 1;
  10. }

通过 protoc 工具生成 C++ 代码:

  1. protoc --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` my_service.proto

生成的文件:my_service.pb.h(消息)、my_service.grpc.pb.h(服务)。


2. 服务端实现流程

(1) 实现服务接口

继承生成的 MyService::Service 类并重写方法:

  1. #include "my_service.grpc.pb.h"
  2. class MyServiceImpl final : public MyService::Service {
  3. Status MyMethod(ServerContext* context, const MyRequest* request,
  4. MyResponse* reply) override {
  5. // 处理请求
  6. reply->set_response_data("Processed: " + request->request_data());
  7. return Status::OK; // 返回成功状态
  8. }
  9. };

(2) 启动 gRPC 服务器

  1. #include <grpcpp/grpcpp.h>
  2. void RunServer() {
  3. std::string server_address("0.0.0.0:50051");
  4. MyServiceImpl service;
  5. ServerBuilder builder;
  6. builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
  7. builder.RegisterService(&service); // 注册服务
  8. std::unique_ptr<Server> server(builder.BuildAndStart());
  9. server->Wait(); // 阻塞等待请求
  10. }

3. 客户端调用流程

(1) 创建 Channel & Stub

  1. #include "my_service.grpc.pb.h"
  2. void CallMyMethod() {
  3. auto channel = grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials());
  4. std::unique_ptr<MyService::Stub> stub = MyService::NewStub(channel);

(2) 发起 RPC 调用

  • 同步调用(阻塞):
  1. MyRequest request;
  2. request.set_request_data("Hello, gRPC!");
  3. MyResponse response;
  4. ClientContext context;
  5. Status status = stub->MyMethod(&context, request, &response);
  6. if (status.ok()) {
  7. std::cout << "Response: " << response.response_data() << std::endl;
  8. } else {
  9. std::cerr << "RPC failed: " << status.error_message() << std::endl;
  10. }
  11. }

4.核心组件说明

组件 作用
Channel 客户端与服务器的连接通道(含负载均衡、多路复用等机制)。
Stub 客户端存根,封装远程方法调用。
ServerBuilder 服务端配置工具(端口、线程池、SSL等)。
ServerContext RPC上下文(元数据、超时设置等)。
Status RPC调用的返回状态(成功/错误码)。

5.关键注意事项

  1. 线程模型
    • gRPC C++默认使用多线程,可通过 ServerBuilder.SetSyncOption()调整。
  2. 错误处理
    • Always check Status.ok() for RPC failures.
  3. 性能优化
    • Use async APIs for high-throughput scenarios.
  4. 安全通信
    • Replace InsecureChannelCredentials() with SSL/TLS credentials in production.

如果需要更详细的示例或特定场景的实现,可以参考 gRPC官方文档


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=23361

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?