聊聊springboot專案全域性異常處理那些事兒

2022-09-18 16:03:10 字數 3733 閱讀 9438

之前我們業務團隊在處理全域性異常時,在每個業務微服務中都加入了@restcontrolleradvice+@exceptionhandler來進行全域性異常捕獲。某次領導在走查**的時候,就提出了乙個問題,為什麼要每個微服務專案都要自己在寫一套全域性異常**,為什麼不把全域性異常塊抽成乙個公共的jar,然後每個微服務以jar的形式引入。後面業務團隊就根據領導的要求,把全域性異常塊單獨抽離出來封裝成jar。今天聊的話題就是關於把全域性異常抽離出來,發生的一些問題

之前團隊的業務錯誤碼定義是:業務服務字首 + 業務模組 + 錯誤碼,如果是識別不了的異常,則使用業務字首 + 固定模組碼 + 固定錯誤碼。

之前的全域性異常偽**如下

@restcontrolleradvice

@slf4j

public class globalexceptionbasehandler

log.error(msg, e);

return ajaxresult.error(msg, errorcode);

}}

現在全域性異常抽離出來後,那個業務服務字首如何識別?之前未抽離時,業務服務字首各個業務服務直接寫死在**裡。

public enum  serviceprefixenum 

public string getserviceprefix()

public string getservicedesc()

}

return serviceprefixenum.valueof(servicename).getserviceprefix();

}但這種方案其實是存在弊端

弊端一:通過列舉硬編碼,預設了目前了微服務名稱,一旦專案改變了微服務名,就找不到服務字首了。

弊端二:如果新上線了業務服務模組,這個列舉類還得改動

後面我們在全域性異常jar中增加了自定義業務碼的配置,業務人員僅需在springboot配置檔案配置,形如下

lybgeek:

bizcode:

prefix: u

此時全域性異常改造示例形如下

@restcontrolleradvice

@slf4j

public class globalexceptionbasehandler

log.error(msg, e);

return ajaxresult.error(msg, errorcode);

}}

如果全域性異常直接如下寫,是不存在問題。示例如下

}即全域性異常直接分為業務異常和execption這兩種,這樣劃分的弊端在於沒辦法細分異常,而且也使專案組定義的模組碼和業務碼沒法細分。因此我們也列出常用可以預知的系統異常,示例如下

/**

*引數驗證失敗

/*** 資料庫異常

/*** 資料庫中已存在該記錄

不過這樣導致了乙個問題,就是全域性異常和業務方使用相同的依賴jar,但存在版本差異時,可能就會存在依賴衝突,導致業務專案啟動報錯。因此解決方案就是在pom檔案加入optional標籤。示例如下

com.baomidou

mybatis-plus-boot-starter

true

這標籤的意思這jar座標是可選的,因此如果專案中已經有引入該jar的座標,就直接用該jar的座標

這個問題的產生:舉個示例,我們的業務微服務專案有聚合層,某些聚合層是不需要依賴儲存介質,比如mysql。因此這些聚合層專案pom就不會引入類似mybatis相關的依賴。但我們的全域性異常又需要類似mybatis相關的依賴,這樣導致如果要引用全域性異常模組,又得額外加入業務方不需要的jar。

因此springboot的條件註解就派上用場了,利用@conditionalonclass註解。示例如下

/*** 資料庫中已存在該記錄

}@conditionalonclass這個註解的作用就是如果classpath存在指定的類,則該註解上的類會生效。

同時這邊有個細節點,就是全域性異常可能就得細分,即把原來的大一統的全域性異常,按業務場景分開,比如儲存介質相關的儲存異常,web相關異常

本文主要講當將全域性異常抽離成jar,可能會發生的問題。這邊有涉及到一些細節點沒講,比如為啥要定義服務字首+業務模組碼+錯誤碼,其實主要還是為了好排查問題。

也許有朋友會問,你們都搞了微服務,難道不上分布式鏈路追蹤?根據分布式鏈路追蹤可以很方便定位到整個鏈路了。但真的開發微服務的時候,如果公司原來就就沒運維平台,有時候為了成本考量,測試、開發環境都不會上的分布式鏈路追蹤的,甚至線上專案初期也不會上分布式鏈路追蹤。因此定義好相關的業務碼就變得格外重要

聊聊專案管理

1 概念 pmp裡專案管理定義是 將知識 技能 工具與技術應用於專案活動,以滿足專案的要求。簡單的說,專案管理以知識 技能 工具與技術作為輪子,保證專案活動這輛車能預期到達目的地。光讀這句話還真不好理解專案管理,下面大衛哥稍微八一八專案管理,以便於大家理解。2 專案中管理活動和業務活動的區別 在整個...

聊聊全鏈路壓測

之前有和認識的同行聊過他們全鏈路壓測的一些技術實現方案,自己也看了很多相關的資料,這篇部落格,說說自己對全鏈路壓測的理解,以及整理的一些知識點。ps 主要羅列的是問題點,以及對應的一些解決方案,僅供參考。阿里全鏈路壓測 有讚全鏈路壓測 京東全鏈路壓測 餓了麼全鏈路壓測 滴滴全鏈路壓測解決之道 美團全...

springboot常用的註解 全

springboot的優點就不多做介紹了,只來談談springboot常用的註解,希望對朋友們有幫助。springboot的核心註解,用來開啟springboot的各項功能相當於 configuration componentscan enableautoconfiguration 指定要變成實現類...