1. 程式人生 > >關於Java健壯性的一些思考與實踐

關於Java健壯性的一些思考與實踐

try 所有 arraylist 策略 img executor 自動化 其他 返回

程序健壯性非常重要,要怎麽玩怎麽寫才能讓程序更加魯棒呢?我又這麽幾點小建議。

一、進行統一的業務處理響應

根據螞蟻金服開放平臺的標準返回,一個 response 至少應當有4個返回值。

1、isSuccess 調用是否成功

2、data 返回的響應數據

3、errorCode 錯誤碼

4、errorMsg 錯誤信息

這就要求我們的接口要有標準的統一的 response ,那怎麽實現呢?

1、Spring 切面, JDK 動態代理,Cglib 動態代理等用代理類實現

2、匿名子類,使用一個公共的 Executor 來負責處理所有的請求。

技術分享圖片

上面兩種模式都可以實現標準的 response 的封裝,那麽具體要封裝哪些東西呢?其實最主要的就是統一的 try catch,防止出現任何的 500 錯誤給到調用方。

------ 為什麽要在最外層去完成呢?------

因為 500 錯誤對於調用方來說是致命而且是毫無價值的,無論調用方是前端還是其他的業務系統

------ 設定統一的錯誤碼 ------

參數錯誤 PARAMETER_ERROR

數據庫錯誤 DATABASE_ERROR

外部系統錯誤 OUTER_SYSTEM_ERROR

如果有了上面的這些錯誤碼以及錯誤信息,業務方至少可以告知用戶究竟發生了什麽事,也可以設定一些列的告警以及自動化運維的方式來處理這些錯誤。

二、參數檢查

在進行真正的邏輯處理前,應當對入參進行一系列的校驗,以保持後續業務處理邏輯的輕量,這也是 fast fail 思想的指導,有錯誤盡早結束處理。

具體是怎樣的呢?我們假設參數為 m.

 
if( null == m ){return ;} 

進行空判斷,防止後續滴啊用m發生 NullPointerException,但這裏也不建議拋出NPE,因為看到日誌也會很迷惑。

 
if( StringUtils.isEmpty( m ) ){return ;} 

字符串是否為空串

 
if( CollectionUtils.isEmpty.isEmpty( m ) ){return ;} 

集合是否為空或者null

 
try{ JSON.parseObject( m ); return true; } catch(JSONExceptin e){ return false; } 

判斷字符串是否為 JSON 格式

三、重試機制

對於特定的外部系統錯誤,可以嘗試多次重試這種策略,當然這也是簡歷在對方的服務是冪等的前提下。這樣做在某些網絡不穩定的情況下可以提高響應成功率。

四、冪等機制

什麽叫冪等?意思就是 無論何時何處何人,只要是先攻的請求,就應當有相同的響應,直到到達終態。

這個原則並不關註上一次的執行結果,企鵝本次結果不應當因為上一次請求的部分成功或者失敗而導致某些中間狀態不一致導致請求失敗。

五、Lambda

 
Optionl.of( target ) .getOrElse( new ArrayList() ) .filter( Object::NotNull) .forEach( () -> {} ) 

這種寫法可以確保絕大部分的異常不出現,特別是在對於集合進行處理的時候,因為集合中只要有其中一個值是會導致程序失敗的,整個程序都會報錯。這樣寫因為對數據做了比較多的檢查和兼容,所以出現錯誤的概率會比較低,但也會有一個弊端,就是當這樣的程序都出現異常的時候,開發者一般不知從何查起,要定位出是哪行數據就已經很費勁了。

在此我向大家推薦一個Java架構群 :725633148 裏面會分享一些資深架構師錄制的視頻錄像:(有Spring,MyBatis,Netty源碼分析,高並發、高性能、分布式、微服務架構的原理,JVM性能優化、分布式架構)等這些成為架構師必備的知識體系 進群馬上免費領取,目前受益良多!

關於Java健壯性的一些思考與實踐