2023年11月29日发(作者:)

SpringCloud组件OpenFeign——将服务端异常信息返回给客

户端

⼀、场景

最近使⽤单位封装的微服务架构搭建微服务项⽬,封装的不太多,⼤部分可以按原⽣的SpringCloud组件的使⽤⽅式使⽤。涉及到的组件有

Nacos、Ribbon、OpenFeign、Hystrix、Sentinel。领导让搭建微服务项⽬,并且不使⽤Hystrix和Sentinel做服务熔断和降级,即客户

端通过OpenFeign调⽤服务端服务,如果服务端异常直接返回给客户端,客户端能够捕获并打印出异常信息。

⼆、模拟服务端异常

先让服务端产⽣⼀个算数异常并抛出,看⼀下正常情况下客户端会怎么样。

客户端代码

TestErrorController

@RestController

@RestController

@RequestMapping("/test")

public class TestErrorController {

private static HLogger logger = ger();

/**

* 测试异常

*/

通过上⾯⽇志可以看出,服务端⽇志显⽰是算数异常并且告诉我们是因为 / by zero。但是查看客户端打印的⽇志发现,捕获并打印的异常

信息是xception$InternalServerError: status 500 reading TestErrorFeignService#testError()。客户端通过

OpenFeign调⽤服务端异常,客户端产⽣的是状态码为500的FeignException告诉我们在调⽤TestErrorFeignService这个Feign接⼝的

testError()⽅法时产⽣的异常。很明显这并不能满⾜我的需求,并没有把服务端具体的异常原因打印出来。

解决⽅式

@RestController

@ControllerAdvice

public class GlobalExceptionHandler {

private static HLogger log = ger();

/**

* @description: 捕获⾃定义业务异常

*/

默认使⽤内部类Default的decode解码。

@Configuration

public class FeignClientErrorDecoder implements ErrorDecoder {

private static HLogger log = ger();

private static ThreadLocal gson = itial(() -> new Gson());

1、在错误码解析器中,如果将异常信息String转换为Exception类,().fromJson(errorContent, );捕获到的是

UndeclaredThrowableException,异常信息在1处,不在2处,此时打印异常信息e为null。

如有错误,烦请指正,谢谢!