GRPC 错误处理
引言
在开发过程中,错误处理一直是一个很重要的步骤。一般在http API中,我们都会用status code + 自定义消息体的方式来处理,status code表示网络或者服务器情况,而业务相关都会放置到自定义消息体。那么grpc中错误处理是否也可以这样做。
gRPC错误处理
先用Golang建立一个gRPC服务
先写一个test.proto
执行下protoc命令生成go文件
protoc -I ./ ./*.proto --go_out=plugins=grpc:./
然后我们建立一个go的gRPC server
好了,gRPC服务就建好了。
现在我们再搞个gRPC client试试
执行一下
返回的是一个字符串,格式是rpc error: code = 错误码 desc = 错误信息
Status
gRPC默认使用 Status 来处理错误的,这是Status结构
改造下gRPC的服务器
引入两个包
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
改下服务器方法返回
这样我们就能指定返回的code。不过gRPC提供的code很少,也就16个,业务层面的话,肯定是覆盖不了,所以我们还要实现业务错误码。
Status.Details
Status结构中有一个Details字段,注释意思是包含错误详细信息的消息列表,可以给api使用的通用消息类型。这个字段是 Any 类型, 支持我们自行扩展,所以我们的业务错误就可以写在这里。
我们先加一个业务通用的protobuf错误结构
message Error{
int32 code = 1;
string msg = 2;
}
改造下gRPC的服务器
我们在客户端试试看,修改在客户端代码
执行结果
这样我们就可以得到自定义的业务错误码。
node.js 实现 Status
我有部分服务使用node.js开发的,node.js的sdk grpcjs是没有实现status的details功能,所以我自能自己实现这部分功能。
先写个node的gRPC客户端,这种gRPC写法是我自己封装。
看下执行输出
gRPC的details内容是放置在metadata的key为grpc-status-details-bin中的。
我们需要用到gRPC的status.proto和我们自己定义业务通用的protobuf错误结构来做反序列化。
把proto转成js文件,执行下命令
protoc --js_out=import_style=commonjs,binary:. status.proto
protoc --js_out=import_style=commonjs,binary:. test.proto
我们就得到status_pb.js和test_pb.js的文件,这样就可以拿来做反序列化。
写个grpc-status的模块
改一下node的客户端代码
执行一下命令
这样我们就能得到自定义的业务错误码。
END