ZBLOG

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

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


1. 定义服务(Protocol Buffers)

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

syntax = "proto3";

service MyService {
  rpc MyMethod (MyRequest) returns (MyResponse);
}

message MyRequest {
  string request_data = 1;
}

message MyResponse {
  string response_data = 1;
}

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

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 类并重写方法:

#include "my_service.grpc.pb.h"

class MyServiceImpl final : public MyService::Service {
    Status MyMethod(ServerContext* context, const MyRequest* request, 
                    MyResponse* reply) override {
        // 处理请求
        reply->set_response_data("Processed: " + request->request_data());
        return Status::OK; // 返回成功状态
    }
};

(2) 启动 gRPC 服务器

#include <grpcpp/grpcpp.h>

void RunServer() {
    std::string server_address("0.0.0.0:50051");
    MyServiceImpl service;

    ServerBuilder builder;
    builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
    builder.RegisterService(&service); // 注册服务

    std::unique_ptr<Server> server(builder.BuildAndStart());
    server->Wait(); // 阻塞等待请求
}

3. 客户端调用流程

(1) 创建 Channel & Stub

#include "my_service.grpc.pb.h"

void CallMyMethod() {
    auto channel = grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials());
    std::unique_ptr<MyService::Stub> stub = MyService::NewStub(channel);

(2) 发起 RPC 调用

  • 同步调用(阻塞):
    MyRequest request;
    request.set_request_data("Hello, gRPC!");

    MyResponse response;
    ClientContext context;

    Status status = stub->MyMethod(&context, request, &response);
    
    if (status.ok()) {
        std::cout << "Response: " << response.response_data() << std::endl;
    } else {
        std::cerr << "RPC failed: " << status.error_message() << std::endl;
    }
}

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

注册

已经有帐号?