Spring 引导中的异常传播 - 微服务



如何在 Spring Boot 应用程序中将异常从一个微服务传播到另一个微服务。

例如:当我们进行休息调用时,我们会期望一些有效的响应。假设我们期待 Long 类型的响应。但是,如果从其他微服务引发异常,那么在调用微服务时应该如何捕获和处理它?

目前,我们在令牌对象中遇到反序列化问题。

我会使用@ControllerAdvice来捕获一个微服务中会发生的不同类型的异常,并发送 5XX 响应代码以通知其他服务它无法正确处理请求,因为使用响应代码进行讨论被认为是一种很好的做法。PFB 示例代码。

@ControllerAdvice
public class MicroserviceExceptionHandler {
@ExceptionHandler({ UserNotFoundException.class, ContentNotAllowedException.class })
public final ResponseEntity handleException(Exception ex, WebRequest request) {
String errorMessage = ex.getMessage();
return ResponseEntity(HttpStatus.NOT_FOUND)
.status(HttpStatus.FORBIDDEN)
.body(errorMessage);

但是,如果您的微服务需要发送整个堆栈跟踪而不仅仅是消息,请使用以下代码将堆栈跟踪转换为字符串并发送它而不是ex.getMessage()

StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String exceptionAsString = sw.toString();

如何在 Spring 中将异常从一个微服务传播到另一个微服务 启动应用程序。

微服务通过网络相互通信,通常是HTTP。因此,在微服务的边界,异常将转换为标准 HTTP 错误代码(对于客户端错误4XX、服务器错误5XX等(和可选错误消息。当你调用上游服务时,如果响应不成功(HTTP2XX(,你的消费者服务只需要寻找商定的错误代码/消息,并将其转化为有意义的操作(对消费者服务有意义(。

我建议你阅读 https://martinfowler.com/articles/microservices.html

我们所做的是:

  • 定义实体ErrorInfo和异常处理程序类。此外,我们还有一个将异常与状态代码相关联的ErrorCode。还有一个例外ServiceException使用ErrorCode.将这些类隔离到所有服务的共享库中。
  • 在依赖服务中,当抛出异常时,根据何时何地,我们为其定义一个具有特定状态代码的专用ErrorCode,并将其附加到ServiceException,然后抛出。
  • 在异常处理程序中,使用ServiceException中的ErrorCode和其他相关字段,我们定义一个包含错误原因、详细信息、消息等的ErrorInfo,并返回带有ErrorInfo正文和状态代码 4xx/5xx 的ResponseEntity
  • ,如ErrorCode所示。
  • 在调用方服务(使用相同的库(中,当状态代码为 4xx/5xx 时,将 body 解析/反序列化为ErrorInfo并构造相同的异常。并将其抛出给库中的同一异常处理程序,以ErrorInfo返回到前端。
  • 当出现任何问题时,FE/其他客户端始终可以期望ErrorInfo作为标准模板。它可以包含message/cause/...因此,i18n也可以轻松完成。

最新更新