安装和编写grpc协议文件

1 简介

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

安装步骤

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

  1. 安装基本工具和依赖

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

  • (1)克隆 gRPC 仓库

适合编译安装

bash 复制代码
  git clone --recurse-submodules -b v1.60.0 https://github.com/grpc/grpc
  cd grpc

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

    • 浅克隆

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

bash 复制代码
	git clone --depth=1 --recurse-submodules https://github.com/grpc/grpc -b v1.60.0
    • 分步克隆

      git clone -b v1.60.0 github.com/grpc/grpc

      cd grpc git submodule init git submodule update --progress --recursive

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

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

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

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

你应该已经有了:

bash 复制代码
  which protoc
  # /usr/local/bin/protoc
  protoc --version

2 编译和运行服务

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

libprotoc 3.xx

假设文件结构如下:

objectivec 复制代码
  cpp_echo_server/
  ├── CMakeLists.txt
  ├── echo.proto
  ├── echo_server.cc
  

编译 proto 文件

scss 复制代码
    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
    )
    

构建项目

bash 复制代码
    mkdir build && cd build
    cmake ..
    make
   

运行

bash 复制代码
    ./echo_server

3 高效的协议编写

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

1. 文件组织与结构 组织规范
java 复制代码
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";

解释如下:

文件命名与包声明

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

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

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

go 复制代码
    package company.project.service.v1;

// 使用明确的版本号

ini 复制代码
    option go_package = "github.com/company/project/gen/proto/service/v1;servicev1";

导入组织

markdown 复制代码
    protobuf

// 标准库导入在前

arduino 复制代码
    import "google/protobuf/timestamp.proto";
    

// 然后是第三方导入

arduino 复制代码
    import "google/api/annotations.proto";

// 最后是本地导入

arduino 复制代码
    import "common/v1/common.proto";
2. 消息设计规范 设计最佳实践
ini 复制代码
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防误用
    • 默认值:避免依赖默认值(显式设置关键字段)

命名约定

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

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

字段编号与注释

ini 复制代码
    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高效设计规范

c 复制代码
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文件的编写规范,可能需要验证每个建议是否符合官方指南。

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

参考

相关推荐
用户29869853014几秒前
.NET 文档自动化:Spire.Doc 设置奇偶页页眉/页脚的最佳实践
后端·c#·.net
序安InToo32 分钟前
第6课|注释与代码风格
后端·操作系统·嵌入式
xyy12332 分钟前
C#: Newtonsoft.Json 到 System.Text.Json 迁移避坑指南
后端
洋洋技术笔记35 分钟前
Spring Boot Web MVC配置详解
spring boot·后端
JxWang0535 分钟前
VS Code 配置 Markdown 环境
后端
navms38 分钟前
搞懂线程池,先把 Worker 机制啃明白
后端
JxWang0538 分钟前
离线数仓的优化及重构
后端
Nyarlathotep011339 分钟前
gin01:初探gin的启动
后端·go
JxWang0540 分钟前
安卓手机配置通用多屏协同及自动化脚本
后端
JxWang0541 分钟前
Windows Terminal 配置 oh-my-posh
后端