快速入门
本指南通过一个简单的示例,帮助您开始使用 Python 中的 gRPC。
快速入门
前提条件
- Python 3.7 或更高版本
- `pip` 版本 9.0.1 或更高
如有必要,请升级您的 `pip` 版本
python -m pip install --upgrade pip
如果由于系统自带的安装而无法升级 `pip`,您可以在 virtualenv 中运行示例
python -m pip install virtualenv
virtualenv venv
source venv/bin/activate
python -m pip install --upgrade pip
gRPC
安装 gRPC
python -m pip install grpcio
或者,全局安装
sudo python -m pip install grpcio
gRPC 工具
Python 的 gRPC 工具包括协议缓冲区编译器 `protoc` 和用于从 `.proto` 服务定义生成服务器和客户端代码的特殊插件。对于我们快速入门示例的第一部分,我们已经从 helloworld.proto 生成了服务器和客户端存根,但您在快速入门的其余部分、后续教程以及您自己的项目中仍需要这些工具。
要安装 gRPC 工具,请运行
python -m pip install grpcio-tools
下载示例
您需要示例代码的本地副本才能完成本快速入门。从我们的 GitHub 仓库下载示例代码(以下命令会克隆整个仓库,但您只需要其中的示例用于本快速入门和其他教程)
# Clone the repository to get the example code:
git clone -b v1.71.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc
# Navigate to the "hello, world" Python example:
cd grpc/examples/python/helloworld
运行 gRPC 应用
在 `examples/python/helloworld` 目录下
运行服务器
python greeter_server.py
在另一个终端中,运行客户端
python greeter_client.py
恭喜!您刚刚运行了一个使用 gRPC 的客户端-服务器应用。
更新 gRPC 服务
现在让我们看看如何更新应用,为客户端添加一个可调用的服务器端额外方法。我们的 gRPC 服务是使用 protocol buffers 定义的;您可以在 gRPC 简介和 基础教程中了解更多关于如何在 `.proto` 文件中定义服务的信息。现在您只需要知道,服务器和客户端“存根”都拥有一个 `SayHello` RPC 方法,该方法接受来自客户端的 `HelloRequest` 参数并从服务器返回 `HelloReply`,该方法定义如下:
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
让我们更新服务,使 `Greeter` 服务有两个方法。编辑 `examples/protos/helloworld.proto`,添加一个新的 `SayHelloAgain` 方法,使用相同的请求和响应类型:
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
// Sends another greeting
rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
记得保存文件!
生成 gRPC 代码
接下来,我们需要更新应用使用的 gRPC 代码,以使用新的服务定义。
在 `examples/python/helloworld` 目录下,运行
python -m grpc_tools.protoc -I../../protos --python_out=. --pyi_out=. --grpc_python_out=. ../../protos/helloworld.proto
这将重新生成包含我们生成的请求和响应类的 `helloworld_pb2.py` 文件,以及包含我们生成的客户端和服务器类的 `helloworld_pb2_grpc.py` 文件。
更新并运行应用
现在我们有了新的生成的服务器和客户端代码,但仍需要在示例应用的手写部分实现并调用新方法。
更新服务器
在同一目录下,打开 `greeter_server.py`。如下实现新方法:
class Greeter(helloworld_pb2_grpc.GreeterServicer):
def SayHello(self, request, context):
return helloworld_pb2.HelloReply(message=f"Hello, {request.name}!")
def SayHelloAgain(self, request, context):
return helloworld_pb2.HelloReply(message=f"Hello again, {request.name}!")
...
更新客户端
在同一目录下,打开 `greeter_client.py`。如下调用新方法:
def run():
with grpc.insecure_channel('localhost:50051') as channel:
stub = helloworld_pb2_grpc.GreeterStub(channel)
response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'))
print("Greeter client received: " + response.message)
response = stub.SayHelloAgain(helloworld_pb2.HelloRequest(name='you'))
print("Greeter client received: " + response.message)
运行!
就像之前一样,在 `examples/python/helloworld` 目录下
运行服务器
python greeter_server.py
在另一个终端中,运行客户端
python greeter_client.py