通过多种服务抛出异常

时间:2017-11-17 10:24:01

标签: spring rest spring-boot microservices

我有一个微服务架构,有3个依赖服务。每个服务代表一个单独的Spring Boot项目。如果在体系结构的最低级别发生异常,我希望将其引导到所有其他服务,直到最高/用户端点服务。

每个服务API都会返回包含特定对象的 HttpEntity(响应实体)。我发现了许多可能的解决方案,例如 ResponseEntityExceptionHandlers ,但所有示例都针对单个服务架构显示,没有多个依赖服务。

是否有任何最佳实践如何通过Spring Boot通过多个服务抛出异常?

1 个答案:

答案 0 :(得分:1)

假设您有三个服务A(直接与B相关),b(直接与C相关),C和用户调用您的服务A,但它可以应用于任意数量的服务。

我将简要介绍一下方法

如果服务C中发生错误(抛出异常),则代码应捕获异常并返回有意义的响应。最简单的我能想到的是@ControllerAdvice

@ControllerAdvice
public class GlobalExceptionHandler {

      @ExceptionHandler(YourException.class)
      public ResponseEntity<ApiErrorDto> handleYourException(YourException e) {
      return ResponseEntity
            .status(HttpStatus.BAD_REQUEST) //or any other suitable 
            .body(new ApiError(e.getMessage());
     }
}

ApiError可能只是一个基本的POJO类,其中包含一个包含消息的字段,或者对您的异常处理有意义的任何其他字段。

现在,当您的服务B收到响应时,它应该检查它是否是预期的状态代码或错误状态代码并采取相应的行动。

您的ApiError课程应该在所有服务之间共享,以便可以在任何地方轻松地序列化/反序列化。这样,一旦收到错误,您可以决定下一步该做什么,其中一个场景可能会抛出另一个异常,以便在服务B中被ExceptionHandler捕获。

它是首发,您可以决定是否要在ApiError中返回字符串消息,或者可能是某种有意义的代码等。底线是您应该将该信息包含在发生错误的服务的响应,并在调用服务中解释该信息。