如何正確使用上線部署,泳道、預發(fā)布到底如何理解?
一、背景
如今互聯(lián)網,隨著業(yè)務需求迭代快速,同一個服務可能存在多個同時開發(fā)和測試的功能,容易發(fā)生資源搶占分支互相沖突影響的問題,降低開發(fā)測試效率。
同時微服務架構下,一個功能可能需要依賴多個服務。在測試其中一個服務的改動時,如果依賴的服務發(fā)生了改動或者故障,也會影響這個功能的測試。
......
以上種種問題情況,都會導致服務從測試到線上正式環(huán)境的環(huán)境差異性較大。
規(guī)范上線部署流程,通過對環(huán)境的隔離來剝離耦合型風險,便于問題暴露及快速解決。
圖片
二、預發(fā)布環(huán)境
2.1 介紹
預發(fā)布環(huán)境 Staging,即線上環(huán)境、正式生產環(huán)境。
為避免因為測試環(huán)境和線上環(huán)境的差異性等帶來的缺陷漏測而設立的一套環(huán)境。其配置等基本和線上一致,只是預發(fā)布環(huán)境web服務器不在線上集成服務器范圍之內,為單獨的一臺機器。
預發(fā)布環(huán)境 也算是線上/正式生產環(huán)境,只是其具有特殊的隔離特性(包括網絡/數(shù)據/用戶/行為等),不能被線上用戶訪問。
2.2 預發(fā)布環(huán)境 vs 灰度環(huán)境
預發(fā)布環(huán)境 | 灰度環(huán)境 | |
目標 | 正式發(fā)布之前進行最后的測試和準備工作,確保產品穩(wěn)定可靠 | 在產品正式發(fā)布之前對用戶進行試用,收集反饋和觀察市場反應 |
范圍 | 涉及整個產品,所有功能和特性都會進行全面測試 | 僅涉及一小部分用戶,為了控制風險和規(guī)??煽?/p> |
時間點 | 預發(fā)布通常在正式發(fā)布之前的最后階段進行,通常會有一個明確的時間表 | 灰度發(fā)布在預發(fā)布之后,但在正式發(fā)布之前的任何時間進行,其持續(xù)時間可以根據反饋和調整的需要而定 |
網絡 | 與生產隔離 | 與生產一致 |
隔離性 | 真實用戶無法訪問 | 真實用戶可訪問 |
2.3 變更操作
Q:如果新版本程序需要更改表結構等(eg. 加個表字段),那么,部署到預發(fā)布環(huán)境時也需要更改表字段,這個可能會影響線上環(huán)境程序代碼的運行,如何解決?
圖片
1)把預發(fā)布環(huán)境使用的數(shù)據庫切換為測試環(huán)境使用的數(shù)據庫;
2)根據實際部署過程,如果有必要,可有針對性的測試下數(shù)據庫的變更是否會影響線上當前代碼程序的運行;
3)把新代碼部署到預發(fā)布環(huán)境,測試程序是否正常運行;
4)預發(fā)布測試完畢,如果沒問題,先上線數(shù)據庫(即在正式環(huán)境執(zhí)行對應的數(shù)據庫變更操作);
5)把預發(fā)布環(huán)境連接的數(shù)據庫切換為線上環(huán)境使用的數(shù)據庫,再次進行預發(fā)布環(huán)境的測試;
6)如果預發(fā)布環(huán)境測試通過,則把預發(fā)布環(huán)境的代碼部署到線上生產環(huán)境。
三、多泳道部署
3.1 介紹
多泳道部署(Multi-lane Deployment)是一種部署策略。
當指定某泳道發(fā)布服務時,發(fā)布系統(tǒng)會為該服務的實例打上相應的泳道標記,服務注冊和發(fā)現(xiàn)模塊就能知道同一服務的不同實例所屬的泳道。
圖片
所謂泳道,可以理解為多個并行且相互隔離的調用鏈,彼此調用互不影響,就如同泳池里的泳道一樣。這種策略可以提高系統(tǒng)的可用性和容錯性,因為如果一個泳道出現(xiàn)問題,其他泳道仍然可以正常運行。
除了創(chuàng)建出來的泳道之外,還會存有一條默認的主干道,為各個服務提供默認實例,可以將其理解為常規(guī)的、常備的測試環(huán)境。除了創(chuàng)建的泳道外,還會存在一條默認的主干道,提供各個服務的默認實例,可以理解為常規(guī)、常備的測試環(huán)境。
3.2 端到端的統(tǒng)一
1)在服務 A 需對服務 B 進行訪問之時,服務 A 會率先于服務發(fā)現(xiàn)模塊當中獲取服務 B 實例的地址。鑒于服務 A 在請求中添加了 t2 泳道的標識,此時服務發(fā)現(xiàn)模塊將會從服務 B 處于 t2 泳道的實例之中選取其一進行返回,隨后服務 A 便可直接對相應實例予以訪問。
2)移動端和 web 端團隊需要配合做相應的改造。測試時,移動端和 web 端的測試人員能夠自行切換至指定泳道,切換完畢后,所有發(fā)送至服務端的請求都會帶上相應的泳道標記,這樣泳道測試就實現(xiàn)了端到端統(tǒng)一。
圖片
泳道 主要解決的問題:
- 解決資源搶占,提高研發(fā)效率
- 保證測試環(huán)境的穩(wěn)定性
3.3 實現(xiàn)思路
實現(xiàn)多泳道部署,主要思路包括以下幾點:
1、環(huán)境準備
首先,需要準備多個獨立的環(huán)境,這些環(huán)境可以是物理服務器,也可以是虛擬機或容器。不同的需求需要隔離級別不同,如果多環(huán)境共用底層數(shù)據,則代碼中使用域名配置數(shù)據庫,由 DNS 服務指向同一套數(shù)據庫。
多數(shù)情況下,泳道還是采用的底層共用數(shù)據存儲,好處是每次新創(chuàng)建分支用不到不用再創(chuàng)建數(shù)據庫和同步數(shù)據,大大提高了環(huán)境申請和銷毀效率。對于自動化測試等需要數(shù)據隔離的,我們則另外部署一套全鏈路環(huán)境。
2、配置管理
每個泳道可能需要不同的配置,例如數(shù)據庫連接字符串、第三方服務的API密鑰等。你需要一個配置管理系統(tǒng)來管理這些配置,并確保它們在部署時被正確地應用到每個泳道。
邏輯結構主要分為主泳道和分支泳道
主泳道部署全鏈路穩(wěn)定代碼,作為公共環(huán)境,承載其他環(huán)境缺省服務,保證請求鏈路通暢。
分支泳道只需部署改動或增量服務,未改動服務使用主泳道中服務,減少公共服務的維護成本,提高使用效率等。
3、部署策略
你需要決定如何將應用程序部署到各個泳道。你可以選擇一次部署到所有泳道,也可以選擇逐個部署。
逐個部署可以降低風險,因為如果新版本有問題,你可以在部署到所有泳道之前發(fā)現(xiàn)并修復它。
4、流量管理
你需要一個負載均衡器或類似的工具來管理流量,將請求分發(fā)到各個泳道。你可以根據各種策略來分發(fā)流量,例如輪詢、最少連接數(shù)、響應時間等。
網關層負責環(huán)境識別與環(huán)境標識注入,通過測試域名隔離不同環(huán)境,RPC 層負責服務發(fā)現(xiàn)與選擇,環(huán)境標識透傳等。
5、監(jiān)控和故障恢復
你需要監(jiān)控每個泳道的性能和健康狀況,并在檢測到問題時自動或手動切換到其他泳道。
四、總結
多泳道建設是一種高效、靈活的開發(fā)模式,尤其適用于復雜項目和跨部門協(xié)作場景。通過合理劃分泳道、優(yōu)化資源分配和加強團隊協(xié)作,我們可以顯著提高軟件交付速度和質量。
在未來軟件開發(fā)中,多泳道建設將繼續(xù)發(fā)揮重要作用。希望本文能為你提供有益的參考和啟示。