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

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

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

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

1、isSuccess 調用是否成功

2、data 返回的響應數據

3、errorCode 錯誤碼

4、errorMsg 錯誤信息

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

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

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

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

上面兩種模式都可以實現標準的 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( () -> {} ) 

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

那如何學習才能快速入門並精通呢?

當真正開始學習的時候難免不知道從哪入手,導致效率低下影響繼續學習的信心。

但最重要的是不知道哪些技術需要重點掌握,學習時頻繁踩坑,最終浪費大量時間,所以有一套實用的視頻課程用來跟著學習是非常有必要的。

為了讓學習變得輕鬆、高效,今天給大家免費分享一套阿里架構師傳授的一套教學資源。幫助大家在成為架構師的道路上披荊斬棘。

這套視頻課程詳細講解了(Spring,MyBatis,Netty源碼分析,高併發、高性能、分佈式、微服務架構的原理,JVM性能優化、分佈式架構)等這些成為架構師必備的內容!

而且還把框架需要用到的各種程序進行了打包,根據基礎視頻可以讓你輕鬆搭建分佈式框架環境,像在企業生產環境一樣進行學習和實踐。

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

後臺私信回覆 “ 架構 ” 就可以馬上免費獲得這套價值一萬八的內部教材!


分享到:


相關文章: