關於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
- setsockopt()改善程式的健壯性
- 論程式的健壯性——就看RedisRedis
- 用Flow提升前端健壯性前端
- 如何保障物聯網平臺的安全性與健壯性
- 論怎麼提高程式的健壯性
- 百度關於互聯互通的思考與實踐
- 關於Java棧與堆的思考Java
- 如何提高nodejs程式的穩定性,健壯性NodeJS
- 使用 CSS perfer-* 規範,提升網站的可訪問性與健壯性CSS網站
- 關於效率、程式與生活的一些思考
- 關於Netty的一些理解、實踐與陷阱Netty
- CodeReview--提高程式碼健壯性View
- 從部署架構提高系統健壯性架構
- 淺析:setsockopt()改善socket網路程式的健壯性
- 關於主資料的實踐和思考
- Data Guard 健壯性查詢必背彙總
- 如何編寫健壯的程式
- 關於Web靜態資源快取自動更新的思考與實踐Web快取
- 關於CodeReview的一些思考View
- 關於 Masonry 的一些思考(下)
- 關於 教育孩子的 一些思考
- 關於程式碼的一些思考
- 關於效能優化的一些實踐優化
- 關於C# Span的一些實踐C#
- java疫苗之殤?關於java類載入器的一些思考Java
- 寫出健壯的Bash指令碼指令碼
- Java 理論與實踐: 關於異常的爭論Java
- 關於目標的一些思考
- 飛豬基於 Serverless 的雲+端實踐與思考Server
- Go 函式的健壯性、panic異常處理、defer 機制Go函式
- 關於賬號安全的一些思考
- Java關於空指標的防範與思考Java指標
- 使用Go實現健壯的記憶體型快取Go記憶體快取
- 關於序列化與反序列化的一些思考
- 健壯高效的小程式登入方案
- 關於前端的思考與感悟前端