在调用代码中捕获 Feign 客户端的错误状态并在上游报告错误

Posted

技术标签:

【中文标题】在调用代码中捕获 Feign 客户端的错误状态并在上游报告错误【英文标题】:Catch error state of a Feign client in calling code and report error upstream 【发布时间】:2019-11-26 02:34:48 【问题描述】:

我有一个 REST 控制器,它通过 Feign 客户端触发下游 REST 调用。当下游发生任何类型的错误(错误回复、超时等)时,我想知道原因并生成带有错误数据的 REST 回复,如下所示:

client --> my /auth @RestController
                          |
                          | --- downstream Feign client REST call to check auth --> |
                                                                                    |
                          | <--------------- faulty reply or time out --------------|
<-- graceful error reply--|           

设置 Feign Client 及其调用代码以接收 Hystrix / Feign 错误状态以产生“优雅的错误回复”的最佳方法是什么?

我使用 Spring Boot 2。

【问题讨论】:

恕我直言,您应该使用全局异常处理程序来捕获异常并使用用户定义的字段返回响应(成功/错误)。 您可以使用ErrorDecoder 来处理调用方站点上的异常,另一方面,只需返回一个ResponseEntity,并使用@ControllerAdvice 创建一个ResponseEntityExceptionHandler @zlaval 你能详细说明“只返回一个响应实体”吗? 晚上我有时间创建一个小 poc,但是直到:GetMapping("/myurl") public ResponseEntity> myMethod() 然后你可以创建一个新的 ResponseEntity 对象其中包含数据和状态代码。在应用程序中,当发生错误时,只需抛出一些自定义异常,您的控制器通知将捕获它,打包成正确的形式并返回该值,而不是您在控制器的 get 方法中创建的值。 【参考方案1】:

请查看this part 的文档。 通过创建 Feign 接口的FallbackFactory&lt;&gt;,您可以捕获异常、处理它并返回默认值。 您可以返回ResponseEntity&lt;&gt;,而不是返回您的对象,这使您可以更好地控制要返回的内容,例如。 ResponseEntity.notFound().build().

希望对您有所帮助! :)

【讨论】:

以上是关于在调用代码中捕获 Feign 客户端的错误状态并在上游报告错误的主要内容,如果未能解决你的问题,请参考以下文章

Java Feign 客户端后备 - 无法调用后备

feign服务端出异常客户端处理的方法

Feign 客户端调用错误

Feign REST Client:如何获取 HTTP 状态?

Ribbon 和 Feign 的区别

Feign 自定义 ErrorDecoder (捕获 Feign 服务端异常)