gRPC接口集成国密实践 - 第3节
第3章:gRPC环境搭建——装好工具,才能开干
说实话,这一章可能是整个课程里最“机械”的。
但磨刀不误砍柴工,工具链没配好,后面写代码就是给自己挖坑。
我见过不少新手,卡在最开始的环境搭建上,折腾半天还没生成出第一个代码文件。
今天咱们就把 protoc、各语言gRPC库、以及代码生成这三件事一次讲透。
你跟着我这套流程走,十五分钟就能跑通。
3.1 安装protoc——核心编译器
protoc是Protocol Buffers的编译器,说白了就是把你的.proto文件翻译成各语言的代码。
gRPC在protobuf基础上增加了service定义,所以protoc也得有相应的插件才能生成gRPC代码。
3.1.1 下载与安装
我个人习惯用预编译二进制,不折腾。
打开 protobuf releases页面,找到你系统对应的包。
| 系统 | 推荐包 | 说明 |
|---|---|---|
| Linux x86_64 | protoc-xx.x-linux-x86_64.zip | 解压后放到/usr/local |
| macOS (Intel) | protoc-xx.x-osx-x86_64.zip | 同样解压到/usr/local |
| macOS (Apple Silicon) | protoc-xx.x-osx-aarch_64.zip | M1/M2用户注意选这个 |
| Windows | protoc-xx.x-win64.zip | 解压后把bin目录加到PATH |
# Linux / macOS 安装流程(以3.21.12为例)
curl -OL https://github.com/protocolbuffers/protobuf/releases/download/v21.12/protoc-21.12-linux-x86_64.zip
unzip protoc-21.12-linux-x86_64.zip -d protoc
sudo mv protoc/bin/protoc /usr/local/bin/
sudo mv protoc/include/* /usr/local/include/
rm -rf protoc protoc-21.12-linux-x86_64.zip
# 验证安装
protoc --version
# 输出:libprotoc 3.21.12
.protoc-version文件里写死版本号,大家用同一个。
3.1.2 安装protoc-gen-grpc插件
protoc本身只处理protobuf的消息和枚举。
要想生成gRPC的service代码,得装一个插件:protoc-gen-grpc(不同语言对应不同插件)。
以C++为例:
# 下载grpc源码中的插件
git clone --depth 1 --branch v1.54.0 https://github.com/grpc/grpc
cd grpc
mkdir build && cd build
cmake ..
make protoc-gen-grpc -j4
sudo cp protoc-gen-grpc /usr/local/bin/
# 验证
protoc-gen-grpc --version # 如果打印版本信息就对了
其他语言的插件我会在后面各语言章节里详细说。
3.2 各语言gRPC库安装
protoc只负责生成代码骨架。实际运行时,每个语言都需要引入gRPC的运行时库。
这里我挑最常用的Python和Go两个语言来讲,你看完就能举一反三。
3.2.1 Python环境
# 创建虚拟环境(强烈建议)
python3 -m venv grpc_env
source grpc_env/bin/activate
# 安装gRPC和protobuf库
pip install grpcio grpcio-tools protobuf
grpcio-tools里自带了一个protoc的Python封装,你甚至可以不装系统级protoc——但我不推荐这样干。
系统级protoc + 语言级grpcio-tools,两边互补,才是正经用法。
为什么?
我在项目中遇到过:grpcio-tools内的protoc版本落后官方两年,有些新语法解析不了。还是用独立的protoc更稳。
3.2.2 Go环境
# 安装Go(如果还没装)
go version # 确认版本 ≥ 1.18
# 安装protoc的Go插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
# 安装gRPC库
go get google.golang.org/grpc
你注意观察:Go的插件是两个,一个处理protobuf消息(protoc-gen-go),一个处理gRPC service(protoc-gen-go-grpc)。
很多新手只装了第一个,结果service死活生成不出来——嗯,坑就在这里。
| 语言 | 运行时库 | protoc插件 |
|---|---|---|
| Python | grpcio | grpcio-tools(自带protoc) |
| Go | google.golang.org/grpc | protoc-gen-go + protoc-gen-go-grpc |
| C++ | libgrpc++ | protoc-gen-grpc(C++插件) |
| Java | io.grpc:grpc-netty | protoc-gen-grpc-java |
3.3 生成代码示例
工具都装好了,咱们直接上手试一下。
我用一个简单的hello.proto来演示。
3.3.1 编写proto文件
// hello.proto
syntax = "proto3";
package hello;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
3.3.2 生成Python代码
python -m grpc_tools.protoc \
--proto_path=. \
--python_out=. \
--grpc_python_out=. \
hello.proto
# 生成的文件:
# hello_pb2.py → 消息类
# hello_pb2_grpc.py → gRPC客户端/服务端骨架
3.3.3 生成Go代码
protoc \
--proto_path=. \
--go_out=. \
--go-grpc_out=. \
hello.proto
# 生成的文件:
# hello.pb.go → 消息类
# hello_grpc.pb.go → gRPC接口与stub
关键参数解释:
--proto_path:指定搜索.proto文件的根目录(类似C++的-I)--xxx_out:指定生成代码的输出目录--grpc_python_out/--go-grpc_out:专门输出gRPC service代码
我刚开始用的时候,总把output目录写错,导致生成的文件散落一地。
后来养成了习惯:先mkdir gen,然后统一输出到gen/里。
3.4 验证环境是否齐全
生成代码后,别急着写业务逻辑。先做一个小验证——编译一下看看能不能跑通。
Python验证:
from hello_pb2 import HelloRequest, HelloReply
from hello_pb2_grpc import GreeterStub, GreeterServicer
print("gRPC Python environment OK")
Go验证:
package main
import (
"fmt"
pb "yourmodule/hello"
)
func main() {
req := &pb.HelloRequest{Name: "test"}
fmt.Println(req.GetName())
}
--go_out里的module路径对应。我曾经见过一个团队,proto文件在
proto/目录下,却用--go_out=.,结果import路径成了proto/hello,VS Code死活找不到包。解决方案:统一用
--go_out=paths=source_relative:.,这样输出路径直接对应到源代码目录。
3.5 一张图看懂整个环境搭建流程
下面我把protoc、grpc库、代码生成这三者的关系画成一张流程图。
你看完后,整个搭建逻辑会非常清晰。
从图上你能清楚看到:
protoc是核心,它读取.proto文件后,通过不同的语言插件生成对应代码。
生成的代码再依赖各语言的gRPC运行时库做实际的网络通信。
所以,整个环境搭建就三件事:
- 装protoc和对应语言的插件
- 装该语言的gRPC运行时库
- 用protoc生成代码
最后别忘了验证——生成代码能正常import,就说明环境跑通了。
好,环境这块就这些。动手装一遍,后面写代码就能心不慌。