最近對一個老的系統進行重構,有些感觸,寫出來做個總結
重構的原則
保證和第三方的交互接口沒有變化,保證新系統上線后,第三方不需要任何改動就可以使用新系統
新系統的功能不能少于老系統正在使用的功能
修正老系統中存在的bug,優化性能
溝通
盡可能的拿到新系統的相關資料
和熟悉業務的開發,測試,項目經理等溝通,熟悉業務
使用老系統,加深對老系統的了解
列出所有需要重構的功能,初步和相關人員達到一致
在本地運行要重構的工程
部署本地的開發環境,包括數據庫,依賴的第三方服務
閱讀別人的重構
拿到源代碼,查看依賴jar和配置文件,了解老系統使用了哪些框架,使用了什么服務
在本地運行老系統代碼,一一運行重構功能,通過系統日志,加深對系統的了解
找出系統的核心業務的代碼入口,從這一部分開始閱讀代碼。在讀的過程中自動會延伸到其它相關的模塊。把這些核心模塊閱讀完成后,一般基本重構功能就看七七八八。最后把剩余的功能看完
在看的過程,需要做以下事情
如果對業務有疑問,隨時和業務熟悉的人員進行交流。如果當時就能確認最好,如果不能,則進行記錄。這些疑問等你讀完代碼后,再回頭看,基本都能明白
看代碼時,會發現老系統中存在的bug,先記錄下來
看代碼時,會產生如何改進系統的想法,這些想法也先記錄下來
重構的內容
依賴jar升級
盡量升級依賴jar包到相應的最新的穩定包
對外服務使用了webservice,則相關服務的jar包盡量不要升級。如使用axis2等webservice做為對外服務,如果沒有安全的問題,盡量不要升級jar包
JDK升級
老系統的JDK一般比較低。在開發前,和運維溝通,能否對現在的JDK進行升級。如果能,那最好
完善系統架構
對現有的服務部署構架進行完善:每個服務(包括做轉發的Ngnix,業務服務)至少保證有兩臺,并且分布到2臺服務器上。
盡量保證每個服務是無狀態,這樣可以保證系統易于水平擴展
重構:保證代碼質量
重復的代碼合并:通過抽象類,工具類等解決
魔法數字和1,2,3等狀態數據轉化為常量值或枚舉值
加強對異常數據的安全處理,避免拋出空指針、數組越界等問題
修正bug:
a.隱藏bug,
b.修正已知但是之前因為各種原因無法修復的問題
相同的數據配置只需要一份,不要多份
功能擴展:第三方調用我們的接口的重要數據入庫,調用第三方接口的結果入庫
提高高頻率接口的執行速度
a. 短信回執接口從1s降低到10ms(建立表索引)
b. 訂購關系接口執行時間從250s降低到xxms(建立表索引)
程序依賴第三方服務的關系處理
外部服務
不可以修改和第三方交互的接口參數,必需和原來保持一致
對外的服務IP和URL保持不變
內部服務
和服務者開發者直接進行溝通,如果搞不定,可以請領導協調
提高安全性
增加的白名單IP,只有指定的IP可以訪問服務
代碼中增加對請求參數的校驗
提高運維工作量,更早發現存在的問題
上報程序狀態到運維平臺(如程序是否關閉,啟動)
上報程序關鍵信息到運維平臺(如業務邏輯處理異常,執行關鍵方法花費的時間等)
數據庫
原來系統數據和別的服務共用表,現在將數據獨立出來,并對數據進行清理,刪除異常數據
對大表進行清理,將2016年及之前的數據移出當前的表,備份到別的表中
增加適當數據庫索引
為了解決一些歷史的BUG,可能需要在數據庫中增加新字段或新表
制定重構計劃
完善重構功能列表:對系統非常熟悉后,對之前的重構的功能列表進行補充
制定開始計劃
對項目的中的風險點進行備案,后期開發測試需要重點注意的地方
和相關人員評審重構計劃
測試
測試
a. 開發,測試,項目經理等人溝通設計測試用例,覆蓋
b. 測試的范圍要細,測試一個功能時,要檢查以下信息
檢查客戶端:是否和預期的相同(如收到短信)
檢查服務端:數據庫的值是否和預期相同
檢查第三方數據:第三方返回的值是否和預期相同,需要請第三一起配合測試
測試異常數據(如發送短信)
測試人員非常重要,需要有足夠的耐心對所有的場景進行測試;需要有
c. 本地測試
搭建本地測試環境
使用測試工作模擬調用接口測試(如SOAPUI)
在測試工具中建立常用場景進行測試
用代碼寫一個客戶端,對常用交互場景進行自動化測試
本地環境測試,使用真實數據模擬調用接口測試
d. 線網測試
第一步:在線網部署新程序。如果程序需要向第三方推送數據,則需要啟動一個新的服務模擬第三方服務,此程序中和模擬第三方程序推送數據。攔截服務的流量,即向生成環境推送,又向新程序推送。運行一段時間后,然后比較兩個程序的產生數據的區別以及各種是否正常運行
第二步:在線網部署新程序,此時程序調用真正的第三方。攔截服務的流量,只將我們測試的請求推送到新程序。
第三步:在線網部署新程序。找一個關系好的接入方,和他們溝通,將他們的一部分流量推送到新服務,請他們確認新服務和他們交互的數據是否正常。等多次測試沒問題,可以將他們的流量全部推送到新服務。然后找下一個接入方按照以上流程依次處理。
第四步:所有服務遷移到新程序后,舊服務停止
e. 壓力測試
在線網測試的后期,等確認基本功能無誤后,需要同時進行壓力測試
f. 灰度發布
建立灰度發布的機制