集成Sermant,ServiceStage帶你實現應用上下線*滑過渡
本文分享自華為云社區《ServiceStage集成Sermant實現應用的優雅上下線》,作者:華為云開源。
優雅上下線旨在確保服務在進行上下線操作時,能夠*滑過渡,避免對業務造成影響,保證資源的高效利用。Sermant基于字節碼增強的技術實現了應用優雅上下線能力,應用發布與運維*臺ServiceStage通過集成Sermant使得應用在進行持續發布時實現無侵入式地優雅上下線。
1. ServiceStage簡介
ServiceStage(應用管理與運維*臺)是華為云面向企業的應用管理與運維*臺,提供應用發布、部署、監控與運維等一站式解決方案。整個*臺支持一系列技術棧,包含Java、Node.js、Docker、Tomcat等。在微服務框架層面,支持Apache ServiceComb Java Chassis(Java Chassis)、Spring Cloud等框架的微服務應用,讓企業應用上云更簡單。
ServiceStage主要具備如下的一些能力模塊:
- 應用管理:支持應用生命周期管理、環境管理。
- 微服務應用接入:支持Java Chassis、Spring Cloud微服務框架。配合微服務引擎可實現服務注冊發現、配置管理和服務治理。
- 應用運維:通過日志、監控、告警支持應用運維管理。

2. Sermant簡介
Sermant 是基于Java字節碼增強技術的云原生無代理服務網格,通過 JavaAgent 對宿主應用進行非侵入式增強,以解決Java應用的微服務治理問題。Sermant的初衷是建立一個面向微服務治理的對開發態非侵入的解決方案生態,降低服務治理開發和使用的難度,通過抽象接口、功能整合、插件隔離等手段,達到簡化開發、功能即插即用的效果。
Sermant整體架構包括Sermant Agent、Sermant Backend、Sermant Injector、動態配置中心等組件。其中Sermant Agent是提供字節碼增強基礎能力及各類服務治理能力的核心組件,Sermant Backend、Sermant Injector、動態配置中心為Sermant提供其他能力的配套組件。

3. 應用上下線發布過程遇到的挑戰
在應用上下線發布過程中,如何做到流量的無損上/下線,是一個系統能保證SLA的關鍵。如果應用上下線不*滑,就會出現短時間的服務調用報錯,比如連接被拒絕、請求超時、沒有實例和請求異常等問題。
在應用上線發布過程中,由于過早暴露服務,實例可能仍處在JVM JIT編譯或者使用的中間件還在加載,若此時大量流量進入,可能會瞬間壓垮新起的服務實例。
在應用下線過程中,服務消費者感知服務提供者下線有延遲,在一段時間內,被路由到已下線服務提供者實例的請求都拋連接被拒絕異常。其次服務實例在接收到停止服務信號時,會立即關閉,但是這時候可能在請求隊列中存在一部分請求還在處理,如果立即關閉這些請求都會損失掉。
4. ServiceStage優雅上下線方案
為了保證應用正確上下線、流量不丟失,ServiceStage基于Sermant提供了一套優雅上下線的方案,包括預熱、延遲下線等,避免了請求超時、連接拒絕、流量丟失等問題的發生。
4.1優雅上線實現機制
預熱是優雅上線的核心機制,Sermant Agent提供了延遲注冊機制,減少流量丟失,從而實現優雅上線。

1.延遲注冊
在服務啟動成功之后不立刻注冊,而是延遲一段時間再去注冊,目的是雖然服務啟動成功了,但可能還有一些框架或者業務的代碼沒有初始化完成,可能會導致調用報錯,可以通過設置延遲注冊,讓服務充分初始化后再注冊到注冊中心對外提供服務。
2.預熱
該方式主要用于解決當流量突然增加時,可能瞬間把實例壓垮的問題。通過預熱,讓通過的流量緩慢增加,在一定時間內逐漸增加到閾值上限,目的是采用少流量對服務實例進行初始化,防止服務崩潰。預熱是基于客戶端實現的,當流量進入時,Sermant Agent會動態調整流量,根據服務的預熱配置,對流量進行動態分配。對于開啟服務預熱的實例,在剛啟動時,會給該實例分配較少的流量,隨后流量將以曲線方式逐漸增加至與其他實例*乎持*。
4.2優雅下線實現機制
延遲下線是優雅下線的核心機制,且Sermant Agent還提供了流量統計機制,即服務處理完所有統計的請求后再下線,減少流量丟失,從而實現了優雅下線。

1.延遲下線
當服務提供者實例下線時,無法避免仍有業務請求還未處理完成,從而可能會出
現請求丟失的現象。延遲下線即對下線的實例提供保護,優雅下線插件基于下線
實時通知+刷新緩存的機制快速更新上游的實例緩存,服務消費者能盡早感知服務。提供者實例下線的行為,同時基于流量統計的方式,確保即將下線的實例盡可能的將流量處理完成,盡量避免流量丟失。
2.流量統計
當服務即將下線時,為確保當前請求已全部處理完成,Sermant Agent會嘗試等
待30s(可配置),定時統計和判斷當前實例請求是否均處理完成,處理完成后最終下線。
4.3 整體流程
使用ServiceStage完成應用優雅上下線流程示例如下:

1.資源準備
通過云*臺以及ServiceStage提供的能力,快速創建應用所需要的計算(ECS,CCE等),存儲(OBS,EVS等),網絡(VPC,ELB等)以及一些中間件資源(DCS,DMS,CSE等)。
2.創建環境
在ServiceStage的控制臺,找到環境創建頁面,完成環境創建,隨后將提前準備好的資源納管到新創建的環境當中。
3.安裝Sermant Injector
ServiceStage為了簡化Sermant Agent的安裝流程,專門集成了Sermant Injector,通過Sermant Injector,ServiceStage可以實現宿主應用自動掛載Sermant的快速部署方式,只需在應用部署的yaml中的labels添加sermant-injection: enabled即可快速將Sermant Agent安裝到應用實例上。
在ServiceStage上,只需在界面勾選Sermant Injector選項,即可自動完成Sermant Injector的安裝。
4.創建應用
在ServiceStage的控制臺,找到應用創建頁面,完成應用創建。
5.部署待實現優雅上下線應用
選擇2中已創建好的環境,將準備好的應用代碼通過ServiceStage的組件部署功能快速部署到該環境中。
6.驗證優雅上下線
針對應用中的實例,在ServiceStage上對其進行部分重啟或者下線,隨后通過腳本文件,持續調用實例接口,查看流量請求情況,并與未開啟優雅上下線開關情況下的數據進行對比,驗證優雅上下線的實際效果。
5. 總結
Sermant基于Java字節碼增強的技術為微服務應用提供了穩定可靠的優雅上下線能力,而ServiceStage本身作為一個高效的應用發布與運維*臺,通過集成Sermant,提供了微服務應用優雅上下線的端到端解決方案,為廣大使用者提供更高效更便捷的使用體驗。
--------------------------------------------------------------------
Sermant 作為專注于服務治理領域的字節碼增強框架,致力于提供高性能、可擴展、易接入、功能豐富的服務治理體驗,并會在每個版本中做好性能、功能、體驗的看護,廣泛歡迎大家的加入。
- Sermant 官網:https://sermant.io
- GitHub 倉庫地址:https://github.com/sermant-io/Sermant
浙公網安備 33010602011771號