微服務05-Sentinel流量防衛兵

隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 是面向分布式、多語言異構化服務架構的流量治理組件,主要以 流量 為切入點,從流量路由、流量控制、流量整形、熔斷降級、系統自適應過載保護、熱點流量防護等多個維度來幫助開發者保障微服務的穩定性。

Sentinel是分布式系統的防御系統。

Sentinel 具有以下特征:

?豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的范圍)、消息削峰填谷、集群流量控制、實時熔斷下游不可用應用等。

?完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制臺中看到接入應用的單臺機器秒級數據,甚至 500 臺以下規模的集群的匯總運行情況。

?廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴并進行簡單的配置即可快速地接入 Sentinel。

?完善的 SPI 擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現擴展接口來快速地定制邏輯。例如定制規則管理、適配動態數據源等。

1、微服務整合Sentinel

在order-service中整合sentinel,并連接sentinel的控制臺,步驟如下:

1)引入sentinel依賴

<!--sentinel-->
<dependency><groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2)配置控制臺

修改application.yaml文件,添加下面內容:

server:port: 8088
spring:cloud: sentinel:transport:dashboard: localhost:8080

3)訪問order-service的任意端點

打開瀏覽器,訪問http://localhost:8088/order/101,這樣才能觸發sentinel的監控。

然后再訪問sentinel的控制臺,查看效果:
在這里插入圖片描述

2、流量控制

2.1 簇點鏈路

當請求進入微服務時,首先會訪問DispatcherServlet,然后進入Controller、Service、Mapper,這樣的一個調用鏈就叫做簇點鏈路。簇點鏈路中被監控的每一個接口就是一個資源

默認情況下sentinel會監控SpringMVC的每一個端點(Endpoint,也就是controller中的方法),因此SpringMVC的每一個端點(Endpoint)就是調用鏈路中的一個資源。

訪問的order-service中的OrderController中的端點:/order/{orderId}
在這里插入圖片描述
流控、熔斷等都是針對簇點鏈路中的資源來設置的,因此我們可以點擊對應資源后面的按鈕來設置規則:

  • 流控:流量控制
  • 降級:降級熔斷
  • 熱點:熱點參數限流,是限流的一種
  • 授權:請求的權限控制

2.2 流控模式

在添加限流規則時,點擊高級選項,可以選擇三種流控模式

  • 直接:統計當前資源的請求,觸發閾值時對當前資源直接限流,也是默認的模式
  • 關聯:統計與當前資源相關的另一個資源,觸發閾值時,對當前資源限流
  • 鏈路:統計從指定鏈路訪問到本資源的請求,觸發閾值時,對指定鏈路限流
    在這里插入圖片描述

2.2.1 關聯模式

關聯模式:統計與當前資源相關的另一個資源,觸發閾值時,對當前資源限流

配置規則
在這里插入圖片描述

語法說明:當/write資源訪問量觸發閾值時,就會對/read資源限流,避免影響/write資源。

使用場景:比如用戶支付時需要修改訂單狀態,同時用戶要查詢訂單。查詢和修改操作會爭搶數據庫鎖,產生競爭。業務需求是優先支付和更新訂單的業務,因此當修改訂單業務觸發閾值時,需要對查詢訂單業務限流。

需求說明

  • 在OrderController新建兩個端點:/order/query和/order/update,無需實現業務

  • 配置流控規則,當/order/ update資源被訪問的QPS超過5時,對/order/query請求限流

1)定義/order/query端點,模擬訂單查詢

@GetMapping("/query")
public String queryOrder() {return "查詢訂單成功";
}

2)定義/order/update端點,模擬訂單更新

@GetMapping("/update")
public String updateOrder() {return "更新訂單成功";
}

重啟服務,查看sentinel控制臺的簇點鏈路:
在這里插入圖片描述

3)配置流控規則

對哪個端點限流,就點擊哪個端點后面的按鈕。我們是對訂單查詢/order/query限流,因此點擊它后面的按鈕:
在這里插入圖片描述

在表單中填寫流控規則:
在這里插入圖片描述

4)在Jmeter測試

選擇《流控模式-關聯》:
在這里插入圖片描述

可以看到1000個用戶,100秒,因此QPS為10,超過了我們設定的閾值:5

查看http請求:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FWMh45sB-1691749322999)(assets/image-20210716102532554.png)]

請求的目標是/order/update,這樣這個斷點就會觸發閾值。

但限流的目標是/order/query,我們在瀏覽器訪問,可以發現:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0lJphFmc-1691749322999)(assets/image-20210716102636030.png)]

確實被限流了。

5)總結

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mC4tlSGX-1691749322999)(assets/image-20210716103143002.png)]

2.2.2 鏈路模式

鏈路模式:只針對從指定鏈路訪問到本資源的請求做統計,判斷是否超過閾值。

配置示例

例如有兩條請求鏈路:

  • /test1 --> /common

  • /test2 --> /common

如果只希望統計從/test2進入到/common的請求,則可以這樣配置:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-yA7FOicE-1691749323000)(assets/image-20210716103536346.png)]

實戰案例

需求:有查詢訂單和創建訂單業務,兩者都需要查詢商品。針對從查詢訂單進入到查詢商品的請求統計,并設置限流。

步驟:

  1. 在OrderService中添加一個queryGoods方法,不用實現業務

  2. 在OrderController中,改造/order/query端點,調用OrderService中的queryGoods方法

  3. 在OrderController中添加一個/order/save的端點,調用OrderService的queryGoods方法

  4. 給queryGoods設置限流規則,從/order/query進入queryGoods的方法限制QPS必須小于2

實現:

1)添加查詢商品方法

在order-service服務中,給OrderService類添加一個queryGoods方法:

public void queryGoods(){System.err.println("查詢商品");
}

2)查詢訂單時,查詢商品

在order-service的OrderController中,修改/order/query端點的業務邏輯:

@GetMapping("/query")
public String queryOrder() {// 查詢商品orderService.queryGoods();// 查詢訂單System.out.println("查詢訂單");return "查詢訂單成功";
}

3)新增訂單,查詢商品

在order-service的OrderController中,修改/order/save端點,模擬新增訂單:

@GetMapping("/save")
public String saveOrder() {// 查詢商品orderService.queryGoods();// 查詢訂單System.err.println("新增訂單");return "新增訂單成功";
}

4)給查詢商品添加資源標記

默認情況下,OrderService中的方法是不被Sentinel監控的,需要我們自己通過注解來標記要監控的方法。

給OrderService的queryGoods方法添加@SentinelResource注解:

@SentinelResource("goods")
public void queryGoods(){System.err.println("查詢商品");
}

鏈路模式中,是對不同來源的兩個鏈路做監控。但是sentinel默認會給進入SpringMVC的所有請求設置同一個root資源,會導致鏈路模式失效。

我們需要關閉這種對SpringMVC的資源聚合,修改order-service服務的application.yml文件:

spring:cloud:sentinel:web-context-unify: false # 關閉context整合

重啟服務,訪問/order/query和/order/save,可以查看到sentinel的簇點鏈路規則中,出現了新的資源:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hPhzEyXX-1691749323000)(assets/image-20210716105227163.png)]

5)添加流控規則

點擊goods資源后面的流控按鈕,在彈出的表單中填寫下面信息:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-FPREmb4O-1691749323001)(assets/image-20210716105408723.png)]

只統計從/order/query進入/goods的資源,QPS閾值為2,超出則被限流。

6)Jmeter測試

選擇《流控模式-鏈路》:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UonB7CGB-1691749323001)(assets/image-20210716105612312.png)]

可以看到這里200個用戶,50秒內發完,QPS為4,超過了我們設定的閾值2

一個http請求是訪問/order/save:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7RfN3hql-1691749323002)(assets/image-20210716105812789.png)]

運行的結果:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-P1MyUmF3-1691749323002)(assets/image-20210716110027064.png)]

完全不受影響。

另一個是訪問/order/query:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Kn6TtU90-1691749323003)(assets/image-20210716105855951.png)]

運行結果:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-V70yALoI-1691749323003)(assets/image-20210716105956401.png)]

每次只有2個通過。

2.2.3 總結

流控模式有哪些?

?直接:對當前資源限流

?關聯:高優先級資源觸發閾值,對低優先級資源限流。

?鏈路:閾值統計時,只統計從指定資源進入當前資源的請求,是對請求來源的限流

2.3 流控效果

在流控的高級選項中,還有一個流控效果選項:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-OFcUk5Im-1691749323004)(assets/image-20210716110225104.png)]

流控效果是指請求達到流控閾值時應該采取的措施,包括三種:

  • 快速失敗:達到閾值后,新的請求會被立即拒絕并拋出FlowException異常。是默認的處理方式。

  • warm up:預熱模式,對超出閾值的請求同樣是拒絕并拋出異常。但這種模式閾值會動態變化,從一個較小值逐漸增加到最大閾值。

  • 排隊等待:讓所有的請求按照先后次序排隊執行,兩個請求的間隔不能小于指定時長

2.3.1 warm up

閾值一般是一個微服務能承擔的最大QPS,但是一個服務剛剛啟動時,一切資源尚未初始化(冷啟動),如果直接將QPS跑到最大值,可能導致服務瞬間宕機。

warm up也叫預熱模式,是應對服務冷啟動的一種方案。請求閾值初始值是 maxThreshold / coldFactor,持續指定時長后,逐漸提高到maxThreshold值。而coldFactor的默認值是3.

例如,我設置QPS的maxThreshold為10,預熱時間為5秒,那么初始閾值就是 10 / 3 ,也就是3,然后在5秒后逐漸增長到10.

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2ncGWy3W-1691749323004)(assets/image-20210716110629796.png)]

案例

需求:給/order/{orderId}這個資源設置限流,最大QPS為10,利用warm up效果,預熱時長為5秒

1)配置流控規則:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-ZExScfx8-1691749323005)(assets/image-20210716111012387.png)]

2)Jmeter測試

選擇《流控效果,warm up》:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8V5d1Epq-1691749323005)(assets/image-20210716111136699.png)]

QPS為10.

剛剛啟動時,大部分請求失敗,成功的只有3個,說明QPS被限定在3:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-S3RQemQY-1691749323005)(assets/image-20210716111303701.png)]

隨著時間推移,成功比例越來越高:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-93o0dI8A-1691749323006)(assets/image-20210716111404717.png)]

到Sentinel控制臺查看實時監控:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pRsUrB5F-1691749323007)(assets/image-20210716111526480.png)]

一段時間后:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SIy9IU8g-1691749323007)(assets/image-20210716111658541.png)]

2.3.2 排隊等待

當請求超過QPS閾值時,快速失敗和warm up 會拒絕新的請求并拋出異常。

而排隊等待則是讓所有請求進入一個隊列中,然后按照閾值允許的時間間隔依次執行。后來的請求必須等待前面執行完成,如果請求預期的等待時間超出最大時長,則會被拒絕。

工作原理

例如:QPS = 5,意味著每200ms處理一個隊列中的請求;timeout = 2000,意味著預期等待時長超過2000ms的請求會被拒絕并拋出異常。

那什么叫做預期等待時長呢?

比如現在一下子來了12 個請求,因為每200ms執行一個請求,那么:

  • 第6個請求的預期等待時長 = 200 * (6 - 1) = 1000ms
  • 第12個請求的預期等待時長 = 200 * (12-1) = 2200ms

現在,第1秒同時接收到10個請求,但第2秒只有1個請求,此時QPS的曲線這樣的:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-H86JtDcJ-1691749323008)(assets/image-20210716113147176.png)]

如果使用隊列模式做流控,所有進入的請求都要排隊,以固定的200ms的間隔執行,QPS會變的很平滑:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/37021.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/37021.shtml
英文地址,請注明出處:http://en.pswp.cn/news/37021.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

FBB簡介

FBB FBB簡介FBB組網名詞解釋FBB組網&#xff08;從下至上&#xff09;小結 FBB簡介 FBB&#xff1a;Fixed BroadBand&#xff0c;固定寬帶網絡&#xff0c;是一種依托線纜介質進行傳輸的地面有線網絡&#xff0c;區分與MBB&#xff0c;MBB是移動網絡。 MBB是天上一張網&#x…

學習Vue:簡介和優勢

什么是 Vue.js&#xff1f; Vue.js 是一個用于構建用戶界面的漸進式 JavaScript 框架。它專注于視圖層&#xff0c;并且可以輕松地集成到現有的項目中。Vue.js 的設計理念是漸進式&#xff0c;這意味著您可以根據項目的需要逐步引入 Vue.js&#xff0c;從而更好地控制應用的復…

專注于創意設計,為您的小程序和網站建設帶來更多的可能性

隨著移動互聯網的快速發展&#xff0c;越來越多的企業開始關注小程序和網站建設&#xff0c;以此來拓展業務和提升品牌形象。 在這個領域中&#xff0c;創意設計扮演著關鍵的角色。它不僅可以幫助企業打造獨特的形象和品牌&#xff0c;還能夠提高用戶體驗和購買決策的效率。 因…

Openlayers 實戰 - 地圖視野(View)- 圖層 -(layer)- 資源(source)顯示等級設置。

Openlayers 實戰 - 地圖視野&#xff08;View&#xff09;- 圖層 -&#xff08;layer&#xff09;- 資源&#xff08;source&#xff09;顯示等級設置。 問題原因核心代碼完整代碼&#xff1a;在線示例 在以往的項目維護中&#xff0c;出現一個問題&#xff0c;使用最新高清底圖…

已有公司將ChatGPT集成到客服中心以增強用戶體驗

Ozonetel正在利用ChatGPT來改善客戶體驗。該公司表示&#xff0c;他們通過使用ChatGPT收集與客戶互動過程收集的“語料”能夠更有針對性地提高服務效率&#xff0c;提供個性化的用戶體驗&#xff0c;并實現更高的客戶滿意度。[1] 通過這套解決方案&#xff0c;客服中心將擁有一…

javascript寫一個簡單的閉包例子

當你在JavaScript中創建一個閉包時&#xff0c;你可以將函數定義在另一個函數的內部&#xff0c;并從外部函數中返回該函數。以下是一個簡單的閉包示例&#xff1a; function outerFunction() {var outerVariable "I am from the outer function";function innerFu…

vue 圖片轉pdf

嘗試了集中圖片轉pdf的方式&#xff0c; &#xff08;1&#xff09;最終較為優秀的一種是使用jspdf將圖片轉為pdf&#xff0c;支持JPG/JPEG/PNG/BMP/TIF/TIFF圖片格式轉換&#xff0c;詳見我的另一篇文章&#xff1a; https://blog.csdn.net/Ann_52547/article/details/1322149…

MybatisPlus查詢結果返回值為null

1、問題描述 返回值為null&#xff0c;程序不報錯&#xff0c;但是條數好像是正確的。我出現問題的代碼如下&#xff1a; 1、自定義類StudentMapper繼承了BaseMapper接口 public interface StudentMapper extends BaseMapper<Student> { } 2、使用StudentMapper中的s…

centos 定時腳本檢測tomcat是否啟動,未啟動情況下重新啟動

編寫腳本 tomcatMonitor.sh #!/bin/sh. /etc/profile . ~/.bash_profile#首先用ps -ef | grep tomcat 獲得了tomcat進程信息&#xff0c;這樣出來的結果中會包含grep本身&#xff0c; #因此通過 | grep -v grep 來排除grep本身&#xff0c;然后通過 awk {print $2}來打印出要…

Struts2一次請求參數問題的記錄

最近&#xff0c;一次前端正常請求&#xff0c;但后臺出現請求參數值的變化&#xff0c;導致報錯&#xff0c;問題如下&#xff1a; 從入參request中查看請求參數&#xff0c;是一個Json字符串&#xff0c;其中有個description的鍵值對&#xff1b; 但是&#xff0c;接下來調用…

【需求輸出】用戶故事方法

文章目錄 1、初識用戶故事2、用戶故事是描述需求的最好方式3、創建用戶故事4、用戶故事的分層管理5、編寫用戶故事的工具 1、初識用戶故事 2、用戶故事是描述需求的最好方式 3、創建用戶故事 4、用戶故事的分層管理 5、編寫用戶故事的工具

軟件測試基礎之軟件缺陷處理

一、什么是缺陷 不滿足用戶確定需求、影響軟件功能實現的問題、故障 缺陷就是人們通常所說的bug。 ex.一下哪一種選項不屬于軟件缺陷___。 A.軟件沒有實現產品規格說明所要求的功能 B.軟件中出現了產品規格說明不應該出現的功能 C.軟件實現了產品規格說明沒有提到的功能 D.軟…

Python實現透明隧道爬蟲ip:不影響現有網絡結構

作為一名專業爬蟲程序員&#xff0c;我們常常需要使用隧道代理來保護個人隱私和訪問互聯網資源。本文將分享如何使用Python實現透明隧道代理&#xff0c;以便在保護隱私的同時不影響現有網絡結構。通過實際操作示例和專業的解析&#xff0c;我們將帶您深入了解透明隧道代理的工…

TiDB 應急運維腳本,更加方便的管理TiDB集群

TiDB 應急運維腳本&#xff0c;更加方便的管理TiDB集群 使用方法 使用方法&#xff1a;[tidblocalhost ~]$ which tiup ~/.tiup/bin/tiup編輯腳本&#xff0c;MYSQL_PASSWD 和 PORT 根據實際替換 [tidblocalhost ~]$ vi ~/.tiup/bin/ti#version 1.1 #author guanguanglei ##…

Base64編碼-算法特別的理解

Base64 在DES加密和AES加密的過程中&#xff0c;加密的編碼會出現負數&#xff0c;在ascii碼表中找不到對應的字符&#xff0c;就會出現亂碼。為了解決亂碼的問題&#xff0c;一般結合base64使用 所謂Base64&#xff0c;即是說在編碼過程中使用了64種字符&#xff1a;大寫A到Z、…

【GO】配置環境使加速下載 go 模塊

問題 在使用 go 語言編譯時&#xff0c;需要安裝一些包&#xff0c;這些包在使用 go build 或 go install 時&#xff0c;go 自己去下載&#xff0c;但是會有網絡不通導致無法下載的問題 解決 配置 go 的環境變量 go env -w GOPROXYhttps://goproxy.io,direct

chartGPT生成:python中連接函數的使用

在Python中&#xff0c;連接函數用于將多個字符串拼接在一起。常見的連接函數有join和操作符。 join函數&#xff1a; strings ["Hello", "world", "!"] result " ".join(strings) print(result) # 輸出&#xff1a;Hello world …

Azure資源命名和標記決策指南

參考 azure創建虛擬機在虛擬機中選擇編輯標簽&#xff0c;并添加標記&#xff0c;點擊應用 3.到主頁中轉到所有資源 4. 添加篩選器并應用 5.查看結果&#xff0c;篩選根據給服務器定義的標簽篩選出結果。 參考鏈接: https://learn.microsoft.com/zh-cn/azure/cloud-adoption…

在Java中操作Redis(詳細-->從環境配置到代碼實現)

在Java中操作Redis 文章目錄 在Java中操作Redis1、介紹2、Jedis3、Spring Data Redis3.1、對String的操作3.2、對哈希類型數據的操作3.3、對list的操作3.4、對set類型的操作3.5、對 ZSet類型的數據&#xff08;有序集合&#xff09;3.6、通用類型的操作 1、介紹 Redis 的Java客…

基于Echarts的數據可視化大屏

本項目學習于b站up主&#xff08;視頻鏈接&#xff09; up主分享的資料&#xff0c;gitee倉庫&#xff1a; 其中有筆記&#xff0c;筆記鏈接 項目總結 項目主要分為前端頁面的布局和Echarts圖表的嵌入&#xff0c;頁面主要就是css較為繁瑣&#xff0c;圖表畢竟官網有模板&…