Linux下protoc与gRPC的集成方式
在 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.h
和example.pb.cc
(包含 protobuf 消息类)以及example.grpc.pb.h
和example.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} )
然后运行
cmake
和make
命令构建项目。最后,分别运行服务器和客户端:./server ./client
你应该会看到服务器和客户端之间的通信成功进行。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Linux下protoc与gRPC的集成方式
本文地址: https://pptw.com/jishu/697520.html