赞
踩
当两个服务通过HTTP通信的时候,客户端会接收到的是一个由服务端返回的Response。那些客户端的“神器”,例如:Retrofit、FeignClient,通过对Response进行处理,让客户端有了好像调用本地方法的感觉。至此,听起来都是那么美好是不?遗憾的是,在使用FeignClient的时候,客户端是无法拿到服务端抛出的自定义异常的,取而代之是FeignException,是不是变得不那么顺滑了呢?这样的结果导致客户端无法根据不同的异常进行有针对性的处理。
为了要解决这个问题,下面的时间里我将介绍下我的解决方案。
服务端在处理具体业务的时候,会出现一些错误导致业务无法正常进行下去,例如:支付的时候余额不足,下单的时候库存不足等等,针对此种情况统一采用抛出一个自定义的业务异常(BizException),同时采用错误码来区分各种错误,具体代码如下:
@Data public class BizException extends RuntimeException { /** * 错误码 */ private String code; /** * 错误信息 */ private String msg; /** * 数据 */ private Object data; }
通过 @ExceptionHandler 统一处理被抛出的 BizException,代码如下:
通过上边的代码,我们可以看到,当遇到 BizException 的时候,Response 中的 status,会被重写为600。
客户端通过实现 feign.codec.ErrorDecoder 接口拦截 Response,将 status==600 的 Response 转化为BizException,代码如下:
服务端抛出 BizException 同时将该BizException转换为 status == 600 的 Response,客户端接收到 status == 600 的 Response 同时将此 Response 转换为 BizException,如下图:
下面将以 annoroad-alpha、annoroad-beta、annoroad-ms-spring-boot-starter 为例来进一步的说明下。
首先介绍下它们都是啥都:
被黑框框起来的部分对应「解决方案中的 2 」,如下图:
被黑框框起来的部分对应「解决方案中的 3 」,如下图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。