【Python分布式服务框架】gRPC服务异常状态响应
2023-09-11 14:19:33 时间
gRPC服务异常状态响应
gRPC服务中已经为我们申明了状态码,需要在项目中引入grpc.StatusCode
文件,我们也只能使用这些状态码进行异常响应,使用未定义的状态码会响应UNKNOWN
错误,如果项目中有特殊需求可以考虑定义数据结构来实现。
1. gRPC状态码说明
状态码 | 描述 |
---|---|
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 | 无法恢复的数据丢失或损坏。 |
2. 服务中直接使用context响应异常
定义服务
# coding=gbk
from grpc import StatusCode
import greeter_pb2, greeter_pb2_grpc
# 黑名单
DenyUser = ["admin", "administrator"]
class Greeter(greeter_pb2_grpc.GreeterServicer):
async def SayHello(self, request, context):
if request.name in DenyUser:
context.set_code(StatusCode.PERMISSION_DENIED)
context.set_details("失败,用户权限不足")
return context
return greeter_pb2.HelloReply(message=f"Hello {request.name}")
3. 定义中间件响应异常
使用中间件来获取异常时可能需要自定义一组异常类配合使用,才能使返回更加友好。
定义中间件
# coding=gbk
from grpc import StatusCode
from types import FunctionType
from functools import wraps
def wrapper(method):
@wraps(method)
async def wrapped(clf, request, context):
try:
return await method(clf, request, context)
except Exception as e:
context.set_code(StatusCode.UNKNOWN)
context.set_details(f'Grpc ERROR [{e}]')
return context
return wrapped
class ServiceMiddlewareClass(type):
def __new__(meta, classname, bases, class_dict):
new_class_dict = {}
for attribute_name, attribute in class_dict.items():
if isinstance(attribute, FunctionType):
# replace it with a wrapped version
attribute = wrapper(attribute)
new_class_dict[attribute_name] = attribute
return type.__new__(meta, classname, bases, new_class_dict)
定义服务
# coding=gbk
from grpc import StatusCode
import greeter_pb2, greeter_pb2_grpc
from middleware import ServiceMiddlewareClass
# 黑名单
DenyUser = ["admin", "administrator"]
class Greeter(greeter_pb2_grpc.GreeterServicer, metaclass=ServiceMiddlewareClass):
async def SayHello(self, request, context):
if request.name in DenyUser:
raise Exception("失败,用户权限不足")
return greeter_pb2.HelloReply(message=f"Hello {request.name}")
4. 成功状态(StatusCode.OK)
需要注意的是,在python实现的gRPC中是不能直接响应OK
状态的,如果context
被设置为OK
状态客户端实际收到的状态是UNKNOWN
状态,也需要考虑定义数据结构来实现。
相关文章
- 第三百五十节,Python分布式爬虫打造搜索引擎Scrapy精讲—selenium模块是一个python操作浏览器软件的一个模块,可以实现js动态网页请求
- python中并行遍历:zip和map-转
- Centos 6.4 安装Python 2.7 python-pip
- python: easyocr的安装和使用(easyocr 1.6.2 / Python 3.7.15 )
- Python: 爬虫入门-python爬虫入门教程(非常详细)
- 用Python实现微信自动化抢红包,再也不用担心抢不到红包了
- Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法
- Python语言学习:Python语言学习之迭代/递归/OS输入输出/错误&异常处理的简介、案例应用之详细攻略
- Python语言学习之数值、小数、空格那些事:python和数值、小数、空格的使用方法之详细攻略
- Python语言学习之文件格式后缀那些事:python和常见各种文件格式后缀介绍、使用方法之详细攻略
- Python语言学习之常见语句命令那些事:python和常见语句命令(条件语句、pass语句)使用方法之详细攻略
- 成功解决ERROR: Command errored out with exit status 1: command: 'f:program filespythonpython36pyt
- 【python代码】:能在手机上敲 Python 代码几款App
- 〖Python接口自动化测试实战篇⑧〗- 小案例 - 使用python实现接口请求 [查询天行数据]
- 风电随机性动态经济调度模型(Python&Matlab代码)
- Python制作读者下载器,实现随时随地免费看
- Python数据分析与展示:科学计算基础库numpy-1
- 飘逸的python - __new__、__init__、__call__傻傻分不清
- win7 python-ssh
- Python笔记:使用pywin32处理excel文件
- python自动化测试学习-Python测试框架之unittest和pytest
- 【Python实战】 ---- python 自带的 venv 虚拟环境更新 pip 失败