环境搭建与第一个 HelloWorld
这一章我带你搭好本地环境,再跑通一个能用的 gRPC 服务端和客户端。说白了一句话:装好工具,写个 proto,生成代码,启动验证。你在真实项目里也会重复这个流程,只不过业务逻辑越来越复杂罢了。
安装 protoc 编译器
protoc 是把 .proto 文件翻译成各种语言代码的核心工具。少了他,后面什么都干不了。
版本陷阱我踩过
我曾经在项目里用了 protoc 3.20 搭配 grpc-go 1.50,结果生成出来的代码编译不过。后来发现是 protoc 版本太旧,不支持某些新语法。建议直接装最新稳定版(目前是 3.21.x 系列或 4.x 系列,看 grpc 插件是否兼容)。
我曾经在项目里用了 protoc 3.20 搭配 grpc-go 1.50,结果生成出来的代码编译不过。后来发现是 protoc 版本太旧,不支持某些新语法。建议直接装最新稳定版(目前是 3.21.x 系列或 4.x 系列,看 grpc 插件是否兼容)。
安装方式很简单:
- Linux (Ubuntu/Debian):
sudo apt install protobuf-compiler,或者去 GitHub releases 下载二进制。 - macOS:
brew install protobuf。 - Windows:下载 exe 放到 PATH 里,我习惯丢到
C:\tools\protoc\bin。
安装完成后在终端验证:
protoc --version
# 输出类似 libprotoc 3.21.12
安装语言 gRPC 库
protoc 只负责生成消息和服务的骨架代码,真正跑起来还需要各语言的 gRPC 运行时。我按 Go、Python、Java 三派分别列一下,你挑自己用的就行。
| 语言 | 安装命令 | 关键依赖 |
|---|---|---|
| Go | go install google.golang.org/protobuf/cmd/protoc-gen-go@latestgo install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest |
protoc-gen-go + protoc-gen-go-grpc 两个插件 |
| Python | pip install grpcio grpcio-tools |
grpcio 运行时,grpcio-tools 提供 protoc 的 Python 插件 |
| Java | Maven 或 Gradle 引入 io.grpc:grpc-netty-shaded io.grpc:grpc-protobuf io.grpc:grpc-stub,还需要 protoc-gen-grpc-java 插件 |
推荐用 build 工具管理,手动装麻烦 |
我个人习惯
一开始先用 Python 玩,因为
一开始先用 Python 玩,因为
grpcio-tools 直接带了 protoc 和代码生成,省去单独配置插件的麻烦。等熟悉了概念再切其他语言。
编写第一个 HelloWorld
我拿 Python 当例子,其他语言逻辑完全一样。先创建一个 helloworld.proto:
syntax = "proto3";
package helloworld;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
然后生成代码:
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. helloworld.proto
这条命令会生成 helloworld_pb2.py(消息类)和 helloworld_pb2_grpc.py(服务端/客户端桩代码)。
实现服务端(Python)
服务端要做的事:实现 proto 里定义的 SayHello 方法,然后启动 gRPC server 监听一个端口。看代码:
from concurrent import futures
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
class GreeterServicer(helloworld_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return helloworld_pb2.HelloReply(message=f"Hello, {request.name}!")
def serve():
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
helloworld_pb2_grpc.add_GreeterServicer_to_server(GreeterServicer(), server)
server.add_insecure_port("[::]:50051")
server.start()
server.wait_for_termination()
if __name__ == "__main__":
serve()
嗯,注意 max_workers 设成 10 就行,别设太大,不然调度开销反而高。我线上一般用 100,但开发机没必要。
实现客户端(Python)
客户端更简单:连接服务端,构造请求,调用 RPC 拿响应。
import grpc
import helloworld_pb2
import helloworld_pb2_grpc
def run():
with grpc.insecure_channel("localhost:50051") as channel:
stub = helloworld_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(helloworld_pb2.HelloRequest(name="World"))
print(f"收到的响应: {response.message}")
if __name__ == "__main__":
run()
运行测试
先开终端跑服务端,再另开一个终端跑客户端。如果看到 Hello, World!,恭喜你,第一个 gRPC 通信已经通了。
首次运行时你可能遇到
ImportError: cannot import name 'grpc',八成是虚拟环境没激活或者 grpcio 没装。我建议你用 python -m pip list | grep grpc 确认一下。
下面是本章的知识关系图,帮你把整个流程串起来:
你只要按图里的路径走一遍,环境搭建就算合格了。往后学各种拦截器、令牌化改造,都是在这个骨架上加肉。别急,稳扎稳打。