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

安装步骤
第一部分:Ubuntu 安装 C++ gRPC 所需依赖
-
安装基本工具和依赖
arduinosudo apt update sudo apt install -y build-essential autoconf libtool pkg-config cmake git
-
安装 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)构建并安装
bashmkdir -p cmake/build cd cmake/build cmake ../.. -DCMAKE_BUILD_TYPE=Release make -j$(nproc) sudo make install
-
- 安装 Protobuf 工具(已包含在 gRPC 中)
你应该已经有了:
bash
which protoc
# /usr/local/bin/protoc
protoc --version
2 编译和运行服务
- 编译你的 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]; // 添加验证规则
}
-
兼容性原则:
- 向后兼容 :新字段设为
optional
或repeated
- 向前兼容:客户端忽略未知字段
- 向后兼容 :新字段设为
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文件的编写规范,可能需要验证每个建议是否符合官方指南。
最后,将这些子问题按照顺序排列,并确保最后一个子问题分析来整合所有之前的搜索结果。
参考