Linux下protoc与gRPC的集成方式

   2024-09-30 5930
核心提示:在 Linux 系统下,要将 Protocol Buffers(protobuf)和 gRPC 集成在一起,你需要按照以下步骤操作:安装 Protocol Buffers 编译

在 Linux 系统下,要将 Protocol Buffers(protobuf)和 gRPC 集成在一起,你需要按照以下步骤操作:

安装 Protocol Buffers 编译器(protoc):

首先,确保你已经安装了 Protocol Buffers 编译器(protoc)。如果没有,请从官方网站下载并安装:https://developers.google.com/protocol-buffers/docs/downloads

对于 Ubuntu/Debian 系统,可以使用以下命令安装:

sudo apt-get install protobuf-compiler

安装 gRPC:

接下来,安装 gRPC。对于 Ubuntu/Debian 系统,可以使用以下命令安装:

sudo apt-get install libgrpc++-dev

对于其他 Linux 发行版,请参考 gRPC 官方文档中的安装说明:https://github.com/grpc/grpc/blob/master/BUILDING.md

编写 .proto 文件:

创建一个新的 .proto 文件,定义你的服务和消息。例如,创建一个名为 example.proto 的文件,内容如下:

syntax = "proto3";package example;service ExampleService {    rpc SayHello (HelloRequest) returns (HelloResponse);}message HelloRequest {    string name = 1;}message HelloResponse {    string message = 1;}

生成 gRPC 代码:

使用 protoc 编译器和 gRPC 插件生成 C++ 代码。例如,运行以下命令:

protoc -I . --cpp_out=. --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` example.proto

这将生成两个文件:example.pb.hexample.pb.cc(包含 protobuf 消息类)以及 example.grpc.pb.hexample.grpc.pb.cc(包含 gRPC 服务类)。

编写 gRPC 服务器和客户端代码:

根据生成的代码,实现你的服务器和客户端。例如,创建一个名为 server.cpp 的文件,实现服务器端代码:

#include<iostream>#include<memory>#include<string>#include <grpc++/grpc++.h>#include "example.grpc.pb.h"using grpc::Server;using grpc::ServerBuilder;using grpc::ServerContext;using grpc::Status;using example::ExampleService;using example::HelloRequest;using example::HelloResponse;class ExampleServiceImpl final : public ExampleService::Service {    Status SayHello(ServerContext* context, const HelloRequest* request, HelloResponse* response) override {        std::string prefix("Hello ");        response->set_message(prefix + request->name());        return Status::OK;    }};void RunServer() {    std::string server_address("0.0.0.0:50051");    ExampleServiceImpl service;    ServerBuilder builder;    builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());    builder.RegisterService(&service);    std::unique_ptr<Server> server(builder.BuildAndStart());    std::cout << "Server listening on "<< server_address<< std::endl;    server->Wait();}int main(int argc, char** argv) {    RunServer();    return 0;}

创建一个名为 client.cpp 的文件,实现客户端代码:

#include<iostream>#include<memory>#include<string>#include <grpc++/grpc++.h>#include "example.grpc.pb.h"using grpc::Channel;using grpc::ClientContext;using grpc::Status;using example::ExampleService;using example::HelloRequest;using example::HelloResponse;class ExampleClient {public:    ExampleClient(std::shared_ptr<Channel> channel) : stub_(ExampleService::NewStub(channel)) {}    std::string SayHello(const std::string& user) {        HelloRequest request;        request.set_name(user);        HelloResponse response;        ClientContext context;        Status status = stub_->SayHello(&context, request, &response);        if (status.ok()) {            return response.message();        } else {            std::cout<< status.error_code() << ": "<< status.error_message()<< std::endl;            return "RPC failed";        }    }private:    std::unique_ptr<ExampleService::Stub> stub_;};int main(int argc, char** argv) {    ExampleClient client(grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()));    std::string user("world");    std::string reply = client.SayHello(user);    std::cout << "Greeter received: "<< reply<< std::endl;    return 0;}

编译和运行:

使用 CMake 或其他构建工具编译你的项目。确保链接 gRPC 和 Protobuf 库。例如,使用 CMake 的 CMakeLists.txt 文件可能如下所示:

cmake_minimum_required(VERSION 3.10)project(example_grpc)set(CMAKE_CXX_STANDARD 11)find_package(gRPC REQUIRED)find_package(Protobuf REQUIRED)include_directories(${PROTOBUF_INCLUDE_DIRS})include_directories(${gRPC_INCLUDE_DIRS})add_executable(server server.cpp example.pb.cc example.grpc.pb.cc)target_link_libraries(server ${gRPC_LIBRARIES} ${PROTOBUF_LIBRARIES})add_executable(client client.cpp example.pb.cc example.grpc.pb.cc)target_link_libraries(client ${gRPC_LIBRARIES} ${PROTOBUF_LIBRARIES})

然后运行 cmakemake 命令构建项目。最后,分别运行服务器和客户端:

./server./client

你应该会看到服务器和客户端之间的通信成功进行。

 
举报打赏
 
更多>同类物流大全
推荐图文
推荐物流大全
点击排行

网站首页  |  关于我们  |  联系方式网站留言    |  赣ICP备2021007278号