<table id="qs2qo"></table>
  • <bdo id="qs2qo"><center id="qs2qo"></center></bdo>
    • 自動秒收錄
    • 軟件:1973
    • 資訊:56157|
    • 收錄網站:175404|

    IT精英團

    Spring云應用的優雅下線和灰度發布

    Spring云應用的優雅下線和灰度發布

    瀏覽次數:
    評論次數:
    編輯: 陽煦
    信息來源: ITPUB
    更新日期: 2022-05-09 18:32:45
    摘要

    前言在生產環境中,如何保證在服務升級的時候,不影響用戶的體驗,這個是一個非常重要的問題。如果在我們升級服務的時候,會造成一段時間內的服務不可用,這就是不夠優雅的。那什么是優雅的呢?主要就是指在服務升級

    • 正文開始
    • 相關閱讀
    • 推薦作品

    前言

    在生產環境中,如何保證服務升級不會影響用戶體驗是一個非常重要的問題。如果我們升級服務,會讓服務在一段時間內不可用,不夠優雅。什么是優雅?主要是指服務升級的時候,整個服務不中斷,讓用戶沒有感知,然后用戶體驗不會受到影響。這是優雅的。

    其實,優雅的下線是目的,不是手段。這是一個相對的概念。比如kill PID和kill -9 PID都是暴力查殺服務。與kill -9 PID相比,kill PID是優雅的。但如果單拿kill PID來說,能說是優雅的線下策略嗎?我肯定不是。這就是原因。

    所以本文所描述的優雅下線只能稱之為“相對優雅的下線”,但相對于暴力的查殺服務來說,已經足夠優雅了。常見的優雅解決方案主要有優雅離線和灰度釋放。其實灰度發布的范圍已經包括優雅下線了。

    最后,本文主要講基于Spring Cloud和Euraka的優雅離線和灰度發布。

    優雅下線

    常見的下線方式

    方式一:kill PID

    用法:kill java進程ID

    這種方法依靠Spring Boot應用的關機鉤子,應用本身的下線是優雅的。但是,如果您的服務發現組件正在使用Eureka,默認情況下會有90秒的延遲,其他應用程序會感知到服務的下線,這意味著其他服務可能仍然會在實例下線后的90秒內調用下線實例。所以這個方法不夠優雅。

    41211">方式二:/shutdown端點

    Spring Boot 提供了/shutdown端點,可以借助它實現優雅停機。

    使用方式:在想下線應用的application.yml中添加如下配置,從而啟用并暴露/shutdown端點:

    management:
      endpoint:
        shutdown:
          enabled: true
      endpoints:
        web:
          exposure:
            include: shutdown

    發送 POST 請求到/shutdown端點

    curl -X http://你想停止的服務地址/actuator/shutdown

    該方式本質和方式一是一樣的,也是借助 Spring Boot 應用的 Shutdown hook 去實現的。

    方式三:/pause端點

    Spring Boot 應用提供了/pause端點,利用該端點可實現優雅下線。

    使用方式:在想下線應用的application.yml中添加配置,從而啟用并暴露/pause端點:

    management:
      endpoint:
        # 啟用pause端點
        pause:
          enabled: true
        # 啟用restart端點,之所以要啟用restart端點,是因為pause端點的啟用依賴restart端點的啟用
        restart:
          enabled: true
      endpoints:
        web:
          exposure:
            include: pause,restart

    發送 POST 請求到/actuator/pause端點:

    curl -X POST http://你想停止的服務實例地址/actuator/pause

    執行后的效果類似下圖:

    如圖所示,該應用在 Eureka Server 上的狀已被標記為DOWN,但是應用本身其實依然是可以正常對外服務的。在 Spring Cloud 中,Ribbon 做負載均衡時,只會負載到標記為UP的實例上。

    利用這兩點,你可以:先用/pause端點,將要下線的應用標記為DOWN,但不去真正停止應用;然后過一定的時間(例如 90 秒,或者自己做個監控,看當前實例的流量變成 0 后)再去停止應用,例如kill應用。

    缺點 & 局限

    方式四:/service-registry端點

    使用方式:在想下線應用的application.yml中添加配置,從而暴露/service-registry端點:

    management:
      endpoints:
        web:
          exposure:
            include: service-registry

    發送 POST 請求到/actuator/service-registry端點:

    curl -X "POST" "http://localhost:8000/actuator/service-registry?status=DOWN" \
       -H "Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8"

    實行后的效果類似如下圖:

    圖片

    優雅的下線方式

    在上文中,我們講述了四種常見的下線方式,對比來看,方式四是一種比較優雅的下線方式。


    在實際項目中,我們可以先使用/service-registry端點,將服務標記為DOWN,然后監控服務的流量,當流量為 0 時,即可升級該服務。當然,這里假設我們部署了多個服務實例,當一個服務實例DOWN掉之后,其他服務實例仍然是可以提供服務的,如果就部署一臺服務的話,那么討論優不優雅就沒那么重要了。

    除了上述的下線方式之外,還有一種利用EurekaAutoServiceRegistration對象達到優雅下線的目標。

    • 執行eurekaAutoServiceRegistration.start()方法時,當前服務向 Eureka 注冊中心注冊服務;
    • 執行eurekaAutoServiceRegistration.stop()方法時,當前服務會向 Eureka 注冊中心進行反注冊,注冊中心收到請求后,會將此服務從注冊列表中刪除。

    示例代碼如下:

    @RestController
    @RequestMapping(value = "/graceful/registry-service")
    public class GracefulOffline {

        @Autowired
        private EurekaAutoServiceRegistration eurekaAutoServiceRegistration;

        @RequestMapping("/online")
        public String online() {
            this.eurekaAutoServiceRegistration.start();
            return "execute online method, online success.";
        }

        @RequestMapping("/offline")
        public String offline() {
            this.eurekaAutoServiceRegistration.stop();
            return "execute offline method, offline success.";
        }
    }

    到這里,我們已經介紹了兩種相對優雅的下線方式了。具體如何操作,我們可以根據實際上情況進行包裝,或者利用自動化的腳本來實現更加優雅的下線方式。

    灰度發布

    藍綠部署

    藍綠部署,英文名為 Blue Green Deployment,是一種可以保證系統在不間斷提供服務的情況下上線的部署方式。

    如何保證系統不間斷提供服務呢?那就是同時部署兩個集群,但僅對外提供一個集群的服務,當需要升級時,切換集群進行升級。藍綠部署無需停機,并且風險較小。其大致步驟為:

    • 部署集群 1 的應用(初始狀態),將所有外部請求的流量都打到這個集群上
    • 部署集群 2 的應用,集群 2 的代碼與集群 1 不同,如新功能或者 Bug 修復等
    • 將流量從集群 1 切換到集群 2
    • 如集群 2 測試正常,就刪除集群 1 正在使用的資源(例如實例),使用集群 2 對外提供服務

    因為在使用藍綠部署的方式時,我們需要控制流量,所以我們需要借助路由服務,如 Nginx 等。

    滾動部署

    滾動部署,英文名為 Rolling Update,同樣是一種可以保證系統在不間斷提供服務的情況下上線的部署方式。和藍綠部署不同的是,滾動部署對外提供服務的版本并不是非此即彼,而是在更細的粒度下平滑完成版本的升級。

    如何做到細粒度平滑升級版本呢?滾動部署只需要一個集群,集群下的不同節點可以獨立進行版本升級。比如在一個 12 節點的集群中,我們每次升級 4 個節點,并將升級后的節點重新投入使用,周而復始,直到集群中所有的節點都更新為新版本。

    這種部署方式相對于藍綠部署,更加節約資源,因為它不需要運行兩個集群。但這種方式也有很多缺點,例如:

    • 沒有一個確定 OK 的環境。使用藍綠部署,我們能夠清晰地知道老版本是 OK 的,而使用滾動發布,我們無法確定。
    • 修改了現有的環境。
    • 如果需要回滾,很困難。舉個例子,在某一次發布中,我們需要更新 100 個實例,每次更新 10 個實例,每次部署需要 5 分鐘。當滾動發布到第 80 個實例時,發現了問題,需要回滾。這時,我們估計就要瘋了。
    • 有的時候,我們還可能對系統進行動態伸縮,如果部署期間,系統自動擴容/縮容了,我們還需判斷到底哪個節點使用的是哪個代碼。盡管有一些自動化的運維工具,但是依然令人心驚膽戰。

    并不是說滾動發布不好,滾動發布也有它非常合適的場景。

    金絲雀部署

    金絲雀部署又稱灰度部署(或者,灰度發布),英文名為 Canary Deployment,是指在黑與白之間,能夠平滑過渡的一種發布方式。


    金絲雀的名稱來源于「礦井中的金絲雀」,早在 17 世紀,英國礦井工人發現,金絲雀對瓦斯這種氣體十分敏感,空氣中哪怕有極其微量的瓦斯,金絲雀也會停止歌唱;而當瓦斯含量超過一定限度時,雖然魯鈍的人類毫無察覺,金絲雀卻早已毒發身亡。當時在采礦設備相對簡陋的條件下,工人們每次下井都會帶上一只金絲雀作為“瓦斯檢測指標”,以便在危險狀況下緊急撤離。


    我們來看一下金絲雀部署的步驟:

    • 準備好部署各個階段的工件,包括:構建工件,測試腳本,配置文件和部署清單文件
    • 從負載均衡列表中移除掉“金絲雀”服務器
    • 升級“金絲雀”應用(切斷原有流量并進行部署)
    • 對應用進行自動化測試
    • 將“金絲雀”服務器重新添加到負載均衡列表中(連通性和健康檢查)
    • 如果“金絲雀”在線使用測試成功,升級剩余的其他服務器(否則就回滾)


    在金絲雀部署中,常常按照用戶量設置路由權重,例如 90% 的用戶維持使用老版本,10% 的用戶嘗鮮新版本。不同版本應用共存,經常與 A/B 測試一起使用,用于測試選擇多種方案。


    金絲雀部署比較典型的例子,就是我們在使用某個應用的時候,該應用邀請我們進行“內測”或者“新版本體驗”,如果我們同意了,那么我們就成了金絲雀。

    原文

    運維常用的34個Linux Shell腳本 對你一定有幫助!
    ? 上一篇 2022-05-09
    做SQL性能優化真的是干瞪眼
    下一篇 ? 2022-05-11
    發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    • 本文將帶您了解kubernetes的架構和組件!
      1閱讀 0條評論 個贊
      kubernetes架構目標kubernetes是生產級的,用于跨主機部署,擴展,管理和組合應用程序容器的基礎設施。kubernetes不僅僅是“容器編排”,他更加主要的解決方向是消除協調計算資源,網……
    • MySQL支持哈希索引嗎?(收藏)
      1閱讀 0條評論 個贊
      經常有朋友問,MySQL的InnoDB到底支不支持哈希索引?對于InnoDB的哈希索引,確切的應該這么說:(1)InnoDB用戶無法手動創建哈希索引,這一層上說,InnoDB確實不支持哈希索引;(2)……
    • MySQL語句優化——隱式字符編碼轉換
      1閱讀 0條評論 個贊
      MySQL中我們知道有:如果對索引字段做函數操作,可能會破壞索引值的有序性,因此優化器就決定放棄走樹搜索功能。隱式類型轉換也會導致放棄走樹搜索。因為類型轉換等價于在條件字段上使用了函數比如:假設tra……
    • 數據治理 區分系統、機制、流程的概念很重要
      0閱讀 0條評論 個贊
      以下文章來源于公眾號-大魚的數據人生,作者討厭的大魚先生我們剛接觸數據的時候,從事的大多是具體的數據管理活動,無論是數據的采集、開發和開放,或是元數據管理、數據質量管理或是數據安全管理等等,但當你想更……
    • 臉書數據庫項目負責人:我從做基礎設施中學到的42件事
      1閱讀 0條評論 個贊
      最近讀到了分布式系統研究者MaheshBalakrishnan的一篇博客《42thingsIlearnedfrombuildingaproductiondatabase》。同樣做……
    • 運行和維護監控中的采樣數據和統計數據
      8閱讀 0條評論 個贊
      2006年的時候,Oracle公司的《Oracle通訊》雜志向我約稿,那時候正好是Oracle公司在大力推廣Oracle10g的時候,當時我問編輯,對這篇文章有什么要求。編輯說,對于優化中數據采集工……
    • 操作系統宕機 如何找回我的MySQL記錄?
      0閱讀 0條評論 個贊
      以下文章來源于公眾號-數據和云,作者楊豹一、概述如果Linux操作系統宕機,啟動不了,救援模式(rescueinstalledsystem)也行不通的時候,那么該機器上的MySQL數據還能恢復嗎?……
    • 創建Go語言最快的排序算法
      1閱讀 0條評論 個贊
      前言說到排序算法,很多同學會想起快速排序、堆排序、冒泡排序這些耳熟能詳的算法。了解得深一些的同學,也可能看過例如Python的timsort以及C++introsort之類的排序算法?!?/div>
    • 基礎鞏固——至少需要多少行代碼才能實現深度復制?
      1閱讀 0條評論 個贊
      前言深度克?。ㄉ羁截悾┮恢倍际浅?、中級前端面試中經常被問到的題目,網上介紹的實現方式也都各有千秋,大體可以概括為三種方式:JSON.stringify+JSON.parse,這個很好理解;全量判斷類……
    • Linux基礎總結 這個就夠了!
      1閱讀 0條評論 個贊
      1.Linux安裝因為圖太多了,轉載一篇從虛擬機vmware配置到centos7詳細安裝教程https://www.cnblogs.com/wcwen1990/p/7630545.html2.lin……
    • MySQL查詢語句的limit offset是如何實現的?
      1閱讀 0條評論 個贊
      在寫select語句的時候,使用limit,offset可能就像是我們吃飯喝水一樣自然了。剛開始工作的時候也經常聽前輩們教導:使用limit,offset,當offset變大的時候執……
    • 在Linux中檢查磁盤空間的12個有用的df命令
      1閱讀 0條評論 個贊
      1.檢查文件系統磁盤空間使用情況這df命令顯示文件系統上的設備名稱、總塊數、總磁盤空間、已用磁盤空間、可用磁盤空間和掛載點信息。[root@local~]#dfFilesystem1K-bloc……
    • 如何用10行bash shell腳本監控Linux?
      1閱讀 0條評論 個贊
      http://985.so/xbtd子沐愛掃地(譯)監控我們的環境對于服務器運維來說至關重要,尤其是在部署新的應用程序時。如今,公司每天都使用開源解決方案來監控系統資源。但是,當出于測試的目的來監控……
    • Java“年度加密漏洞”修復 網友:更多堅持Java 8的理由
      9閱讀 0條評論 個贊
      文|Travis出品|OSC開源社區(ID:oschina2013)甲骨文于昨日推送了安全更新修復了一個漏洞,該漏洞允許攻擊者偽造某些種類的SSL證書和握手、雙因素認證信息,以及由一系列廣……
    • 記得網上一個K8s Ingress訪問故障排除 最后卻不是帖子的鍋
      0閱讀 0條評論 個贊
      具體現象應用遷移至我們的PaaS平臺后會出現偶發性的502問題,錯誤見圖片:相比于程序的請求量,錯誤肯定是比較少的,但是錯誤一直在發生,會影響調用方的代碼,需要檢查下問題原因。為啥我們只看到了POST……
    • Java 9為什么把String的底層實現從char[]改成byte[]?
      8閱讀 0條評論 個贊
      如果你不是Java8的釘子戶,你應該早就發現了:String類的源碼已經由char[]優化為了byte[]來存儲字符串內容,為什么要這樣做呢?開門見山地說,從char[]到byte……
    • 如何讓Kubernetes集群優雅地使用GPU節點
      2閱讀 0條評論 個贊
      如何讓你的Kubernetes集群使用GPU節點CUDA驅動程序如果您還沒有這樣做,請確保您已在GPU節點上安裝了NVIDIACUDA驅動程序。CUDA是來自nvidia的并行計算平臺。ht……
    • 誤操作離線丟棄和恢復場景測試的業務影響——來自“血”的教訓
      0閱讀 0條評論 個贊
      在數據庫恢復過程中,比如我們用了第三方的備份工具,在實施恢復操作時會導出需要的某個表空間這樣可以大大減少恢復時間,是十分值得推薦的做法,這個過程中由于修改控制文件中數據文件的相關信息,需要執行alte……
    • 關于數據中心最強科普 一個就給你完整了解!
      1閱讀 0條評論 個贊
      數據中心,英文縮寫叫IDC,也就是InternetDataCenter(互聯網數據中心)。之所以不太直接稱之為“DC”,主要是為了避免和直流電(DirectCurrent)混淆。而且,現在的數……
    • 如何正確計算Kubernetes容器的CPU利用率
      1閱讀 0條評論 個贊
      本文轉自博客園,原文:https://www.cnblogs.com/apink/p/15767687.html,版權歸原作者所有。參數解釋使用Prometheus配置kubernetes環境……
    最近發布資訊
    更多
    本地特级毛片,老师脱裙子让我看内裤,人妻av乱片aV出轨avApp
    <table id="qs2qo"></table>
  • <bdo id="qs2qo"><center id="qs2qo"></center></bdo>