Python中的gRPC简化指南

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai


Google的gRPC提供了一个框架,用于实现RPC(远程过程调用)工作流。 通过在HTTP / 2上分层并使用协议缓冲区,gRPC有望比传统的REST + JSON API带来很多好处。

在这里插入图片描述

这篇文章试图从头开始,采用Python实现一个简单的功能,并通过gRPC接口提供服务。

因此,让我们开始学习构建。

0.定义函数

让我们创建一个要公开远程调用的 square_root 函数,它位于calculator.py 中。

import math

def square_root(x):
  y = math.sqrt(x)
  return y

square_root 接受输入x,并将平方根返回为 y。 本文的其余部分将重点介绍如何通过gRPC 公开 square_root 这个函数。

1.设置协议缓冲区(protocol buffers)

协议缓冲区是一种语言中立的机制,用于序列化结构化数据。 使用它需要明确定义值及其数据类型。

让我们创建 calculator.proto,它定义我们的服务要使用的消息(message)和服务结构(service structures)。

syntax = "proto3";

message Number {
    float value = 1;
}

service Calculator {
    rpc SquareRoot(Number) returns (Number) {}
}

你可以考虑以下消息(message)和服务定义(service definitions):

  • Number.value 将用于包含变量 x 和 y;
  • Calculator.SquareRoot 将用于函数 square_root ;

2.为Python生成gRPC类

此部分可能是整个过程中最“黑匣子”的部分。 我们将使用特殊的工具来自动生成类。

运行下面这些命令时,将遵循某些命名约定生成新文件和类。

$ pip install grpcio
$ pip install grpcio-tools

$ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. calculator.proto

生成的文件如下:

calculator_pb2.py 包含 message 类

  • calculator_pb2.Number 是请求和应答的变量 x 和 y 。

calculator_pb2_grpc.py 包含服务端和客户端类

  • calculator.pb2_grpc.CalculatorServicer 是服务端;
  • calculator.pb2_grpc.CalculatorStub 是客户端;

3.创建一个gRPC服务器

现在,我们拥有创建gRPC服务器server.py所需的所有部分,如下所示。 注释应解释每个部分。

import grpc
from concurrent import futures
import time

# import the generated classes
import calculator_pb2
import calculator_pb2_grpc

# import the original calculator.py
import calculator

# create a class to define the server functions, derived from
# calculator_pb2_grpc.CalculatorServicer
class CalculatorServicer(calculator_pb2_grpc.CalculatorServicer):

    # calculator.square_root is exposed here
    # the request and response are of the data type
    # calculator_pb2.Number
    def SquareRoot(self, request, context):
        response = calculator_pb2.Number()
        response.value = calculator.square_root(request.value)
        return response


# create a gRPC server
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))

# use the generated function `add_CalculatorServicer_to_server`
# to add the defined class to the server
calculator_pb2_grpc.add_CalculatorServicer_to_server(
        CalculatorServicer(), server)

# listen on port 50051
print('Starting server. Listening on port 50051.')
server.add_insecure_port('[::]:50051')
server.start()

# since server.start() will not block,
# a sleep-loop is added to keep alive
try:
    while True:
        time.sleep(86400)
except KeyboardInterrupt:
    server.stop(0)

我们可以使用以下命令启动服务器:

$ python server.py
Starting server. Listening on port 50051.

现在我们有了一个 gRPC 服务器,监听端口 50051。

4.创建一个gRPC客户端

完成服务器设置后,我们创建了client.py,它仅调用函数并打印结果。

import grpc

# import the generated classes
import calculator_pb2
import calculator_pb2_grpc

# open a gRPC channel
channel = grpc.insecure_channel('localhost:50051')

# create a stub (client)
stub = calculator_pb2_grpc.CalculatorStub(channel)

# create a valid request message
number = calculator_pb2.Number(value=16)

# make the call
response = stub.SquareRoot(number)

# et voilà
print(response.value)

就是这样!

在服务器已经侦听的情况下,我们只需运行客户端即可。

$ python client.py
4.0

这篇文章使用一个非常简单的示例将一个函数转换为一个远程调用过程,这只是在非常浅层表面上做文章。

当然,gRPC可以在更高级的模式(请求流,响应流,双向流)中使用,并具有其他功能,例如错误处理和身份验证。 但是,我们所有人都必须从某个简单地方开始,我希望这篇文章对刚开始的那些人有很好的参考意义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值