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
1、在错误码解析器中,如果将异常信息String转换为Exception类,().fromJson(errorContent, );捕获到的是
UndeclaredThrowableException,异常信息在1处,不在2处,此时打印异常信息e为null。
如有错误,烦请指正,谢谢!


发布评论