大家好,我是Z哥。
應該有不少程序員受過這樣的困擾,特別是做后端的。項目一直在持續不斷的迭代,但是呢老版本的代碼還不能直接刪掉,因為不一定所有的調用端都能在同一時間點完成升級。
你是怎么處理這種情況的呢?
方法上增加參數?方法實現里增加if else?
論難度的話,這個問題是不難,肯定每個人都有辦法解決。但是解決的是否優雅?是否會給后續帶來更大的成本?有這考慮的人可能就不多了。
我看到過一些項目里做兼容的方法是真的粗暴,直接懟if else。
比如,原本創建一筆交易的時候,我們需要的數據是用戶的姓名、收貨地址、郵編。現在迭代的一個新版本需要增加手機號信息,并且不需要郵編了。
粗暴的寫法怎么寫呢?
if(postData != null ){
if(postData.mobile != null){
//新版本的處理方式
}
else{
//舊版本的處理方式
}
}
如果以后再新加了一個參數呢?if else再多嵌套一層……
你見過類似上面那樣的代碼嗎?
這可能是最容易想到的改法,但針對向前兼容不僅僅只有這一種方式。容我一個個來說。
/01 通過接口上增加版本號/
最常用的增加版本號的方式是直接加到接口上。比如,
http://api.xxx.com/1/user/login
如果后續的改動完全是新業務的追加,那么可以繼續沿用這個1版本的接口。如果有做刪減,那么可以新增一個版本2的接口,調整后的業務邏輯在這個版本的接口里實現。
http://api.xxx.com/2/user/login
這樣一來,你的項目中就同時存在了兩個版本的接口。新的客戶端調用2版本的,老的客戶端調用1版本的。
在這個期間,讓客戶端盡快都升級到2版本,然后后續就把1版本的接口刪掉。
有的人有代碼潔癖,覺得一個項目里同時存在兩個相同業務邏輯的接口不太舒服,那么可以試試下面這個方法。
/02 一個前端版本對應一個后端版本/
與上面的區別就是,在項目的代碼里,你不用新增加一個接口出來,直接把原先的接口修改成新的業務邏輯即可。
但是呢,新版本上線的時候,老版本不能被全部替換掉,需要保留一段時間給舊版本的客戶端使用。這件事的邏輯與前面一樣,給客戶端一段時間來升級。
其實所謂的「服務發現」或者說「服務治理」就是這類思想的體現,只是玩的更加體系化。
在服務發現的服務端,針對不同的服務本身就有版本的概念,比如:
OrderService/v1 : 192.168.0.1:8000 , 192.168.0.1:8001
OrderService/v2 : 192.168.0.1:8100 , 192.168.0.1:8101
UserService/v1 : 192.168.0.1:9000 , 192.168.0.1:9001
UserService/v2 : 192.168.0.1:9100 , 192.168.0.1:9101
……
客戶端調用的時候,根據其傳入的版本號,自動路由到對應版本的服務目標地址。
當然這個方案有一個問題是,由于產生環境同時運行著多個版本的程序,所以數據庫的字段只能增加,不能刪除,并且增加的字段需要給上默認值。
刪除字段只能隨著后續舊版本的去除進行。
除了以上兩種方案外,我們還可以做一些其他的工作以保障向前兼容更好地進行。
/01 數據庫設計預留擴展字段/
我們在設計數據表的時候,如果對后續業務預判會擴展。那么可以在做數據表設計的時候預留幾個擴展字段(ext1,ext2,ext3,……)。
這樣的話配合上面提到的方案2能更好地進行,因為后續新增的字段可以暫時存在這些擴展字段里,不需要對表結構作出變更。
/02 App提供強制更新功能/
如果是針對APP的向前兼容,那么務必在APP里留出一個強制更新的口子。以免有些用戶長期不升級,導致你的舊版本遲遲無法去除。
針對你可以承受的多版本情況,可以給予提示性的更新提醒,由用戶自行選擇是否更新。如果針對少數隔了多個版本還未升級的用戶,可以給出強制性的更新,讓其無法繼續在舊版本上操作。
強制更新也分局部更新和全量更新?,F在針對局部更新的「熱更新」受到了一些應用市場的限制,所以在用「熱更新」之前謹慎了解對應平臺的規則。
另外,向前兼容不可能是無止境,不丟掉一些包袱,不斷的新增包袱只會讓后續的維護成本不堪重負。
所以需要做好對各個版本使用情況的監控,一旦某個版本的使用量低于某個值,就應該給予強制更新的提醒。
其實類似的向前兼容問題,除了api之外,在對外提供的三方庫SDK、公司內給其他項目調用的二方庫SDK中,也有一樣的情況。
他們的解決思路也是類似的。
最后我建議你多看一些知名的開源項目,從中你可以學到很多優雅的編程技巧和代碼設計理念。
好了,總結一下。
這篇呢Z哥和你分享了軟件向前兼容的一些方法。除了粗暴的if else之外,你可以嘗試一下以下兩種方法:
- 通過接口上增加版本號
- 一個前端版本對應一個后端版本
除此之外,以下這兩件事也對做好向前兼容有很大幫助。
- 數據庫設計預留擴展字段
- APP提供強制更新功能
希望對你有所幫助。
不要光顧收藏,記得用起來哦。