赞
踩
这是一篇关于gRPC入门的快速文档,预计需要10分钟左右阅读时间,读完后你可以大概了解gRPC的概念和开发简单的gRPC服务Demo,本文适合基于Python3构建快速的gRPC服务,同时提供以下进阶材料
1、gRPC进阶文章(后续会更新)
2、同步视频教程(后续会更新)
3、其他相关联文章,包括pytest进行gRPC测试,python3客户端测试java/golang grpc服务端(后续会更新)
gRPC 是一个由 Google 开发的高性能开源通用 RPC 框架。在 gRPC 中,客户端应用可以直接调用其他机器上的服务器应用中的方法,如同调用本地对象一样,从而让您更轻松地创建分布式应用和服务
gRPC可以在不同语言构建的服务中实现调用,比如C++的服务端,Java的客户端/Python的客户端均可以进行调用,在异构系统的微服务系统中得到广泛使用
搭建python3的gRPC整体思路分成4步
需要引入以下2个外部依赖 grpcio,grpcio-tools
grpcio是grpc的基础包,提供了grpc的通信能力,grpcio-tools提供了protobuf转成python的功能
通过pip3安装对应的包
pip3 install grpcio-tools
pip3 install grpcio
可以在pycharm安装一个插件,随后在pycharm上编写对应的protobuf,在pycharm中新建一个工程包含以下三个目录,client,server,pb
新建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; }
编写protobuf文件后,我们项目结构如下
在项目根目录下执行该命令,具体命令解释请参考进阶版
python3 -m grpc_tools.protoc -I ./ --python_out=. --pyi_out=. --grpc_python_out=. pb/hello.proto
执行后将在pb文件下新增3个文件,hello_pb2.py,hello_pb2.pyi,hello_pb2_grpc.py
注意:打开生成的文件查看下有没有报错,如果有报错信息一定要处理好,一般都是import不正确,后面,第4章会有介绍
在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()
随后启动服务,可以查看到对应的启动日志,如果启动报错请查看第4章常见的错误信息
在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()
执行后得到结果
问题现象: 启动时报No module named ‘pb’
ModuleNotFoundError: No module named 'pb'
解决办法:
点击报错位置,找到对应错误文件,查看import是否飘红报错,将对应的from pb import xxx 改成from grpc_demo.pb import xxx
问题现象:
details = “Exception calling application: init() takes 1 positional argument but 2 were given”
解决办法:
服务端获取客户端的值需要带着参数名调用,不带参数名调用时就会出现如上错误
错误演示:
正确显示:
TypeError: init() takes 1 positional argument but 2 were given
客户端调用服务端入参时,传递参数需要指定参数名,没有指定参数名就会报错
错误演示
正确演示
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。