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

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

参考

相关推荐
weixin_985432112 小时前
Spring Boot 中的 @ConditionalOnBean 注解详解
java·spring boot·后端
成工小白2 小时前
【Linux】C语言模拟实现shell命令行(程序替换原理)
linux·运维·服务器
猎人everest2 小时前
快速搭建运行Django第一个应用—投票
后端·python·django
西装没钱买3 小时前
C语言多进程TCP服务器与客户端
服务器·c语言·tcp/ip·进程
福理原乡大王4 小时前
Linux信号详解
linux·运维·服务器·c++·ubuntu·信号处理
ldq_sd4 小时前
centos 8.3(阿里云服务器)mariadb由系统自带版本(10.3)升级到10.6
服务器·阿里云·centos
啾啾Fun5 小时前
精粹汇总:大厂编程规范(持续更新)
后端·规范
yt948325 小时前
lua读取请求体
后端·python·flask
IT_10245 小时前
springboot从零入门之接口测试!
java·开发语言·spring boot·后端·spring·lua
자신을 변화시키다5 小时前
磁盘配额管理
linux·运维·服务器·ubuntu·磁盘管理