首页主机资讯Linux下protoc与gRPC的集成方式

Linux下protoc与gRPC的集成方式

时间2024-09-05 17:28:03发布访客分类主机资讯浏览673
导读:在 Linux 系统下,要将 Protocol Buffers(protobuf)和 gRPC 集成在一起,你需要按照以下步骤操作: 安装 Protocol Buffers 编译器(protoc): 首先,确保你已经安装了 Protoc...

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

  1. 安装 Protocol Buffers 编译器(protoc):

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

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

    sudo apt-get install protobuf-compiler
    
  2. 安装 gRPC:

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

    sudo apt-get install libgrpc++-dev
    

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

  3. 编写 .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;
    
    }
        
    
  4. 生成 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 服务类)。

  5. 编写 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;
    
    }
    
    
  6. 编译和运行:

    使用 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
    

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

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Linux下protoc与gRPC的集成方式
本文地址: https://pptw.com/jishu/697520.html
如何找虚拟产品项目经理 如何在Linux上使用protoc插件

游客 回复需填写必要信息