当前位置:   article > 正文

Python3搭建gRPC服务(入门版)_grpcio是什么

grpcio是什么

0、文章简介

这是一篇关于gRPC入门的快速文档,预计需要10分钟左右阅读时间,读完后你可以大概了解gRPC的概念和开发简单的gRPC服务Demo,本文适合基于Python3构建快速的gRPC服务,同时提供以下进阶材料

1、gRPC进阶文章(后续会更新)

2、同步视频教程(后续会更新)

3、其他相关联文章,包括pytest进行gRPC测试,python3客户端测试java/golang grpc服务端(后续会更新)

1、gRPC是什么?

gRPC 是一个由 Google 开发的高性能开源通用 RPC 框架。在 gRPC 中,客户端应用可以直接调用其他机器上的服务器应用中的方法,如同调用本地对象一样,从而让您更轻松地创建分布式应用和服务

gRPC可以在不同语言构建的服务中实现调用,比如C++的服务端,Java的客户端/Python的客户端均可以进行调用,在异构系统的微服务系统中得到广泛使用

image.png

2、如何快速构建一个python3的gRPC服务

搭建python3的gRPC整体思路分成4步

  • 引入相关依赖
  • 编写protobuf
  • 将protobuf转成python代码
  • 开发gRPC服务

2.1、引入相关依赖

需要引入以下2个外部依赖 grpciogrpcio-tools

grpcio是grpc的基础包,提供了grpc的通信能力,grpcio-tools提供了protobuf转成python的功能

通过pip3安装对应的包

pip3 install grpcio-tools
pip3 install grpcio

  • 1
  • 2
  • 3

2.2、编写protobuf

可以在pycharm安装一个插件,随后在pycharm上编写对应的protobuf,在pycharm中新建一个工程包含以下三个目录,client,server,pb

  • client用于存放客户端调试文件
  • server用于存放gRPC服务端代码
  • pb用于存放protobuf文件

image.png

新建hello.proto后pycharm会提示安装protobuf插件,安装对应的插件_Protocol Buffers_

在hello.proto中编写如下pb文件

syntax = "proto3";

service Hello{
  rpc SayHello (HelloRequest) 
      returns (HelloResponse){}
}

message HelloRequest{
  string name = 1;
}

message HelloResponse{
  string response = 1;
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

编写protobuf文件后,我们项目结构如下

image.png

2.3、将protobuf转换成python3代码

在项目根目录下执行该命令,具体命令解释请参考进阶版

python3 -m  grpc_tools.protoc -I ./ --python_out=. --pyi_out=. --grpc_python_out=. pb/hello.proto

  • 1
  • 2

执行后将在pb文件下新增3个文件,hello_pb2.pyhello_pb2.pyihello_pb2_grpc.py

image.png

注意:打开生成的文件查看下有没有报错,如果有报错信息一定要处理好,一般都是import不正确,后面,第4章会有介绍

2.4、写gRPC服务端代码

在server目录下新建一个demo_server的python文件,具体代码解释请参考进阶版本

from concurrent import futures

import grpc

from grpc_demo.pb.hello_pb2_grpc import HelloServicer
from grpc_demo.pb.hello_pb2 import HelloRequest, HelloResponse
from grpc_demo.pb import hello_pb2_grpc


class HelloServer(HelloServicer):

    # 继承
    def SayHello(self, request, context):
        name = request.name
        return HelloResponse(response="hello: {}".format(name))


def serve():
    port = "40000"
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    hello_pb2_grpc.add_HelloServicer_to_server(HelloServer(), server)
    server.add_insecure_port('[::]:' + port)
    server.start()
    print("Server started, listening on " + port)
    server.wait_for_termination()


if __name__ == '__main__':
    serve()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

随后启动服务,可以查看到对应的启动日志,如果启动报错请查看第4章常见的错误信息

image.png

3、写一个客户端测试一下

在client包下面新建一个demo_client.py

import grpc
from grpc_demo.pb.hello_pb2_grpc import HelloStub
from grpc_demo.pb.hello_pb2 import HelloRequest

def run():
    with grpc.insecure_channel("localhost:40000") as channel:
        stub = HelloStub(channel)
        response = stub.SayHello(HelloRequest(name="i am test"))
        print(response.response)

if __name__ == '__main__':
    run()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

执行后得到结果

image.png

4、常见错误

4.1、通过pb生成的python文件import目录不正确

问题现象: 启动时报No module named ‘pb’

ModuleNotFoundError: No module named 'pb'

  • 1
  • 2

image.png 解决办法:

点击报错位置,找到对应错误文件,查看import是否飘红报错,将对应的from pb import xxx 改成from grpc_demo.pb import xxx

image.png

4.2、客户端调用时报错,服务端问题

问题现象:

details = “Exception calling application: init() takes 1 positional argument but 2 were given”

image.png

解决办法:

服务端获取客户端的值需要带着参数名调用,不带参数名调用时就会出现如上错误

错误演示:

image.png

正确显示:

image.png

4.3、客户端调用时报错,客户端问题

TypeError: init() takes 1 positional argument but 2 were given

客户端调用服务端入参时,传递参数需要指定参数名,没有指定参数名就会报错

错误演示

image.png

正确演示

image.png

如果大家阅读文章后发现其他报错信息可以将代码和错误信息贴到评论,笔者将无偿解答

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/492225
推荐阅读
相关标签