[英]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
),您的消費者服務只需要查找商定的錯誤代碼/消息並將其轉換為有意義的操作(對消費者服務有意義)。
我們要做的是:
ErrorInfo
和一個異常處理程序類。 此外,我們有一個ErrorCode
,它將異常與狀態代碼相關聯。 以及使用ErrorCode
的異常ServiceException
。 將這些類隔離到所有服務的共享庫中。ErrorCode
並將其附加到ServiceException
,然后拋出。ErrorCode
等相關領域的ServiceException
,我們定義了一個ErrorInfo
錯誤原因的詳細信息,消息等,並返回ResponseEntity
與身體ErrorInfo
和狀態碼4XX / 5XX,按ErrorCode
。ErrorInfo
並構造相同的異常。 並為庫中的相同異常處理程序拋出它以作為ErrorInfo
返回到前端。ErrorInfo
作為標准模板。 它可以包含像message
/ cause
/... 這樣的字段,因此 i18n 也可以輕松完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.