gRPC

本文详细介绍如何在Python环境中安装gRPC及其相关工具,并通过一个示例应用展示如何定义及调用gRPC服务方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装

安装gRPC

pip install grpcio

安装gRPC tools

pip install grpcio-tools

对于python3.6+安装protobuf否则会报错TypeError

#  TypeError: __new__() got an unexpected keyword argument 'serialized_options'
pip install -U protobuf

下载样例

# Clone the repository to get the example code:
git clone -b v1.19.0 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.p
  1. 在另一个终端,启动客户端
python greeter_client.py

更新gRPC应用

更新.proto文件

如何在服务端增加一个可供客户端调用的方法?我们使用protocol buffers定义gRPC服务。可以阅读What is gRPC?gRPC Basics:Python了解更多如果和使用.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 reponse message containing the greetings
message HelloReply {
    string message = 1;
}

我们更新一下上述内容使Greeter服务有两个方法。在examples/protos/helloworld.proto中加入一个和SayHello有相同request、response类型的方法: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 reponse message containing the greetings
message HelloReply {
    string message = 1;
}

根据新.proto文件生成gRPC代码

为了使应用能使用到新定义的方法我们需要更新gRPC代码
在路径examples/python/helloworld下运行:

python -m grpc_tools.protoc -I../../protos --python_out=. --grpc_python_out=. ../../protos/helloworld.proto

helloworld_pb2.py包含生成的request和response类, helloworld_pb2_grpc.py包含客户端和服务端类

更新自己的代码并运行应用

现在已经有更新了的服务端和客户端代码,但是我们仍然需要再我们的示例应用中人工撰写部分实现和调用新方法
更新服务端greeter_server.py:

class Greeter(helloworld_pb2_grpc.GreeterServicer):

  def SayHello(self, request, context):
    return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)

  def SayHelloAgain(self, request, context):
    return helloworld_pb2.HelloReply(message='Hello again, %s!' % request.name)
...

更新客户端greeter_client.py:


def run():
  channel = grpc.insecure_channel('localhost:50051')
  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)

运行

  1. 运行服务
python greeter_server.py
  1. 在另一个终端,运行客户端
python greeter_client.py

参考:
grpc.io

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值