高性能远程过程调用框架
gRPC 是 Google 开发的高性能开源通用 RPC 框架,基于 HTTP/2 协议和 Protocol Buffers 序列化协议。它支持多种语言,适用于构建分布式系统和微服务架构。
# 安装依赖
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
brew install grpc
// 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;
}
# 编译 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_;
};