File size: 3,642 Bytes
621645b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# Warp2Api 预编译模式使用指南

## 概述

Warp2Api 现在支持预编译模式,可以避免运行时依赖 grpcio-tools。这种模式通过预先编译 .proto 文件生成描述符集,使服务器在运行时可以直接加载预编译的描述符集,而不需要动态编译 .proto 文件。

## 优势

1. **减少依赖**:不再需要在生产环境中安装 grpcio-tools
2. **加快启动速度**:避免了运行时编译 .proto 文件的时间
3. **更少的内存占用**:不需要加载 grpcio-tools 相关的库
4. **更简单的部署**:减少了依赖项,简化了部署流程

## 使用方法

### 1. 预编译 .proto 文件

首先,需要运行预编译脚本生成描述符集文件:

```bash

# 安装开发依赖(仅在开发环境需要)

pip install -e ".[dev]"



# 运行预编译脚本

python precompile_protos.py

```

这将在 `proto/` 目录下生成 `compiled_descriptors.pb` 文件,这是预编译的描述符集。

### 2. 部署到生产环境

预编译后,您可以将整个项目(包括生成的 `compiled_descriptors.pb` 文件)部署到生产环境。在生产环境中,不需要安装 grpcio-tools,服务器将自动使用预编译的描述符集。

```bash

# 在生产环境中安装(不包含开发依赖)

pip install .



# 启动服务器

python server.py

```

### 3. 更新 .proto 文件

如果您需要更新 .proto 文件,请按照以下步骤操作:

1. 在开发环境中修改 .proto 文件
2. 重新运行预编译脚本生成新的描述符集
3. 将更新后的 .proto 文件和新生成的描述符集一起部署到生产环境

## 故障排除

### 如果预编译的描述符集不可用

如果预编译的描述符集不可用(例如,文件丢失或损坏),服务器将尝试回退到运行时编译模式。如果 grpcio-tools 未安装,将显示以下错误:

```

无法初始化protobuf运行时:grpcio-tools未安装,且预编译的描述符集不可用。

请执行以下操作之一:

1. 安装grpcio-tools: pip install grpcio-tools

2. 运行预编译脚本: python precompile_protos.py

```

### 验证预编译模式是否生效

您可以通过查看服务器启动日志来验证预编译模式是否生效。如果看到以下日志,表示预编译模式已成功启用:

```

尝试加载预编译的描述符集: /path/to/proto/compiled_descriptors.pb

✅ 成功加载预编译的描述符集,包含 XXX 个消息类型

```

## 技术细节

预编译模式的实现主要涉及以下文件:

1. `precompile_protos.py`:预编译脚本,用于生成描述符集
2. `warp2protobuf/core/protobuf.py`:修改后的 protobuf 运行时,优先使用预编译的描述符集
3. `pyproject.toml`:将 grpcio-tools 从必须依赖移到可选依赖

预编译模式的工作流程:

1. 服务器启动时,首先检查是否存在预编译的描述符集
2. 如果存在,直接加载预编译的描述符集
3. 如果不存在或加载失败,尝试运行时编译(需要安装 grpcio-tools)
4. 如果运行时编译也失败,显示错误信息并退出

## 注意事项

- 预编译的描述符集与生成它的 protobuf 版本相关联。如果您更新了 protobuf 库,可能需要重新生成描述符集。
- 确保预编译的描述符集与 .proto 文件保持同步。如果修改了 .proto 文件但没有更新描述符集,可能会导致运行时错误。
- 在开发环境中,建议安装完整的依赖(包括 grpcio-tools),以便在需要时可以动态编译 .proto 文件。