python grpc状态码用法

测试代码

  • 新建demo.proto文件定义协议缓冲区,写入以下内容:
syntax = "proto3";
package server;

service Demo {
  rpc ping(Request) returns (Response) {}
}

message Request {string msg = 1;}
message Response {string msg = 1;}

使用gRPC的工具包,生成gRPC服务类

python -m grpc_tools.protoc --proto_path=. --python_out=. --grpc_python_out=.  demo.proto

可以看到生成了两个文件
在这里插入图片描述

  • server.py
import grpc
import demo_pb2
import demo_pb2_grpc
from concurrent import futures


class UserInfo(demo_pb2_grpc.DemoServicer):
    def ping(self, request, context):
    	# context.set_code(grpc.StatusCode.NOT_FOUND)
        # context.set_details('测试修改')
        return demo_pb2.Response(msg='PONG')


def serve():
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
    demo_pb2_grpc.add_DemoServicer_to_server(UserInfo(), server)
    server.add_insecure_port('[::]:50051')
    server.start()
    server.wait_for_termination()


if __name__ == '__main__':
    serve()

  • client.py
from __future__ import print_function

import logging, sys

import grpc
import demo_pb2
import demo_pb2_grpc


def run():
    with grpc.insecure_channel('localhost:50051') as channel:
        response = demo_pb2_grpc.DemoStub(channel).ping(demo_pb2.Request())
        print(response)


if __name__ == '__main__':
    logging.basicConfig()
    run()

完整的项目结构如下:
python grpc状态码用法_第1张图片

状态码说明

OK 不是错误;是成功的响应。
CANCELLED 操作已取消,通常由调用方取消。
UNKNOWN 未知错误。
INVALID_ARGUMENT 客户端指定了无效参数。
DEADLINE_EXCEEDED 操作完成前的截止日期已过期。
NOT_FOUND 未找到某些请求的实体,如:文件或目录。
ALREADY_EXISTS 我们试图创建的某些实体,例如:文件或目录已经存在。
PERMISSION_DENIED 调用方无权执行指定的活动。
UNAUTHENTICATED 请求没有有效的身份验证凭据活动。
RESOURCE_EXHAUSTED 某些资源已耗尽,可能是每个用户的配额或者可能整个文件系统的空间不足。
FAILED_PRECONDITION 操作被拒绝,因为系统未处于状态操作执行所需的。
ABORTED 操作中止,通常是由于并发问题,如sequencer检查失败、事务中止等。
UNIMPLEMENTED 此服务中未实现或不支持的操作。
INTERNAL 表示底层用户期望的一些不变量系统被破坏了。
UNAVAILABLE 该服务当前不可用。
DATA_LOSS 无法恢复的数据丢失或损坏。

状态码设置状态码

修改响应状态码可通过服务端context对象修改

def ping(self, request, context):
    context.set_code(grpc.StatusCode.NOT_FOUND)
    context.set_details('测试修改')
    return demo_pb2.Response(msg='PONG')

修改前
python grpc状态码用法_第2张图片
修改后
python grpc状态码用法_第3张图片

客户端获取状态码

如果服务端报错,可以看到客户端打印输出下面内容
python grpc状态码用法_第4张图片
如果想要获取状态码和报错信息,我们可以捕获错误,客户端代码修改如下:

def run():
    with grpc.insecure_channel('localhost:50051') as channel:
        try:
            response = demo_pb2_grpc.DemoStub(channel).ping(demo_pb2.Request())
            print(response)
        except Exception as e:
            print()
            print(e.code())
            print(e.details())
            print(e.debug_error_string())

运行后输出如下:
在这里插入图片描述

你可能感兴趣的:(python,服务器,python,rpc,微服务)