在EDAS中部署的SpringCloud和Dubbo應用能夠無侵入對接MSE微服務治理能力。當前EDAS支持您在創建和部署應用時為應用配置服務注冊與發現、推空保護和無損上線微服務治理能力。本文介紹如何配置微服務治理。
EDAS的應用配置微服務治理相關參數,使用云效流水線部署EDAS應用時,以EDAS控制臺配置為準,云效流水線無法進行參數的配置。
背景信息
服務注冊與發現
Java微服務架構中常見的注冊中心包含Eureka、ZooKeeper和Nacos等,用于實現服務的注冊與發現,能夠屏蔽、解耦服務之間的相互依賴,以便對微服務進行動態管理。
推空保護
推空保護功能用于處理客戶端在請求注冊中心訂閱服務端地址列表時,在服務端注冊異常的場景下,注冊中心返回了空列表,此時客戶端忽略該空返回的變更,從緩存中獲取上一次正常的服務端地址進行服務訪問。能夠在注冊中心在進行變更(變配、升降級)或遇到突發情況(例如,可用區斷網斷電)或其他不可預知情況下的列表訂閱異常時,增加客戶端可靠性。
服務消費者(Consumer)會從注冊中心上訂閱服務提供者(Provider)的實例列表。當注冊中心在進行變更(變配、升降級)或遇到突發情況(例如,可用區斷網斷電)時,都有可能導致訂閱異常,影響服務消費者(Consumer)的可用性。為了應對在不可預知的情況下訂閱列表異常,可以在Consumer側配置推空保護。
無損上線
對于任何一個線上應用來說,發布、擴容、縮容和重啟等操作不可避免,EDAS集成了MSE提供的一套無損上線方案,針對應用啟動的多個階段提供了相應的保護能力,具體功能包含服務預熱、服務延遲注冊以及無損滾動發布等。
服務預熱:通過設置預熱時間和預熱曲線,降低新上線的服務在短時間內無法處理突增流量導致進程異常的風險。
延遲注冊:延遲注冊能夠在應用啟動時進行延時等待,在等待延遲時間后,再將服務注冊到注冊中心。能夠為應用提供異步請求、計算資源的準備時間,降低在應用發布時由于資源未初始化成功的請求異常。
對于初始化過程繁瑣的應用,由于注冊通常與應用初始化過程同步進行,從而出現應用還未完全初始化就已經被注冊到注冊中心供外部消費者調用,此時直接調用可能會導致請求報錯。通過設置延遲注冊,可讓應用在充分初始化后再注冊到注冊中心對外提供服務。
無損滾動發布:Health接口為微服務體系外的客戶端提供應用就緒狀態檢查的方法,基于該接口能夠同步微服務框架下與非微服務框架下的服務狀態檢查。支持服務注冊狀態檢查和服務預熱狀態檢查。
K8s的滾動發布是將一次完整的發布過程分成多個批次,每次發布一個批次,成功后,再發布下一個批次,最終完成所有批次的發布。EDAS能夠為K8s應用打通微服務生命周期與K8s服務生命周期,通過提供確保在通過就緒檢查前完成服務注冊以及確保在就緒檢查前完成服務預熱等無損上線能力,幫助您在應用的滾動發布過程中,始終保證有可用的服務實例(副本)在運行,從而實現應用的無損滾動發布。
通過就緒檢查前完成服務注冊:微服務生命周期關聯K8s就緒檢查功能開啟后,可通過Agent無侵入為應用提供一個檢測其是否完成注冊的端口,當應用注冊完成返回200幫助K8s判定應用已就緒,未完成注冊返回500幫助K8s判定應用未就緒。
通過就緒檢查前完成服務預熱:除了可以單獨使用服務預熱,還可以將其關聯K8s就緒檢查機制。當應用服務預熱完成后,K8s才將應用置為就緒狀態。
無損下線
在EDAS上部署的K8s應用默認開啟無損下線能力。應用可以在實例停止前先在注冊中心注銷,等待一段時間后再執行下線流程。對于Java應用,額外支持配置下線通知開關,下線的實例能夠主動通知消費者不再向本實例發起請求,一定程度上避免實例下線時仍然有未處理完成的請求被中斷。
使用限制
僅Spring Cloud和Dubbo應用支持無侵入接入推空保護和無損上線微服務治理能力,對應支持的版本如下:
限制項
推空保護
無損上線
Spring Cloud
支持Spring Cloud Edgware及以上版本
支持Spring Cloud Edgware及以上版本
Dubbo
支持Dubbo 2.5.3~2.7.8版本
說明如需使用Dubbo 3.0及以上版本,請加入釘群(釘群號:31723701)聯系產品技術專家咨詢處理。
支持Dubbo 2.7.3~2.7.8版本
說明如需使用Dubbo 2.6或Dubbo 3.0及以上版本,請加入釘群(釘群號:31723701)聯系產品技術專家咨詢處理。
支持Nacos、Eureka和Zookeeper注冊中心類型。
網關應用一般不通過注冊中心調用,而是通過直接對外暴露API的方式調用,因此MSE當前所支持的小流量預熱功能對該類應用不生效。另一方面,網關應用本身很少變更而且沒有太多業務邏輯,因此也不太需要服務預熱功能。
金絲雀發布第一批灰度批次的流量不支持進行服務預熱,后續批次才能進行服務預熱。
在創建應用時配置微服務治理
登錄EDAS控制臺,在左側導航欄,單擊 ,在頂部菜單欄選擇地域并在頁面上方選擇所屬微服務空間,然后在應用列表頁面左上角,單擊創建應用。
在應用基本信息頁簽,選擇集群類型和應用運行環境,然后在頁面最下方單擊下一步。
配置項
描述
集群類型
選擇Kubernetes集群。
應用運行環境
根據選擇的托管應用類型選擇應用運行環境。
Java:
自定義:適用于在K8s集群中使用自定義的鏡像部署應用。
Java:支持通用的JAR包部署,適用于Dubbo和Spring Boot應用。在選擇后可更改Java環境。
Tomcat:支持通用的WAR包部署,適用于Dubbo和Spring應用。在選擇后可更改Java環境和容器版本。
EDAS-Container(HSF):適用于使用WAR或者FatJar部署HSF應用。在選擇后可更改Java環境、Pandora版本和Ali-Tomcat版本。
PHP:適用于運行在Apache HTTP Server中的PHP應用程序。
多語言Node.js、C++、Go...:適用于在K8s集群中使用自定義的鏡像部署應用。
說明選擇EDAS-Container(HSF)部署應用時,微服務治理僅支持配置服務注冊與發現。
選擇PHP或多語言Node.js、C++、Go...部署應用時,不支持配置微服務治理。
在應用配置頁簽,設置應用的環境信息、基本信息、部署方式和資源參數,設置完成后單擊下一步。
在應用高級設置頁簽,展開微服務治理,根據您的業務需求配置服務注冊于發現、推空保護和無損上線。
配置項
描述
服務注冊與發現配置
注冊中心運維方式。您可以選擇使用EDAS共享注冊中心或使用應用程序配置的注冊中心。具體操作,請參見選擇注冊中心運維方式。
推空保護
是否開啟推空保護。
開啟推空保護:Consumer訂閱到空列表,推空保護生效,丟棄變更,保障業務服務可用。
不開啟推空保護:Consumer訂閱到空列表,業務中斷報錯。
無損上線
是否開啟無損上線。開啟時,需配置以下參數:
預熱時長(秒):應用實例下一次啟動的預熱時間,默認預熱時長為120秒。服務預熱時長設置范圍為0~86400秒(即24小時)。
預熱曲線:基于已配置的預熱時長,被預熱的應用流量權重會根據配置的預熱曲線呈指數型增長。在指定預熱時長內,預熱曲線值越大被預熱應用剛啟動時分配的流量權重越小,以滿足需要較長時間進行預熱的復雜應用的預熱需求。
默認為2(適合于一般預熱場景),表示在預熱周期內服務提供者的流量接收曲線形狀呈2次曲線形狀。預熱曲線設置范圍為0~20。相同預熱時間,預熱曲線值越大,表示預熱開始將接收的流量越小,臨近預熱結束時接收的流量增幅越大。
延遲注冊時間(秒):設置范圍為0~86400秒(即24小時)。
無損滾動發布:配置應用無損滾動發布。
通過就緒檢查前完成服務注冊:為應用無侵入提供55199端口用于檢查微服務是否已經完成注冊,如果已注冊完成,端口返回200,否則返回500。
通過就緒檢查前完成服務預熱:為應用無侵入提供55199端口用于檢查微服務是否已經完成預熱,如果已預熱完成,端口返回200,否則返回500。
說明若同時開啟了通過就緒檢查前完成服務注冊、通過就緒檢查前完成服務預熱,則55199端口會檢查服務是否已完成預熱。
無損下線
本開關支持配置無損下線主動通知功能。開啟后,應用在收到下線請求后,會主動通知消費方自己即將下線。
說明EDAS應用默認啟用無損下線能力。
需生產者和消費者均開啟無損下線主動通知開關。
確保集群中的ack-onepilot版本大于3.X,如果低于該版本,需升級。具體操作,請參見如何安裝ack-onepilot和卸載arms-pilot。
EDAS實現無損下線能力依賴應用的preStop探針。如果您的應用需自定義preStop探針,請在preStop探針中添加以下腳本:
wget http://127.0.0.1:54199/offline; sleep 30;
在應用高級設置頁簽,展開應用生命周期管理,選擇Readiness配置選項,單擊開啟開關,使Readiness探針配置生效。
應用未配置就緒探針時,啟用無損上線的無損滾動發布配置后,會在就緒探針模式中新增無損滾動發布模式,選擇該模式會為您的應用默認配置路徑為/health,端口為55199的就緒狀態檢查。您可以直接使用該無損滾動發布模式以打通微服務與K8s的生命周期,也可以結合業務需求使用其他模式結合/health接口配置更嚴謹的業務就緒檢查方法。
完成設置后單擊創建應用。
在應用創建完成頁簽確認應用基本信息、應用配置和應用高級設置等信息,確認完畢后單擊確定創建應用。
在應用總覽頁面頂部提示信息中,單擊查看詳情,可在變更記錄頁面查看變更流程。應用部署需要幾分鐘,請您耐心等待。變更完成后在應用總覽頁面的基本信息區域查看實例的運行狀態,如果顯示為Pod運行中,說明應用部署成功。
在更新應用時配置微服務治理
如果您在創建應用時沒有配置應用的服務注冊與發現、推空保護或無損上線,可以在部署應用時進行配置。
登錄EDAS控制臺。
在左側導航欄,單擊 ,在頂部菜單欄選擇地域并在頁面上方選擇所屬微服務空間,在集群類型下拉列表,選擇K8s集群,然后在頁面單擊具體的應用名稱。
在應用總覽或基本信息頁面的右上角,選擇 。
在選擇部署模式頁面,選擇具體的部署方式,然后在所選方式區域的右上角,單擊開始部署。
設置應用的環境和部署包信息后,展開配置管理,根據您的需求完成配置后單擊確定。
展開微服務治理,根據您的業務需求配置服務注冊與發現、推空保護和無損上線。
配置項
描述
服務注冊與發現配置
注冊中心運維方式。您可以選擇使用EDAS共享注冊中心或使用應用程序配置的注冊中心。具體操作,請參見選擇注冊中心運維方式。
推空保護
是否開啟推空保護。
開啟推空保護:Consumer訂閱到空列表,推空保護生效,丟棄變更,保障業務服務可用。
不開啟推空保護:Consumer訂閱到空列表,業務中斷報錯。
無損上線
是否開啟無損上線。開啟時,需配置以下參數:
預熱時長(秒):應用實例下一次啟動的預熱時間,默認預熱時長為120秒。服務預熱時長設置范圍為0~86400秒(即24小時)。
預熱曲線:基于已配置的預熱時長,被預熱的應用流量權重會根據配置的預熱曲線呈指數型增長。在指定預熱時長內,預熱曲線值越大被預熱應用剛啟動時分配的流量權重越小,以滿足需要較長時間進行預熱的復雜應用的預熱需求。
默認為2(適合于一般預熱場景),表示在預熱周期內服務提供者的流量接收曲線形狀呈2次曲線形狀。預熱曲線設置范圍為0~20。相同預熱時間,預熱曲線值越大,表示預熱開始將接收的流量越小,臨近預熱結束時接收的流量增幅越大。
延遲注冊時間(秒):設置范圍為0~86400秒(即24小時)。
無損滾動發布:配置應用無損滾動發布。
通過就緒檢查前完成服務注冊:為應用無侵入提供55199端口用于檢查微服務是否已經完成注冊,如果已注冊完成,端口返回200,否則返回500。
通過就緒檢查前完成服務預熱:為應用無侵入提供55199端口用于檢查微服務是否已經完成預熱,如果已預熱完成,端口返回200,否則返回500。
說明若同時開啟了通過就緒檢查前完成服務注冊、通過就緒檢查前完成服務預熱,則55199端口會檢查服務是否已完成預熱。
無損下線
本開關支持配置無損下線主動通知功能。開啟后,應用在收到下線請求后,會主動通知消費方自己即將下線。
說明EDAS應用默認啟用無損下線能力。
需生產者和消費者均開啟無損下線主動通知開關。
確保集群中的ack-onepilot版本大于3.X,如果低于該版本,需升級。具體操作,請參見如何安裝ack-onepilot和卸載arms-pilot。
EDAS實現無損下線能力依賴應用的preStop探針。如果您的應用需自定義preStop探針,請在preStop探針中添加以下腳本:
wget http://127.0.0.1:54199/offline; sleep 30;
展開限流降級配置,開啟AHAS接入開關。
重要單擊確定后,該應用將會被重啟,請在業務較少的時間段進行。
結果驗證
在應用的變更記錄頁面中查看應用變更詳情,如果顯示執行成功,則表示部署成功,即配置已生效。
無損上線在應用部署后,可以查看預熱效果。
登錄AHAS控制臺。
在AHAS控制臺左上角,選擇應用接入的地域。
在控制臺左側導航欄中選擇
。在應用防護頁面的應用卡片頁簽單擊目標應用卡片。
在左側導航欄中選擇機器監控。
在機器監控頁面,查看應用的預熱效果。
服務預熱
應用部署選擇分批發布,并配置應用在部署時開啟服務預熱,同時應用接入AHAS,應用的預熱效果示例如下:
在穩定的業務流量下,可以看到新發布的應用所占流量比率呈預熱曲線緩慢增長。
無損上線功能通過配置應用的預熱時長和預熱曲線來控制新發布的應用流量百分比,用戶可以根據業務需求按需配置預熱時長,并根據程序復雜度控制預熱曲線來調整應用剛啟動時分配的流量權重,預熱效果函數曲線如下:
應用部署時,配置不同的預熱曲線效果展示示例如下:
預熱時長為120秒,預熱曲線為2。
預熱時長為120秒,預熱曲線為5。
無損滾動發布
開啟無損滾動發布后能將微服務的生命周期與K8s的生命周期打通,在分批發布時選擇配置服務預熱并開啟無損滾動發布,可以在發布過程中看到以下效果:
新發布的應用接收的流量呈預熱曲線緩慢增長。
舊的應用流量緩慢下降。
在應用發布的過程中可在應用事件中看到Unhealthy告警事件,由于應用的就緒探針未檢查通過,此時新舊版本實例共存,舊實例在預熱過程中接收額外流量。在預熱結束后,就緒探針請求返回200,舊實例才被刪除以實現服務預熱并打通與K8s的生命周期。
延遲注冊
配置延遲注冊后,能夠讓應用在啟動后等待指定的延遲時間后再注冊到注冊中心以提供服務,能夠給應用充分的啟動時間,以避免應用未完全加載完成導致的流量損失。
例如,配置應用單批部署時,同時配置300秒延遲注冊和120秒服務預熱,并開啟應用無損滾動發布,效果如下:
在應用的變更記錄頁面中查看應用變更記錄。
可以看到應用在11:17:59進行變更,在11:24:44前新建的Pod都沒有接收任何流量,且在11:24:44時間點后開始進行流量預熱。觀察應用變更事件能夠找到Unhealthy告警事件。考慮到應用啟動過程包含Pod調度、鏡像拉取、程序啟動等事件,從應用的發布時間到變更流程結束時間大致滿足應用啟動進行延遲注冊和服務預熱的時間。