1、什么是gRPC?

gRPC(Google Remote Procedure Call)是由 Google 开发的一个开源的高性能远程过程调用(RPC)框架,用于在分布式系统中实现跨语言的服务通信。它基于 HTTP/2 协议,使用 Protocol Buffers(protobuf)作为数据交换格式。gRPC 适合在多语言环境中提供高效的服务间通信,尤其在微服务架构中非常流行。

2、gRPC的工作流程

  1. 服务定义:

    • 使用Protocol Buffers定义服务接口及其方法,包括输入参数和返回值。比如,以下是一个简单的服务定义实例:

      // message.proto
      syntax = "proto3";
      
      // 声明protobuf中的包名
      package message;
      
      service Greeter {
          rpc SayHello(HelloRequest) returns (HelloResponse);
      }
      
      message HelloRequest {
          string name = 1;
      }
      
      message HelloResponse {
          string message = 1;
      }
      
  2. 生成代码:

    • 使用gRPC提供的工具,根据proto文件生成相应代码
      protoc -I="." --grpc_out="." --plugin=protoc-gen-grpc=/usr/bin/grpc_cpp_plugin message.proto
      
      protoc -I="." --cpp_out="." message.proto
      
  3. 实现服务器:

    • 服务端实现定义的服务逻辑,处理客户端请求
  4. 客户端调用:

    • 客户端使用生成的存根(stub)发起远程调用,调用过程与本地方法调用类似
  5. 消息序列化与传输

    • 客户端将消息序列化为二进制格式,通过HTTP/2发送到服务器。服务器接收到请求后反序列化,并执行相应的逻辑,然后将结果返回给客户端。

3、服务端(C++)

实现回射服务器:客户端与服务端之间发送内容一致

using namespace std;
using namespace boost::asio;
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;


using message::HelloResponse;
using message::HelloRequest;
using message::Greeter;

class gRPCServerImpl final : public Greeter::Service
{
public:
    gRPCServerImpl(){};
    Status SayHello(ServerContext* context, const HelloRequest* request, HelloResponse* response){
        cout << "gRPC Server received message: " << request->name() << endl;
        response->set_message(request->name());
        return Status::OK;
    }

}; 

void RunServer(std::string port)
{
    std::string server_address("0.0.0.0:" + port);
    gRPCServerImpl service; 
    // 创建和启动gRPC服务器
    grpc::ServerBuilder builder;
    // 监听端口和添加服务
    builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
    builder.RegisterService(&service);
    
    unique_ptr<grpc::Server> server(builder.BuildAndStart());
    cout << "Server listening on " << server_address << endl;
    
    boost::asio::io_context io_context;
    boost::asio::signal_set signals(io_context, SIGINT, SIGTERM);
    signals.async_wait([&server](const boost::system::error_code& error, int signal_number){
        if(!error){
            server->Shutdown();
            cout << "Server ShutDown!" << endl;
        }
    });
    thread([&io_context](){   io_context.run(); }).detach();
    server->Wait();
    io_context.stop();
}
 int main()
 {
    try{
        std::string port = "10086";
        RunServer(port);
    }catch(exception& e){
        cerr << e.what() << endl;
    }
    return 0;
 }

4、客户端(c++)

using namespace std;
using namespace boost::asio;
using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;

using message::HelloResponse;
using message::HelloRequest;
using message::Greeter;

void gRPCclient()
{
    grpc::ClientContext io_context;
    HelloResponse Rep;
    HelloRequest Req;
    std::string address_server("192.168.49.130:10086");
    auto channle = grpc::CreateChannel(address_server, grpc::InsecureChannelCredentials());

    auto stub = Greeter::NewStub(channle);
    
    std::string message;
    std::cout << "请输入: ";
    cin >> message;
    Req.set_name(message);

    Status status = stub->SayHello(&io_context, Req, &Rep);
    
    if(status.ok()){
        cout << Rep.message() << endl;
    }else{
        cout << "错误" << endl;
    }

}

int main()
{
    gRPCclient();
    return 0;
}
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐