如何在Spring Boot应用程序中将异常从一个微服务传播到另一个微服务。
例如:当我们进行一次休息呼叫时,我们会期望得到一些有效的响应。假设我们期望Long类型的响应。但是,如果另一个微服务抛出了Anh异常,那么在调用微服务时应如何捕获和处理该异常。
当前,我们在令牌对象中遇到反序列化问题。
答案 0 :(得分:1)
如何在春季将异常从一个微服务传播到另一个微服务 启动应用程序。
微服务通过网络相互通信,通常是HTTP。因此,在微服务的边界处,异常将转换为标准HTTP错误代码(对于客户端错误4XX
,对于服务器错误5XX
等)和可选错误消息。当您调用上游服务时,如果响应不成功(HTTP2XX
),则您的消费者服务只需要查找关于错误代码/消息的约定并将其转换为有意义的动作(对消费者服务有意义) )。
答案 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
上并进行抛出。 ErrorCode
和ServiceException
中的其他相关字段,我们定义一个带有错误原因,详细信息和消息等的ErrorInfo
,然后返回{{1} },其主体为ResponseEntity
,状态代码为4xx / 5xx(根据ErrorInfo
)。ErrorCode
并构造相同的异常。并将其扔给库中相同的异常处理程序,以ErrorInfo
的形式返回前端。ErrorInfo
作为标准模板。它可以包含ErrorInfo
/ message
/ ...之类的字段,因此i18n也可以轻松完成。