安装和编写grpc协议文件

举报
码乐 发表于 2025/06/14 07:03:07 2025/06/14
【摘要】 1 简介本文分为三个主要部分:安装步骤、编译和运行服务、高效的协议编写。每个部分都有详细的步骤和说明。安装步骤第一部分:Ubuntu 安装 C++ gRPC 所需依赖安装基本工具和依赖 sudo apt update sudo apt install -y build-essential autoconf libtool pkg-config cmake git安装 gRPC 和 Prot...

1 简介

本文分为三个主要部分:安装步骤、编译和运行服务、高效的协议编写。每个部分都有详细的步骤和说明。

image.png

安装步骤

第一部分:Ubuntu 安装 C++ gRPC 所需依赖

  1. 安装基本工具和依赖

     sudo apt update
     sudo apt install -y build-essential autoconf libtool pkg-config cmake git
    
  2. 安装 gRPC 和 Protocol Buffers(推荐源码编译)

  • (1)克隆 gRPC 仓库

适合编译安装

  git clone --recurse-submodules -b v1.60.0 https://github.com/grpc/grpc
  cd grpc

注意:–recurse-submodules 很重要,会下载 third_party/protobuf。

    • 浅克隆

grpc 仓库依赖可能会很大,如果不是必须,适合浅克隆以加快部署过程。

	git clone --depth=1 --recurse-submodules https://github.com/grpc/grpc -b v1.60.0

这样你可以逐步定位问题的子模块,并可对单个子模块重复拉取。

适合不需要最新版本的安装

  sudo apt update
  sudo apt install -y libgrpc++-dev protobuf-compiler-grpc
  • (2)构建并安装

    mkdir -p cmake/build
    cd cmake/build
    cmake ../.. -DCMAKE_BUILD_TYPE=Release
    make -j$(nproc)
    sudo make install
    
    1. 安装 Protobuf 工具(已包含在 gRPC 中)

你应该已经有了:

  which protoc
  # /usr/local/bin/protoc
  protoc --version

2 编译和运行服务

  1. 编译你的 C++ gRPC 项目

libprotoc 3.xx

假设文件结构如下:

  cpp_echo_server/
  ├── CMakeLists.txt
  ├── echo.proto
  ├── echo_server.cc
  

编译 proto 文件

    protoc --grpc_out=. --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` echo.proto
    protoc --cpp_out=. echo.proto
    CMakeLists.txt
    cmake

    cmake_minimum_required(VERSION 3.14)
    project(echo_server)

    find_package(Protobuf REQUIRED)
    find_package(gRPC REQUIRED)

    include_directories(${Protobuf_INCLUDE_DIRS})

    add_executable(echo_server echo_server.cc echo.pb.cc echo.grpc.pb.cc)

    target_link_libraries(echo_server
      gRPC::grpc++
      protobuf::libprotobuf
    )
    

构建项目

    mkdir build && cd build
    cmake ..
    make
   

运行

    ./echo_server

3 高效的协议编写

高效编写可读性强的 gRPC .proto 文件指南
编写清晰、易维护的 .proto 文件对于 gRPC 服务的长期可维护性至关重要。以下是一些最佳实践和技巧:

1. 文件组织与结构 组织规范

syntax = "proto3";
// 包名:反向域名.项目名.服务名.版本
package company.project.service.v1;
// 明确版本号(Go语言需指定路径)
option go_package = "github.com/company/project/gen/proto/service/v1;servicev1";

// 导入顺序:标准库 → 第三方 → 本地

import "google/protobuf/timestamp.proto";
import "google/api/annotations.proto";
import "common/v1/common.proto";

解释如下:

文件命名与包声明

-   文件名:小写蛇形命名(`user_service.proto`)
-   包名:避免冲突并体现版本
  • 命名约定

    protobuf
    // 使用小写蛇形命名,与目录结构对应
    syntax = “proto3”;

// 包名使用反向域名+项目名+服务名

    package company.project.service.v1;

// 使用明确的版本号

    option go_package = "github.com/company/project/gen/proto/service/v1;servicev1";

导入组织

    protobuf

// 标准库导入在前

    import "google/protobuf/timestamp.proto";
    

// 然后是第三方导入

    import "google/api/annotations.proto";

// 最后是本地导入

    import "common/v1/common.proto";

2. 消息设计规范 设计最佳实践

message UserProfile {
  // 字段名:snake_case,注释说明用途
  string user_name = 1;  // 用户登录名(唯一标识)
  int32 age = 2;         // 用户年龄(周岁)

  // 集合字段使用复数
  repeated string phone_numbers = 3; 

  // 枚举类型命名使用PascalCase
  enum AccountStatus {
    UNVERIFIED = 0;
    ACTIVE = 1;
    BANNED = 2;
  }
  AccountStatus status = 4;

  // 使用标准时间戳类型
  google.protobuf.Timestamp created_at = 5;
}
  • 字段规则

    • 字段编号:永不重用
    • 保留字段:删除字段时标记reserved防误用
    • 默认值:避免依赖默认值(显式设置关键字段)

命名约定

  protobuf
  // 消息名使用 PascalCase
  message UserProfile {
    // 字段名使用 snake_case
    string user_name = 1;
    int32 age = 2;

    // 使用复数表示集合
    repeated string phone_numbers = 3;
  }

字段编号与注释

    protobuf
    message Order {
      // 订单唯一ID (自动生成)
      string order_id = 1;

      // 用户ID,关联到UserProfile.user_id
      string user_id = 2 [(validate.rules).string.min_len = 10];

      // 订单状态枚举
      OrderStatus status = 3;

      // 创建时间 (UTC时间戳)
      google.protobuf.Timestamp created_at = 4;
    }

3. 服务接口设计

Protocol Buffers高效设计规范

service UserService {
  // RPC方法名使用PascalCase
  rpc GetUserProfile (GetUserRequest) returns (UserProfile) {}
}

message GetUserRequest {
  string user_id = 1 [(validate.rules).string.min_len = 10];  // 添加验证规则
}
  • 兼容性原则

    • 向后兼容:新字段设为optionalrepeated
    • 向前兼容:客户端忽略未知字段

4 小结

本文以上步骤涵盖了从安装依赖到编译和运行一个简单的 gRPC C++ 项目的全过程,并提供了一些编写高效 .proto 文件的最佳实践

对于第一部分安装步骤, 提到了安装基本工具、gRPC和Protocol Buffers的源码编译方法,以及Protobuf工具的安装。这里可能需要确认各个命令的正确性,比如apt安装的包是否正确,或者源码编译的具体步骤是否有遗漏。例如,用户提到使用git clone时的不同选项,可能需要搜索这些选项的作用,确保步骤正确。

第二部分关于编译和运行服务, 提供了具体的CMakeLists.txt内容和构建命令。这里可能需要验证CMake配置是否正确,特别是find_package和target_link_libraries的部分是否符合当前gRPC版本的要求。此外,运行服务器的步骤是否完整,是否有其他依赖需要安装。

第三部分关于高效的.proto文件编写指南, 列出了文件组织、消息设计等最佳实践。这部分可能需要搜索相关的gRPC和Protocol Buffers的最佳实践文档,确认用户提到的命名约定、字段编号规则等是否符合官方推荐。

接下来 对于安装步骤中的不同git克隆方法,可能需要搜索每种方法的优缺点;对于CMake配置,可能需要分析是否需要额外的依赖或配置选项;对于.proto文件的编写规范,可能需要验证每个建议是否符合官方指南。

最后,将这些子问题按照顺序排列,并确保最后一个子问题分析来整合所有之前的搜索结果。

参考

  • [gRPC C++源码构建]
  • [Protocol Buffers语言指南]
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。