關於Java健壯性的一些思考與實踐!
程式健壯性非常重要,要怎麼玩怎麼寫才能讓程式更加魯棒呢?我又這麼幾點小建議。
一、進行統一的業務處理響應
根據螞蟻金服開放平臺的標準返回,一個 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後端技術”。
相關文章
- 關於對健壯性程式碼的理解
- 基於介面資料變異的App健壯性測試實踐APP
- 論程式的健壯性——就看RedisRedis
- 用Flow提升前端健壯性前端
- 如何保障物聯網平臺的安全性與健壯性
- 百度關於互聯互通的思考與實踐
- 論怎麼提高程式的健壯性
- 關於主資料的實踐和思考
- 關於CodeReview的一些思考View
- 健壯性測試工具-stress-ng
- 使用 CSS perfer-* 規範,提升網站的可訪問性與健壯性CSS網站
- java疫苗之殤?關於java類載入器的一些思考Java
- 關於 Masonry 的一些思考(下)
- 關於效能優化的一些實踐優化
- 關於C# Span的一些實踐C#
- Python 系列:如何提高 python 程式程式碼的健壯性Python
- Java關於空指標的防範與思考Java指標
- 關於賬號安全的一些思考
- 飛豬基於 Serverless 的雲+端實踐與思考Server
- 關於序列化與反序列化的一些思考
- 關於 12306 售票的一些思考研究
- 關於aspnetcore中介軟體的一些思考NetCore
- 關於微服務劃分的一些思考微服務
- 關於Code Review的一些思考總結View
- 關於作業系統的一些思考作業系統
- 關於REACT正規化的一些思考React
- 關於近源滲透的一些思考
- 關於限流實現的思考
- Bool型SSRF的思考與實踐
- 在 Vue 中使用 TypeScript 的一些思考(實踐)VueTypeScript
- 視覺化搭建的一些思考和實踐視覺化
- 關於RxJava在業務上的一些思考RxJava
- 關於許可權系統的一些思考
- 關於2021年的一些收穫和思考
- 關於研發規範化的一些思考
- 近期關於快取設計的一些思考快取
- Java Record 的一些思考 - 序列化相關Java
- 基於 GraphQL 實踐的一點思考