legongju.com
我们一直在努力
2025-01-10 23:33 | 星期五

Linux下protoc与gRPC的集成方式

在 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
    #include
    #include
    #include 
    #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(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
    #include
    #include
    #include 
    #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) : 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 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
    

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

未经允许不得转载 » 本文链接:https://www.legongju.com/article/100359.html

相关推荐

  • linux用gcc编译完怎么运行

    linux用gcc编译完怎么运行

    在Linux系统中,使用GCC编译器编译C或C++代码后,你可以按照以下步骤运行生成的可执行文件: 打开终端(Terminal)。 使用cd命令导航到包含可执行文件的目录。例...

  • linux怎么连接redis集群

    linux怎么连接redis集群

    在Linux上连接Redis集群,你需要遵循以下步骤: 安装Redis客户端库:首先,你需要为你的编程语言安装一个Redis客户端库。这里以Python为例,你需要安装redis-py-...

  • 如何优化Linux中Logstash的性能

    如何优化Linux中Logstash的性能

    为了优化Linux中Logstash的性能,可以从多个方面进行调整。以下是一些关键步骤和配置建议:
    优化Logstash性能的方法 调整工作线程数和批量处理大小:根据服...

  • Linux下Logstash日志处理技巧

    Linux下Logstash日志处理技巧

    Logstash 是一个开源的日志管理工具,它可以帮助你收集、分析和存储来自各种来源的日志数据 使用 Grok 过滤器解析日志:Grok 是 Logstash 中的一个过滤器,可以帮...

  • Linux中如何批量修改文件属性

    Linux中如何批量修改文件属性

    在 Linux 中,可以使用 chmod 命令来修改文件属性 修改当前目录下所有文件的属性: chmod 644 * 这将会把当前目录下所有文件的属性设置为:所有者可读写,组成员...

  • Linux系统文件属性有哪些分类

    Linux系统文件属性有哪些分类

    Linux系统中的文件属性主要可以分为以下几类: 普通文件:包括文本文件、二进制文件、数据格式文件等。
    目录文件:用于组织和管理文件。
    符号链接(软...

  • 如何在Linux中更改目录的所有者和属性

    如何在Linux中更改目录的所有者和属性

    在 Linux 中,可以使用 chown 和 chmod 命令来更改目录的所有者和属性 更改目录所有者: 要更改目录的所有者,您需要使用 chown 命令。语法如下:
    sudo cho...

  • Linux属性中的读写执行权限是什么意思

    Linux属性中的读写执行权限是什么意思

    在Linux操作系统中,文件的读写执行权限是用于控制用户和用户组对文件或目录访问行为的重要机制。这些权限确保了文件系统的安全性,防止未经授权的访问、修改或执...