← 返回库列表

🔗 gRPC 使用指南

高性能远程过程调用框架

项目地址:https://github.com/grpc/grpc

官方文档:https://grpc.io/docs/

📖 什么是 gRPC?

gRPC 是 Google 开发的高性能开源通用 RPC 框架,基于 HTTP/2 协议和 Protocol Buffers 序列化协议。它支持多种语言,适用于构建分布式系统和微服务架构。

🚀 安装方式

Linux

# 安装依赖
sudo apt-get install build-essential autoconf libtool pkg-config

# 克隆并编译
git clone https://github.com/grpc/grpc.git
cd grpc
git submodule update --init
mkdir build && cd build
cmake .. -DgRPC_INSTALL=ON
make -j4
sudo make install

macOS (Homebrew)

brew install grpc

💡 基础使用

定义 Proto 文件

// hello.proto
syntax = "proto3";

package hello;

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply) {}
  rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

生成 C++ 代码

# 编译 Proto 文件
protoc --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` hello.proto
protoc --cpp_out=. hello.proto

# 或使用 cmake 自动生成

服务端实现

#include <iostream>
#include <grpc++/grpc++.h>
#include "hello.grpc.pb.h"

using grpc::Server;
using grpc::ServerBuilder;
using grpc::ServerContext;
using grpc::Status;
using hello::Greeter;
using hello::HelloRequest;
using hello::HelloReply;

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());
    return Status::OK;
  }
};

int main() {
  GreeterServiceImpl service;

  ServerBuilder builder;
  builder.AddListeningPort("0.0.0.0:50051", grpc::InsecureServerCredentials());
  builder.RegisterService(&service);

  std::unique_ptr<Server> server(builder.BuildAndStart());
  std::cout << "Server listening on 0.0.0.0:50051" << std::endl;

  server->Wait();
  return 0;
}

客户端实现

#include <iostream>
#include <grpc++/grpc++.h>
#include "hello.grpc.pb.h"

using grpc::Channel;
using grpc::ClientContext;
using grpc::Status;
using hello::Greeter;
using hello::HelloRequest;
using hello::HelloReply;

class GreeterClient {
 public:
  GreeterClient(std::shared_ptr<Channel> channel)
      : stub_(Greeter::NewStub(channel)) {}

  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 {
      return "RPC failed";
    }
  }

 private:
  std::unique_ptr<Greeter::Stub> stub_;
};

int main() {
  GreeterClient greeter(grpc::CreateChannel(
      "localhost:50051", grpc::InsecureChannelCredentials()));

  std::string user = "World";
  std::string reply = greeter.SayHello(user);
  std::cout << "Greeter received: " << reply << std::endl;

  return 0;
}

异步服务端

// 使用 CompletionQueue 处理异步调用
class ServerImpl {
 public:
  void Run() {
    std::string server_address("0.0.0.0:50051");

    ServerBuilder builder;
    builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
    builder.RegisterService(&service_);

    cq_ = builder.AddCompletionQueue();
    server_ = builder.BuildAndStart();
    std::cout << "Server listening on " << server_address << std::endl;

    // 启动处理线程
    void* tag;
    bool ok;
    while (cq_->Next(&tag, &ok)) {
      // 处理请求
    }
  }

 private:
  Greeter::AsyncService service_;
  std::unique_ptr<Server> server_;
  std::unique_ptr<ServerCompletionQueue> cq_;
};

🎯 gRPC 特性

📚 更多资源