快速入门

本指南通过一个简单的示例,帮助您开始使用 Python 中的 gRPC。

快速入门

本指南通过一个简单的示例,帮助您开始使用 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` 目录下

  1. 运行服务器

    python greeter_server.py
    
  2. 在另一个终端中,运行客户端

    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` 目录下

  1. 运行服务器

    python greeter_server.py
    
  2. 在另一个终端中,运行客户端

    python greeter_client.py
    

下一步