藍綠部署適合關鍵服務,滾動更新適合無狀態服務。藍綠部署通過兩套環境切換實現零停機,需注意環境一致性、切換方式和回滾機制;滾動更新逐步替換實例,依賴健康檢查和最小可用數控制,適用于 kubernetes 等編排平臺;選擇策略時需考慮服務狀態、接口兼容性和技術棧;實際部署中均需關注優雅終止、探針設置、dns 緩存及日志追蹤等問題。
在 golang 微服務部署中,實現零停機更新是保障系統高可用的重要手段。常見的做法有兩種:藍綠部署和滾動更新。它們各有適用場景,也都有需要注意的細節。
下面從實際操作角度出發,講講這兩種策略怎么用、什么時候用,以及容易踩坑的地方。
藍綠部署:兩套環境切換,適合關鍵服務
藍綠部署的核心思想是維護兩套完全相同的生產環境(藍和綠),一次只有一套對外提供服務。新版本部署到空閑的一套后,通過負載均衡器或反向代理切換流量。
立即學習“go語言免費學習筆記(深入)”;
實現要點:
- 環境一致性:兩個環境必須配置一致,包括依賴服務、數據庫版本等。
- 切換方式:可以通過 nginx、Kubernetes Service 或云廠商提供的負載均衡器來切換流量。
- 回滾快速:如果新版本出問題,只需要切回原來的環境即可。
適合場景:
- 對穩定性要求極高,不能容忍任何請求失敗的服務
- 版本之間改動較大,需要完整驗證新環境是否正常
注意事項:
- 成本較高,需要雙倍資源
- 如果有狀態服務(如本地緩存、文件存儲),處理起來會比較麻煩
滾動更新:逐步替換實例,適合無狀態服務
滾動更新是 Kubernetes 等編排系統默認支持的一種策略,它會逐步替換舊版本的 Pod,同時確保始終有一定數量的健康實例在運行。
實現要點:
- 分批更新:每次更新一部分 Pod,其余繼續處理請求
- 健康檢查配合:Liveness 和 Readiness 探針要設置合理,避免將流量導到未就緒的實例
- 最小可用數控制:設置 minReadySeconds 和 maxUnavailable,防止更新過程中服務不可用
適合場景:
- 服務本身是無狀態的
- 請求可以容忍短暫中斷(比如前端調用有重試機制)
- 使用 Kubernetes 等容器編排平臺
常見問題:
- 新舊版本共存期間,如果有接口不兼容,可能導致部分請求失敗
- 數據庫遷移如果沒有同步處理,可能引發數據結構不一致
如何選擇:藍綠還是滾動?
這取決于你的業務特點和技術棧:
- 如果你使用的是 Kubernetes 并且服務是無狀態的,滾動更新更輕量高效
- 如果你希望新版本上線前完全準備好,并且能快速回滾,藍綠部署更適合
- 如果服務對可用性要求極高,又擔心滾動更新過程中的兼容問題,也可以先在灰度環境中測試后再全量更新
實際部署建議
不管用哪種策略,下面幾點都需要注意:
- ? 優雅終止:Golang 應用要監聽 SIGTERM,完成當前請求再退出
- ? 探針設置合理:Readiness Probe 不要太激進,否則剛啟動的服務會被誤判為異常
- ? DNS 緩存注意:客戶端如果緩存了 IP 地址,可能會導致流量還打到舊 Pod 上
- ? 日志追蹤配合:新舊版本混跑時,日志要有版本號標識,方便排查問題
基本上就這些。兩種策略都不復雜,但要真正做到“零停機”,還得結合具體服務的特點做調整。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END