关于测试:微服务测试教程使用Python测试gRPC接口案例

28次阅读

共计 2088 个字符,预计需要花费 6 分钟才能阅读完成。

微服务离不开 gRPC

当初大多数企业都会采纳微服务作为软件的架构,在这种架构的大背景下,微服务框架和协定宽泛风行,而 RPC 也开始风行。grpc 是基于 RPC 的框架,性能高,应用十分宽泛。
grpc 由谷歌公司开发和保护,反对简直所有的支流编程语言。不论你用的是 Java,还是 Python, 还是 Go, 还是 Ruby 等等,都能够应用他来实现近程的服务。

Protocol Buffers

grpc 默认应用 protocol buffers 作为序列化传输格局,通常会把传输的数据类型用一个带有.proto 扩展名的一般文本文件来存储,不论是申请还是响应的数据都须要合乎这外面定义的数据要求。
比方在进行用户验证时往往须要传入登录的用户信息,服务端返回 token 值,对应的 proto 文件形容,如果申请或者响应数据太大,不能一次获取完,能够通过 stream 流信息继续传输,此时在类后面加 stream 关键字。

              // login.proto
              
              service User{
                // login
                rpc Login (LoginReqeust) returns (LoginReply) {}
                // stream
                rpc GetImage(LoginRequest) return (stream LoginReply){}}
              
              // 登录申请数据
              message LoginReqeust {
                string username = 1;
                string passwd = 2;
              }
              
              // 登录响应数据
              message LoginReply {
                string token = 1;
                string msg = 2;
              }

proto 文件生成 gPRC 代码

以 Python 为例,首先须要装置 Python 相干的包。

          pip install grpcio
          pip install grpcio-tools

对应生成 Python 代码的命令,留神 -I 示意 proto 文件所在的子目录:

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

输出完命令当前,在目录下会多两个文件,一个叫 login_pb2.py,外面报告了申请和响应相干的数据格式,还有一个叫 login_pb2_grpc.py,蕴含了客户端和响应端的类。
生成的 login_pb2.grpc.py 中的代码 …

创立 gRPC 服务

创立接口须要用到下面生成的 UserServicer 类。

          import login_pb2_grpc
          import login_pb2
          
          class User(login_pb2_grpc.UserServicer):
          
            def Login(self, request, context):
              return login_pb2.LoginReply(msg=f"hello, {request.username}",
                                         token="It is my token")

运行服务:

          import grpc
          from concurrent import futures
          
          def serve():
            server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
            login_pb2_grpc.add_UserServicer_to_server(User(), server)
            server.add_insecure_port('[::]:50051')
            server.start()
            server.wait_for_termination()
          
          serve()

创立 gRPC 客户端

一个例子:

          import grpc
          
          def run():
              with grpc.insecure_channel('localhost:50051') as channel:
                  stub = login_pb2_grpc.UserStub(channel)
                  response = stub.Login(login_pb2.LoginRequest(username='you', passwd="123"))
                  print("Client received:" + response.msg)

protocol buffer 转成 json

客户端拿到响应后果之后,能够通过类属性获取字段:

              response.msg
              response.token

有时候咱们会把它转换成 json 格局,不便获取整个响应。此时能够应用 protobuf 这个库,先装置:

          pip install protobuf

接下来应用转换成 json 格局的办法就能够了。

          from google.protobuf.json_format import MessageToJson
          import json
          
          def run():
              with grpc.insecure_channel('localhost:50051') as channel:
                  stub = login_pb2_grpc.UserStub(channel)
                  response = stub.Login(login_pb2.LoginRequest(username='you', passwd="123"))
                  print(json.loads(MessageToJson(response)))

正文完
 0