测试代码
- 新建
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()
完整的项目结构如下:
状态码说明
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')
修改前
修改后
客户端获取状态码
如果服务端报错,可以看到客户端打印输出下面内容
如果想要获取状态码和报错信息,我们可以捕获错误,客户端代码修改如下:
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())
运行后输出如下: