簡體   English   中英

Spring Boot 中的異常傳播 - 微服務

[英]Exception propagation in spring Boot - microservice

如何在 Spring Boot 應用程序中將異常從一個微服務傳播到另一個微服務。

例如:當我們進行 get rest 調用時,我們會期待一些有效的響應。 假設我們期待 Long 類型的響應。 但是,如果另一個微服務拋出了 Anh 異常,那么在調用微服務時應該如何捕獲和處理它。

目前我們在令牌對象中遇到反序列化問題。

我會使用@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 Boot 應用程序中將異常從一個微服務傳播到另一個微服務。

微服務通過網絡相互通信,通常是 HTTP(s)。 因此,在微服務的邊界處,異常將轉換為標准 HTTP 錯誤代碼(對於客戶端錯誤4XX ,對於服務器錯誤5XX等)和可選錯誤消息。 當您調用上游服務時,如果響應不成功( HTTP2XX ),您的消費者服務只需要查找商定的錯誤代碼/消息並將其轉換為有意義的操作(對消費者服務有意義)。

我建議你閱讀https://martinfowler.com/articles/microservices.html

我們要做的是:

  • 定義一個實體ErrorInfo和一個異常處理程序類。 此外,我們有一個ErrorCode ,它將異常與狀態代碼相關聯。 以及使用ErrorCode的異常ServiceException 將這些類隔離到所有服務的共享庫中。
  • 在依賴服務中,當拋出異常時,根據何時何地,我們為它定義一個專用的帶有特定狀態碼的ErrorCode並將其附加到ServiceException ,然后拋出。
  • 在異常處理程序,使用ErrorCode等相關領域的ServiceException ,我們定義了一個ErrorInfo錯誤原因的詳細信息,消息等,並返回ResponseEntity與身體ErrorInfo和狀態碼4XX / 5XX,按ErrorCode
  • 在調用者服務中(使用相同的庫),當狀態碼為 4xx/5xx 時,將 body 解析/反序列化為ErrorInfo並構造相同的異常。 並為庫中的相同異常處理程序拋出它以作為ErrorInfo返回到前端。
  • 當出現任何問題時,FE/其他客戶端始終可以將ErrorInfo作為標准模板。 它可以包含像message / cause /... 這樣的字段,因此 i18n 也可以輕松完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM