如何在 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
,如 - 在调用方服务(使用相同的库(中,当状态代码为 4xx/5xx 时,将 body 解析/反序列化为
ErrorInfo
并构造相同的异常。并将其抛出给库中的同一异常处理程序,以ErrorInfo
返回到前端。 - 当出现任何问题时,FE/其他客户端始终可以期望
ErrorInfo
作为标准模板。它可以包含message
/cause
/...因此,i18n也可以轻松完成。
ErrorCode
所示。