GRPC 错误处理

1,931 阅读2分钟

GRPC 错误处理

引言

在开发过程中,错误处理一直是一个很重要的步骤。一般在http API中,我们都会用status code + 自定义消息体的方式来处理,status code表示网络或者服务器情况,而业务相关都会放置到自定义消息体。那么grpc中错误处理是否也可以这样做。

gRPC错误处理

先用Golang建立一个gRPC服务

先写一个test.proto

1008611.png

执行下protoc命令生成go文件

protoc -I ./ ./*.proto --go_out=plugins=grpc:./

然后我们建立一个gogRPC server

108610.png

好了,gRPC服务就建好了。

现在我们再搞个gRPC client试试

1008612.png

执行一下

1008613.png

返回的是一个字符串,格式是rpc error: code = 错误码 desc = 错误信息

Status

gRPC默认使用 Status 来处理错误的,这是Status结构

1008614.png

改造下gRPC的服务器

引入两个包

"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"

改下服务器方法返回

1008615.png

这样我们就能指定返回的code。不过gRPC提供的code很少,也就16个,业务层面的话,肯定是覆盖不了,所以我们还要实现业务错误码。

Status.Details

Status结构中有一个Details字段,注释意思是包含错误详细信息的消息列表,可以给api使用的通用消息类型。这个字段是 Any 类型, 支持我们自行扩展,所以我们的业务错误就可以写在这里。

我们先加一个业务通用的protobuf错误结构

message Error{
  int32 code = 1;
  string msg = 2;
}

改造下gRPC的服务器

image.png

我们在客户端试试看,修改在客户端代码

image.png

执行结果

image.png

这样我们就可以得到自定义的业务错误码。

node.js 实现 Status

我有部分服务使用node.js开发的,node.js的sdk grpcjs是没有实现status的details功能,所以我自能自己实现这部分功能。

先写个node的gRPC客户端,这种gRPC写法是我自己封装。

image.png

看下执行输出

image.png

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的模块

image.png

改一下node的客户端代码

image.png

执行一下命令

image.png

这样我们就能得到自定义的业务错误码。


END