流控驗證太麻煩?不敢上生產?MSE 有辦法!

作者:涯客

影響服務穩定性的因素有很多,其中比較常見但又往往容易被忽視的就是面向流量的穩定性,流控是保障服務穩定性的重要手段。但是,我們發現大量客戶僅僅在開發環境和預發環境中測試流控,卻在生產環境中鮮有使用。根據深入的交流,發現問題主要在二方面:

  • 第一:對於首次發佈的服務,由於無法精確預測真實流量的大小,往往無法給出合理的限流條件,這給流控的實施帶來了很大的挑戰。
  • 第二:對於已經上線的服務,直接對正在運行的業務進行流控可能會導致業務宕機或請求錯誤,進而影響用戶體驗。部分擁有能力的客戶,會在測試環境中模擬生產環境中流量,從而驗證流控的正確性,進而在生產環境中實施。這最大的問題是驗證成本較高,驗證流程較長,而且測試環境無法完全還原生產環境中流量情況。

我們可以歸納以上的問題爲一點:如何在不影響生產業務的情況下,小成本驗證流控能力,進而在生產環境中實施流控。

在不驗證的情況下,直接在生產環境中生效流控規則,很有可能讓解決災難的辦法成爲災難本身,例如流控規則配置錯誤、流控沒有達到預期、流控無故生效導致業務宕機等等,這些問題在生產環境中是完全無法接受的。

那麼有什麼辦法能夠在生產環境中小成本、快速地驗證流控能力?能夠在生產環境中確定配置的流量防護策略是否合理?一個簡單的思路就是隻對線上一部分的流量進行流控驗證,即在可控範圍內做流控驗證。

基於這一想法,我們使用微服務引擎(MSE)中熱點參數防護的功能,提出了一種合理的解決方案:首先在生產環境中進行可控範圍內的流控能力驗證、確定流控合理配置,進而在生產環境中啓用流控。

image.png

MSE微服務治理簡介:微服務治理中心無侵入增強主流Spring Cloud、Apache Dubbo和Istio等開源微服務框架,提供豐富的服務治理和流量防護功能,將中間件與業務解耦,擁有如下功能:無損上線、無損下線、全鏈路灰度、流量控制、離羣實例摘除等。

驗證思路

我們將會按照以下順序驗證所提出方案的可行性:

  1. 搭建基礎場景用於模擬生產環境。
  2. 配置相應的流控規則,用於能力驗證。
  3. 流量測試。

image.png

基礎場景搭建

我們使用MSE服務治理中熱點參數防護功能來實現生產環境可控的流控能力驗證。

本文以常見的長鏈路調用場景爲例,介紹生產環境下進行可控範圍內的流控能力驗證的過程,搭建的具體流程不再介紹,可詳見MSE產品help文檔 [ 1]

模擬場景使用如下後端場景,後端共有3個服務:應用A、應用B、應用C。這3個服務之間通過MSE Nacos註冊中心實現服務發現。客戶可以通過客戶端後者HTML來訪問後端服務。客戶的請求到達網關後,調用鏈路爲 :用戶>MSE雲原生網關>A>B>C。

說明:我們的要求是對於指定帶標籤的流量,任何配置相應流控規則的應用都應起到流控作用。對於從網關到應用A的流量,因攜帶標籤,熱點參數防護功能可以生效。但是對於應用A至應用B的流量,會丟失流量中的標籤,我們需要額外標籤透傳的功能,才能保證應用B得到攜帶標籤的流量,從而使得熱點參數防護功能可以生效。

image

名詞解釋:

  • MSE雲原生網關:MSE雲原生網關是兼容K8s Ingress標準的下一代網關產品,支持ACK容器和Nacos等多種服務發現方式,支持多種認證登錄方式快速構建安全防線。更多信息,請參見雲原生網關概述 [ 2]
  • 帶標籤請求:請求中的header帶指定kv
  • 標籤透傳請求:正常的RPC請求,即應用A到應用B的請求是不會攜帶前置請求的header信息。如果是標籤透傳,前置請求中指定header將會攜帶後續的請求中

流控配置

我們希望僅僅對線上可控範圍內的流量進行流控驗證,比如用戶等級比較低的請求流量,或者是內部用戶的測試流量,從而在不會對線上的服務造成影響的前提下足夠地驗證流控能力。

我們模擬如上場景,標識特定的流量請求header中加入key爲limit,value爲true的參數值,特定的流量會被流控規則所控制最大請求範圍,並且保證正常的請求流量不會受到任何影響。

然後我們對應用A、應用B加入熱點參數防護,用於後續方案可行性驗證。該操作對header含有limit:true的請求進行流控,爲了效果明顯,設定流控生效的qps閾值爲20(即qps超過20時,請求將會被拒絕)。

在MSE服務治理中,爲應用配置熱點參數防護的具體過程如下。

3.1 應用A流控規則配置

  1. 我們只需在mse服務治理頁面配置如下熱點參數防護能力,就能實現針對特定流量的流控配置。

在應用a中依次選擇 選擇流量 > 流量防護 > 熱點參數防護(HTTP請求) > 新增熱點參數防護。

image

2.爲接口/a加入如下配置防護規則。

image

  1. 針對指定的請求配置流控規則,比如下圖所示header值爲limit且value爲true的流量會被當前配置的流控規則控制最大的QPS閾值20。

image.png

3.2 應用B流控規則配置

應用B按照應用A一樣配置。

  1. 在應用b中依次選擇 選擇流量 > 流量防護 > 熱點參數防護(HTTP請求) > 新增熱點參數防護。

  2. 爲接口/b加入如下配置防護規則。

image

  1. 針對指定的請求配置流控規則,比如下圖所示header值爲limit且value爲true的流量會被當前配置的流控規則控制最大的QPS閾值20。

image

流量測試

在配置完成後,爲了模擬生產環境,我們將會依次發送正常請求、被標記請求,檢驗流控對正常請求和被標記請求是否生效。

我們首先根據如下步驟,獲取入口地址:

  1. 登錄MSE網關管理控制檯,並在頂部菜單欄選擇地域。
  2. 在左側導航欄,選擇雲原生網關 > 網關列表,單擊目標網關名稱。
  3. 在左側導航欄,單擊基本概覽。
  4. 在網關入口頁籤,查看SLB的入口地址(ip)。

在獲取入口地址之後,我們將會對/a接口依次進行如下流量測試。

4.1 正常請求無流控

  1. 向/a接口持續發送無標籤的請求。

  2. 可在輸出中發現請求沒有任何限制,均是正常返回,返回如下。

A[192.168.0.98] -> B[192.168.0.57] -> C[192.168.0.56]

4.2 被標記請求應用A流控生效

  1. 向/a接口持續發送含標籤請求(header含有limit:true)。

  2. 當qps超過20時,請求出現限流信息,限流信息如下。

Blocked by Sentinel (flow limiting)

4.3 被標記請求應用B無流控

  1. 關閉A服務的流控限制。

  2. 向/a接口持續發送含標籤請求(header含有limit:true)。

  3. 可在輸出中發現請求沒有任何限制,均是正常返回,返回如下。

A[192.168.0.98] -> B[192.168.0.57] -> C[192.168.0.56]

說明:如果沒有開啓標籤透傳,應用A調應用B的請求無法將header透傳。從而無法滿足對於指定帶標籤的流量,任何配置相應流控規則的應用都應起到流控作用的效果。

4.4 配置透傳,被標記請求應用B流控生效

  1. 爲應用A配置header透傳。在k8s集羣中尋找到spring-cloud-a服務,在環境變量中加入變量名稱:alicloud.service.header ,變量引用:limit。

說明:MSE服務治理使用agent技術,可以使得流量中的header透傳

image

image

  1. 向/a接口發送含標籤請求(header含有limit:true)。

  2. 當qps超過20時,請求出現限流信息,限流信息如下。(報錯是因爲A沒有拿到B的正常信息)。

{"timestamp":"2023-04-24T06:35:46.835+0000","status":500,"error":"Internal Server Error","message":"429 null","path":"/a"}

說明:在配置標籤透傳情況下,可滿足對於指定帶標籤的流量,任何配置相應流控規則的應用都應起到流控作用的效果。

總結

到目前爲止,我們通過MSE的熱點參數防護與自定義header透傳能力的組合,實現了僅針對有特定標識流量的流控能力。這使得我們可以在不影響業務的情況下,在生產環境中做可控範圍內的流控能力驗證。相較於另外搭建整套預生產環境來驗證流控能力來說,該方案的成本更低,且更能直接驗證到生產環境中流控規則以及流控後的 Fallback 行爲的表現,做到真正的心中有數。

在本文中我們僅僅使用了MSE服務治理中的流量控制功能。然而對於微服務架構來說,生產場景中的每一個組件、每一個環節都至關重要。MSE微服務治理提供微服務各個環節的治理解決方案,旨在幫助企業快速落地完整且健壯的微服務體系。MSE服務治理可以在不修改任何代碼和配置的情況下,降低微服務治理的成本,實現以下多種功能:

  1. 低成本實現微服務敏捷開發:包括服務契約、服務測試、開發環境隔離等。
  2. 全面消除變更過程中的風險:包括無損下線、無損上線、全鏈路灰度等。
  3. 全面消除運行過程中的穩定性問題:包括流量控制、離羣實例摘除、熔斷降級等。

image

歡迎大家使用MSE服務治理並提出寶貴意見。

相關鏈接:

[1] MSE產品help文檔

https://help.aliyun.com/document_detail/478140.html?spm=a2c4g.475424.0.0.3297305eEXZQ1t

[2] 雲原生網關概述

https://help.aliyun.com/document_detail/270868.htm#concept-2083330

點擊此處進入微服務引擎 MSE 官網查看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章