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

技術小能手發表於2018-07-17

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

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

根據螞蟻金服開放平臺的標準返回,一個 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( () -> {} )

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

原文釋出時間為:2018-07-17
本文作者:大蕉
本文來自雲棲社群合作伙伴“Java後端技術”,瞭解相關資訊可以關注“Java後端技術”。


相關文章