Spring Boot中的异常传播-微服务

时间:2018-09-06 15:20:24

标签: spring spring-boot microservices

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

例如:当我们进行一次休息呼叫时,我们会期望得到一些有效的响应。假设我们期望Long类型的响应。但是,如果另一个微服务抛出了Anh异常,那么在调用微服务时应如何捕获和处理该异常。

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

3 个答案:

答案 0 :(得分:1)

  

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

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

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

答案 1 :(得分:1)

我将使用@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();

答案 2 :(得分:0)

我们要做的是:

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