设计一个合理的 API 是一件不容易的事情,同时,API 还会产生各种不同的错误。
为了能让 API 使用者对于 API 的错误有一个清晰的视图,定义一个标准的 RPC 错误类型是非常重要的事情。
考虑范围
一个合理的 RPC 错误,需要考虑如下几个方面。
- 包含错误码,错误信息
- 错误信息可扩展
- 考虑可读性
- 可解析性,即,用户可通过代码解析错误码,并采取有效行为
- 避免内部错误益处,例如,Nil point error
RPC 错误码结构
{
"error":{
"code":500,
"status":"Internal Server Error",
"message":"Panic manually!",
"details":[]
}
}
例子
我们介绍 rk-boot 库,一个快速启动 GRPC 的企业级 golang 微服务框架。
通过 rk-boot ,用户可以轻松搭建 GRPC 微服务,里面同时集成了 Panic 捕捉以及标准错误类型。
返回自定义错误
在 GRPC 中,一般会配合 grpc-gateway 一起使用,这时候,会出现一个问题,GRPC 和 grpc-gateway 的错误映射。
我们要做到的是,让 grpc-gateway 始终对 GRPC 的错误保持一致的错误映射。
我们以 demo 代码为例子,在这个 demo 中,我们已经集成了 rk-boot。
注意,这里,在 boot.yaml 中需要开启 enableRkGwOption,才可以把 GRPC 错误映射成 grpc-gateway 错误。
- boot.yaml
---
grpc:
- name: greeter # Name of grpc entry
port: 8080 # Port of grpc entry
enabled: true # Enable grpc entry
enableReflection: true
enableRkGwOption: true
- main.go
// Copyright (c) 2021 rookie-ninja
//
// Use of this source code is governed by an Apache-style
// license that can be found in the LICENSE file.
package main
import (
"context"
"errors"
"github.com/rookie-ninja/rk-boot"
"github.com/rookie-ninja/rk-common/error"
"github.com/rookie-ninja/rk-demo/api/gen/v1"
"google.golang.org/grpc"
)
// Application entrance.
func