gRPC的错误处理实践

基于石墨文档基于K8S的Go微服务实践,我们这次把该内容中的错误码做了一个详细的介绍。

0 背景

我们内部系统全部统一采用gRPC协议和protobuf编解码。统一的好处在于不需要在做任何协议、编解码转换,这样就可以使我们所有业务采用同一个protobuf仓库,基于CI/CD工具实现许多自动化功能。

05d271c92804b122ae708dab410c9f99.png

我们要求所有服务提供者提前在独立的路径下定义好接口和错误码的protobuf文件,然后提交到GitLab,我们通过GitLab CIcheck阶段对变更的protobuf文件做formatlintbreaking 检查。然后在build阶段,会基于protobuf文件中的注释自动产生文档,并推送至内部的微服务管理系统接口平台中,还会根据protobuf文件自动构建Go/PHP/Node/Java等多种语言的桩代码和错误码,并推送到指定对应的中心化仓库。推送到仓库后,我们就可以通过各语言的包管理工具拉取客户端、服务端的gRPC和错误码的依赖,不需要口头约定对接数据的定义,也不需要通过IM工具传递对接数据的定义文件,极大的简化了对接成本。

1 判断Error的错误原理

要了解怎么处理gRPCerror之前,我们首先来看下Go普通的error是怎么处理的。

我们在判断一个error的根因,需要根因error是一个固定地址的指针类型,这样我们才能够使用官方的errors.Is方法判断他是否为根因。以下是一个代码示例:

c33a3fbf87a2fbb4bfb24f4b28ea7d35.png

我们先看这个代码errors.Is(wrapNewPointerError(), fmt.Errorf("i am error"))的执行步骤,首先构造了一个error,然后使用官方%w的方式将error进行了包装,我们在使用errors.Is方法判断的时候,底层函数会将error解包来判断两个error的地址是否一致。

932e46338caa64e859be52d1e21c4d01.png

因此我们第一个errors.Is执行的是个false。在使用这个代码errors.Is(wrapConstantPointerError(), sentinelErr),因为是固定地址的error

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值