FeignClient 客户端如何捕获到服务端抛出的自定义异常

一、背景

当两个服务通过HTTP通信的时候,客户端会接收到的是一个由服务端返回的Response。那些客户端的“神器”,例如:Retrofit、FeignClient,通过对Response进行处理,让客户端有了好像调用本地方法的感觉。至此,听起来都是那么美好是不?遗憾的是,在使用FeignClient的时候,客户端是无法拿到服务端抛出的自定义异常的,取而代之是FeignException,是不是变得不那么顺滑了呢?这样的结果导致客户端无法根据不同的异常进行有针对性的处理。

为了要解决这个问题,下面的时间里我将介绍下我的解决方案。

二、解决方案

1、自定义异常类(BizException)

服务端在处理具体业务的时候,会出现一些错误导致业务无法正常进行下去,例如:支付的时候余额不足,下单的时候库存不足等等,针对此种情况统一采用抛出一个自定义的业务异常(BizException),同时采用错误码来区分各种错误,具体代码如下:

@Data
public class BizException extends RuntimeException {
    /**
     * 错误码
     */
    private String code;

    /**
     * 错误信息
     */
    private String msg;

    /**
     * 数据
     */
    private Object data;
}
2、服务端统一处理 BizException

通过 @ExceptionHandler 统一处理被抛出的 BizException,代码如下:
在这里插入图片描述
通过上边的代码,我们可以看到,当遇到 BizException 的时候,Response 中的 status,会被重写为600。

3、客户端统一处理 status==600 的 Response

客户端通过实现 feign.codec.ErrorDecoder 接口拦截 Response,将 status==600 的 Response 转化为BizException,代码如下:
在这里插入图片描述

4、整体思路

服务端抛出 BizException 同时将该BizException转换为 status == 600 的 Response,客户端接收到 status == 600 的 Response 同时将此 Response 转换为 BizException,如下图:
在这里插入图片描述

三、案例

下面将以 annoroad-alpha、annoroad-beta、annoroad-ms-spring-boot-starter 为例来进一步的说明下。

首先介绍下它们都是啥都:

  • annoroad-alpha:作为本例的客户端,引用 annoroad-ms-spring-boot-starter
  • annoroad-beta:作为本例的服务端,引用 annoroad-ms-spring-boot-starter
  • annoroad-ms-spring-boot-starter:
    1、将抛出的 BizException 转换为 status == 600 的 Response
    2、将接收到的 Response(status == 600) 转换成 BizException
1、annoroad-alpha、annoroad-beta 的调用关系

在这里插入图片描述

2、BizException 处理的全过程

在这里插入图片描述

3、抛出的 BizException 转换为 status == 600 的 Response 的过程

被黑框框起来的部分对应「解决方案中的 2 」,如下图:
在这里插入图片描述

4、将接收到的 Response(status == 600) 转换成 BizException 的过程

被黑框框起来的部分对应「解决方案中的 3 」,如下图:
在这里插入图片描述

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cab5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值