c++ grpc 第一个用例
一、linux 包管理工具安装
sudo apt-get update
sudo apt-get install -y build-essential autoconf libtool pkg-config cmake
sudo apt-get install -y libgflags-dev libgtest-dev
sudo apt-get install -y clang libc++-dev# 安装 gRPC C++ 相关依赖
sudo apt-get install -y libgrpc++-dev
# 安装 gRPC 编译工具
sudo apt-get install -y protobuf-compiler-grpc
二、编写proto
syntax = "proto3";service Greeter {rpc SayHello (HelloRequest) returns (HelloReply) {}
}message HelloRequest {string name = 1;
}message HelloReply {string message = 1;
}
三、编译命令,需要编译成protobuf的cpp和grpc的cpp
protoc --proto_path=./ --grpc_out=./ --cpp_out=./ --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` ./h.proto
四、服务端
#include <iostream>
#include <grpcpp/grpcpp.h>
#include "h.pb.h"
#include "h.grpc.pb.h"// 定义一个最终类,继承定义的 Greeter::Service服务端
class GreeterServiceImpl final : public Greeter::Service {// 重写父类的函数,基于 proto 增加了一个参数 ::grpc::ServerContext* context::grpc::Status SayHello(::grpc::ServerContext* context, const HelloRequest* request, HelloReply* reply) override {std::string prefix("Hello ");// 设置返回值reply->set_message(prefix + request->name());return ::grpc::Status::OK;}
};int main(){// 定义一个字符串,地址std::string server_address("0.0.0.0:50051");// 实例化最终类GreeterServiceImpl service;// grpc 的服务端::grpc::ServerBuilder builder;// grpc 服务端设置地址builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());// grpc 注册服务builder.RegisterService(&service);// 开启服务std::unique_ptr<::grpc::Server> server(builder.BuildAndStart());// 服务一直开启server->Wait();return 0;
}
编译:g++ h.grpc.pb.cc server.cpp h.pb.cc -lprotobuf
五、客户端
#include <iostream>
#include <grpcpp/grpcpp.h>
#include "h.pb.h"
#include "h.grpc.pb.h"void run_grpc_client() {// 建立链接,可以设置模式std::shared_ptr<grpc::Channel> channel = grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials());// 建立服务std::unique_ptr<Greeter::Stub> stub = Greeter::NewStub(channel); // Greeter 服务名称// 实例化输入HelloRequest request;request.set_name("Your Name"); // 设置请求参数// 实例化响应服务grpc::ClientContext context;// 实例化 输出HelloReply reply;// 获取服务响应grpc::Status status = stub->SayHello(&context, request, &reply); // SayHello rpc函数名称if (status.ok()) {std::cout << "Server said: " << reply.message() << std::endl;} else {std::cout << "gRPC call failed with error code: " << status.error_code() << " - " << status.error_message() << std::endl;}
}int main() {run_grpc_client();return 0;
}
编译:g++ h.grpc.pb.cc client.cpp h.pb.cc -lprotobuf -lgrpc++