深入理解Sentinel系列-1.初識Sentinel

  • 👏作者簡介:大家好,我是愛吃芝士的土豆倪,24屆校招生Java選手,很高興認識大家
  • 📕系列專欄:Spring源碼、JUC源碼、Kafka原理、分布式技術原理
  • 🔥如果感覺博主的文章還不錯的話,請👍三連支持👍一下博主哦
  • 🍂博主正在努力完成2023計劃中:源碼溯源,一探究竟
  • 📝聯系方式:nhs19990716,加我進群,大家一起學習,一起進步,一起對抗互聯網寒冬👀

文章目錄

  • 限流的作用
  • 限流的算法
    • 計數器
    • 滑動窗口
    • 漏桶
    • 令牌桶
  • 限流的實現
  • Sentinel
    • 服務熔斷
    • demo
    • Sentinel中的流量控制

對于后端來說,我們需要提供一些接口去進行交互,比如登陸注冊,支付下單等這樣的一些功能,所以我們需要搭建一個整體的架構,早期的話可能沒那么復雜,就是通過ssm框架組成的架構,然后通過部署tomcat來提供一個端口,隨著整個并發量上去之后,我們需要去提供高性能的服務。

當我們的客戶端,用戶量的訪問大了之后,對于后端系統的并發量會更高,并發量越高對于后端整個處理的能力就是一個挑戰,因為我們需要保證,用戶從10個到10000個的時候,我們需要提供給用戶的是 它的響應時間不能超過多少。因為用戶的操作是存在一個心理預期的,這就是所謂的用戶體驗。其次就是系統是否能夠支撐這么大的量,是否會掛掉,掛掉之后網站無法提供對外服務的情況下,你無法產生商業價值。

比如說雙十一零點的時候,那一瞬間瞬時的流量一定會大于正常時間的吞吐量,所以需要采用一定的機制來限流

限流的作用

  • 保護系統避免被瞬時流量沖垮
  • 預防惡意請求(如果自己公司不提供安全的話,可以去買高防的服務器)

  • 針對請求進行限制

服務器能支撐的連接數是多少

接口的處理能力(QPS/TPS),可以使用Jmeter來測試平均響應時間

資源限制(cpu(線程池)、內存、網絡資源)


  • 如何控制流量

限流的指標(可以容納的流量、已經容納的流量、可以接受的流量) 閾值(基于這個指標)

限流的過程(通過算法來實現)

限流的結果(處理策略)

限流的算法

計數器

(Zookeeper:RequestThrottle 限流閥)、線程池大小、連接數大小

滑動窗口

實際上發送方和接收方都維護了一個滑動窗口

在這里插入圖片描述

當發送端發送了一個數據包,等到接收端接收到后,接收端窗口開始滑動,發送端需要等待返回后才能滑動

在這里插入圖片描述

其限流的核心就是流量只能在這個窗口里面,但是在tcp里面,其窗口是可以靈活的擴大的,其會根據當前網絡擁擠的程度來決定窗口大小。

最大只能發送五個(閾值),超過了就不能發送了

在這里插入圖片描述

所以說io通信是一個阻塞通信其實就是這樣,基于數據包處理的結果,等到這個數據返回,如果數據一直不返回,那么這個時候請求是阻塞的。

漏桶

(用來控制傳輸速率的)本質上控制的是發送者的速度

在這里插入圖片描述

流入水滴的速率代表的是請求,而滴出水滴的速度代表是處理的請求,不管來的請求有多少,但是能夠處理的請求就這么多。

漏桶算法的特點:

  • 水的流出速度是固定的
  • 桶的大小也是固定的

令牌桶

在這里插入圖片描述

其恒定的生成速率決定了并發數,假如說我每秒生成10個令牌,那么我的qps 就是 10

令牌桶對比漏桶的區別是,其能夠處理瞬時突發流量,而不像漏桶一樣,流出的速度是固定的。

令牌桶的設計:

  • 桶的大小

  • 令牌標記

  • 定時任務生成令牌

  • 提供令牌獲取的接口

限流的實現

Semphore 信號量

分布式限流

其大小怎么計算呢?通過壓測來進行計算

//單機實現
//令牌桶算法RateLimiter rateLimiter=RateLimiter.create(10); //TPS=10public void doRequest(){if(rateLimiter.tryAcquire()){ //獲取令牌System.out.println("success");}else{System.out.println("failed");}}
// 令牌桶不需要釋放,處理完后自動丟棄

Sentinel

Sentinel 是阿里中間件團隊開源的,面向分布式服務架構的輕量級高可用流量控制組件,主要以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度來幫助用戶保護服務的穩定性。

在這里插入圖片描述

其中對于Sentinel最重要的兩個東西:

  • 資源(需要被保護的東西)
  • 規則(限流的規則/熔斷規則)

在這里插入圖片描述

所有的流量經過這個組件后,會根據這個規則去控制這個流量來進行處理。

而熔斷是一個這樣的概念:

在這里插入圖片描述

上圖存在很多相互調用的情況,里面存在很多服務調用的鏈路,當Service D出現故障,會導致G F阻塞,間接的又會導致A B阻塞,如果特別多的請求阻塞在這里之后,會占用特別多的資源,內存、服務器、cpu的資源,這時候會導致服務器因為大量的資源被占用而導致其他問題。

當出現這種情況的時候,會觸發一種熔斷的方式,熔斷以后會觸發降級。

服務熔斷

Sentinel的服務熔斷有兩種方式:基于響應時間的熔斷和基于異常比率的熔斷。基于響應時間的熔斷是根據服務的響應時間來判斷是否需要熔斷,當服務的響應時間超過設定的閾值時,觸發熔斷。基于異常比率的熔斷是根據服務的異常比率來判斷是否需要熔斷,當服務的異常比率超過設定的閾值時,觸發熔斷。這兩種方式可以根據具體的業務場景和需求來選擇使用。

demo

public static void main(String[] arg) {initFlowRule(); //初始化限流規則while(true){//ResourceName表示資源,控制訪問流量的點/*try(Entry entry=SphU.entry("helloWorld")){System.out.println("hello world");}catch (BlockException e){System.out.println("被拒絕");}*/if (SphO.entry("helloWorld")) {System.out.println("Hello World");SphO.exit();// 釋放}}}private static void initFlowRule(){List<FlowRule> rules=new ArrayList<>();FlowRule flowRule=new FlowRule();flowRule.setResource("helloWorld"); //針對那個資源設置規則flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//QPS或者并發數flowRule.setCount(5); //QPS=5rules.add(flowRule);FlowRuleManager.loadRules(rules);}

Demo 運行之后,我們可以在日志 ~/logs/csp/${appName}-metrics.log.xxx 里看到下面的輸出:`

-timestamp- -date time - -resource- 5表示, 通過的請求, block: 被拒絕的請
求 ,
1600608724000|2023-09-20 21:32:04|helloWorld|5|6078|5|0|5|0|0|0
1600608725000|2023-09-20 21:32:05|helloWorld|5|32105|5|0|0|0|0|0
1600608726000|2023-09-20 21:32:06|helloWorld|5|41084|5|0|0|0|0|0
1600608727000|2023-09-20 21:32:07|helloWorld|5|72211|5|0|0|0|0|0
1600608728000|2023-09-20 21:32:08|helloWorld|5|60828|5|0|0|0|0|0
1600608729000|2023-09-20 21:32:09|helloWorld|5|41696|5|0|0|0|0|0

@RestController
public class SentinelController {@AutowiredTestService testService;@GetMapping("/hello/{name}")public String sayHello(@PathVariable("name") String name){return testService.doTest(name);}
}@Service
public class TestService {@SentinelResource(value = "doTest",blockHandler ="blockHandler",fallback = "fallback") //聲明限流的資源public String doTest(String name){return "hello , "+name;}public String blockHandler(String name, BlockException e){ //降級,限流觸發的return "被限流了";}// 降級和限流是不一樣的,限流可以觸發降級,降級是因為已經被觸發了// 降級是第三方業務調用的時候,針對下游的一個返回// 限流是針對當前服務訪問的限制// 這兩個配置只會調用一個public String fallback(String name){ //降級,熔斷觸發的return "被降級了";}}@SpringBootApplication
public class SpringbootSentinelApplication {public static void main(String[] args) {initFlowRule();SpringApplication.run(SpringbootSentinelApplication.class, args);}private static void initFlowRule(){List<FlowRule> rules=new ArrayList<>();FlowRule flowRule=new FlowRule();flowRule.setResource("doTest"); //針對那個資源設置規則flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//QPS或者并發數flowRule.setCount(5); //QPS=5rules.add(flowRule);FlowRuleManager.loadRules(rules);}}

Sentinel中的流量控制

維度 + 規則 + 資源

不管是通過什么樣的方式,其核心原理就是,監控應用流量的qps或者并發線程數的指標,然后去判斷這些指標的閾值去對流量進行控制,防止瞬時流量高峰導致系統被壓垮。

SphU.entry(resourceName) ->

正常,則通過

被限制,拋出 FlowException( FlowException extends BlockException)

同一個資源也可以創建不同的規則,這個主要是通過List rules=new ArrayList<>();實現的,如果有多個規則,會去遍歷,如果發現那個規則被觸發則就執行,否則就順利通過。

一個規則由什么組成?

  • resource 資源
  • count 閾值
  • grade 類型(基于QPS 還是 并發線程數)
  • limitApp,針對的調用來源.
  • strategy , 調用關系限流
  • controlBehavior . (直接拒絕, 冷啟動,勻速排隊)

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

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

相關文章

待做-待補充-每個節點做事,時間,以及與角度的關系

文章目錄 待定內容紅黑樹應用場景限制什么是二叉樹遍歷遞歸遍歷1.前序遍歷 進入節點時2.中序遍歷 遍歷完左子樹回到節點。此操作需要等到所有左樹節點做完后才會做3.后序遍歷 遍歷完左右子樹回到節點。左右子樹的所有節點都做完操作后&#xff0c;回到當前節點才會做此操作 …

如何搭建自己的直播電商系統?

當下&#xff0c;傳統的圖文電商模式已經走向沒落&#xff0c;視頻電商備受追捧。抖音、快手、小紅書、京東、淘寶、拼多多都在發力直播電商業務&#xff0c;尤其是以抖音為首的直播電商備受用戶歡迎&#xff0c;它具有實時直播和強互動的特點&#xff0c;是傳統電商所不具備的…

<HarmonyOS第一課>保存應用數據【課后考核】

【習題】保存應用數據 判斷題 首選項是關系型數據庫。 錯誤(False) 應用中涉及到Student信息&#xff0c;如包含姓名&#xff0c;性別&#xff0c;年齡&#xff0c;身高等信息可以用首選項來存儲。 錯誤(False) 同一應用或進程中每個文件僅存在一個Preferences實例。 正確(T…

最長子串問題(LCS)--動態規劃解法

題目描述&#xff1a; 如果Z既是X的子串&#xff0c;又是Y的子串&#xff0c;則稱Z為X和Y的公共子串。 如果給定X、Y&#xff0c;求出最長Z及其長度。 注意&#xff1a;這里求的不是子序列&#xff0c;兩者的意思并不相同。子串要求連續&#xff0c;子序列并不需要。 如果想…

simulinkveristandlabview聯合仿真環境搭建

目錄 開篇廢話 軟件版本 明確需求 軟件安裝 matlab2020a veristand2020 R4 VS2017 VS2010 軟件安裝驗證 軟件資源分享 開篇廢話 推免之后接到的第一個讓人難繃的活&#xff0c;網上開源的軟件資料和成功的案例很少&#xff0c;查來查去就那么幾篇&#xff0c;而且版本…

SpringData

1.為什么要學習SpringData&#xff1f; 是因為對數據存儲的框架太多了&#xff0c;全部都要學習成本比較高&#xff0c;SpringData對這些數據存儲層做了一個統一&#xff0c;學習成本大大降低。

SQL命令---修改字段的數據類型

介紹 使用sql語句修改字段的數據類型。 命令 alter table 表明 modify 字段名 數據類型;例子 有一張a表&#xff0c;表里有一個id字段&#xff0c;長度為11。使用命令將長度修改為12 下面使用命令進行修改&#xff1a; alter table a modify id int(12) NOT NULL;下面使修…

stm32使用多串口不輸出無反應的問題(usart1、usart2)

在使用stm32c8t6單片機時&#xff0c;由于需要使用兩個串口usart1 、usart2。usart1用作程序燒錄、調試作用&#xff0c;串口2用于與其它模塊進行通信。 使用串口1時&#xff0c;正常工作&#xff0c;使用串口2時&#xff0c;無反應。查閱了相關資料串口2在PA2\PA3 引腳上。RX…

[僅供學習,禁止用于違法]編寫一個程序來手動設置Windows的全局代理開或關,實現對所有網絡請求攔截和數據包捕獲(抓包或VPN的應用)

文章目錄 介紹一、實現原理二、通過注冊表設置代理2.1 開啟代理2.2 關閉代理2.3 添加代理地址2.4 刪除代理設置信息 三、代碼實戰3.1 程序控制代理操作控制3.1.1 開啟全局代理3.1.2 添加代理地址3.1.3 關閉代理開關3.1.4 刪除代理信息 3.2 攔截所有請求 介紹 有一天突發奇想&am…

在git使用SSH密鑰進行github身份認證學習筆記

1.生成ssh密鑰對 官網文檔&#xff1a;Https://docs.github.com/zh/authentication&#xff08;本節內容對應的官方文檔&#xff0c;不清晰的地方可參考此內容&#xff09; 首先&#xff0c;啟動我們的git bush&#xff08;在桌面右鍵&#xff0c;點擊 Git Bush Here &#xf…

iOS_制作 cocopods庫

文章目錄 1.創建項目2.配置項目3.發布 1.創建項目 在 github 上創建倉庫&#xff0c;克隆到本地&#xff1a; git clone https://github.com/mxh-mo/MOOXXX.git在項目目錄下執行&#xff1a; pod lib create <庫名稱>進行一些配置的選擇&#xff1a; # 希望在那個平臺…

隨機分詞與tokenizer(BPE->BBPE->Wordpiece->Unigram->sentencepiece->bytepiece)

0 tokenizer綜述 根據不同的切分粒度可以把tokenizer分為: 基于詞的切分&#xff0c;基于字的切分和基于subword的切分。 基于subword的切分是目前的主流切分方式。subword的切分包括: BPE(/BBPE), WordPiece 和 Unigram三種分詞模型。其中WordPiece可以認為是一種特殊的BPE。完…

實時最優控制(Real-Time Optimal Control)工具

系列文章目錄 前言 許多現代控制方法&#xff0c;如模型預測控制&#xff08;model-predictive control&#xff09;&#xff0c;在很大程度上依賴于實時解決優化問題。特別是&#xff0c;高效解決優化控制問題的能力使復雜機器人系統在實現高動態行為&#xff08;highly dyna…

求Sn=m+mm+mmm+...+mm..mmm(有n個m)的值

題目&#xff1a;求 的值 一、做這個題我們其實可以直接一個for求解&#xff1a; a,aa,aaa...我們很容易知道它們后一項與前一項的關系就是&#xff1b; public static void Sum(int m,int n){long sum 0L;long curAn 0;for (int i 0; i < n; i){curAn m 10* curAn;/…

Qexo博客后臺管理部署

Qexo博客后臺管理部署 個人主頁 個人博客 參考文檔 https://www.oplog.cn/qexo/本地部署 采用本地Docker部署管理本地Hexo 下載代碼包 若無法下載使用科學工具下載到本地在上傳到服務器 wget https://github.com/Qexo/Qexo/archive/refs/tags/3.0.1.zip# 解壓 unzip Qexo…

C++中的前綴和

C中的前綴和&#xff08;Prefix Sum&#xff09;是一種優化算法&#xff0c;用于計算原數組中每個元素前綴和&#xff08;前面所有元素的累加和&#xff09;&#xff0c;可以在O(n)時間內實現。 #include<iostream> using namespace std;const int MAXN 100010;int Pre…

Linux comm命令教程:如何比較兩個文件的內容(附案例詳解和注意事項)

Linux comm命令介紹 comm命令是Linux系統中的一個命令&#xff0c;用于比較兩個已排序的文件或流。默認情況下&#xff0c;comm將始終顯示三列。第一列顯示只在第一個文件中的非匹配項&#xff0c;第二列顯示只在第二個文件中的非匹配項&#xff0c;第三列顯示兩個文件中的匹配…

Java開源工具庫Guava使用指南

Guava是一個功能強大的Java開源工具庫&#xff0c;提供了很多實用的工具類和函數&#xff0c;可以簡化開發過程。本文將介紹Guava的一些基本用法和常用功能。 添加Guava依賴 在開始使用Guava之前&#xff0c;首先需要在項目中添加Guava的依賴。可以通過Maven或Gradle來管理依…

Centos7.9下的celery無法直接使用-沒有找到命令

問題 關于centos7.9下執行celery -A project worker -l debug -P eventlet 找不到celery命令 -bash: celery: command not found 解決辦法 # /usr/local/Python3 為你的python路徑 echo export PATH/usr/local/Python3/bin:$PATH >> /etc/profile.d/python3.sh source /…

在循環內錯誤使用函數定義(js的問題)

考慮下面代碼&#xff1a; var elements document.getElementsByTagName(input); var n elements.length; // Assume we have 10 elements for this example for (var i 0; i < n; i) {elements[i].onclick function() {console.log("This is element #" …