天天看點

Spring Cloud Alibaba系列-第8節-Sentinel介紹,安裝1. Sentinel: 分布式系統的流量防衛兵2. 服務限流算法3. 在windows在安裝Sentinel

目錄

1. Sentinel: 分布式系統的流量防衛兵

 1.1 Sentinel 是什麼?

1.2 Sentinel 基本概念

1.3 Sentinel 功能和設計理念

1.3.1 流量控制

1.3.2 熔斷降級

1.3.3 系統自适應保護

2. 服務限流算法

2.1 計數器算法

2.2 滑動視窗算法

2.3 令牌同限流算法

2.4 漏桶限流算法

3. 在windows在安裝Sentinel

3.1 控制台簡介

3.2 安裝包擷取

3.2.1 源碼下載下傳打包

3.2.2 直接下載下傳jar包

3.3 啟動即安裝

3.4 通路控制台

觀博有邏輯,導航來相助《Spring Cloud Alibaba系列-目錄導航》 

1. Sentinel: 分布式系統的流量防衛兵

 1.1 Sentinel 是什麼?

随着微服務的流行,服務和服務之間的穩定性變得越來越重要。Sentinel 以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個次元保護服務的穩定性。

Sentinel 的主要特性:

Spring Cloud Alibaba系列-第8節-Sentinel介紹,安裝1. Sentinel: 分布式系統的流量防衛兵2. 服務限流算法3. 在windows在安裝Sentinel

Sentinel 分為兩個部分:

  • 核心庫(Java 用戶端)不依賴任何架構/庫,能夠運作于所有 Java 運作時環境,同時對 Dubbo / Spring Cloud 等架構也有較好的支援。
  • 控制台(Dashboard)基于 Spring Boot 開發,打包後可以直接運作,不需要額外的 Tomcat 等應用容器。

1.2 Sentinel 基本概念

資源:資源是 Sentinel 的關鍵概念。它可以是 Java 應用程式中的任何内容,例如,由應用程式提供的服務,或由應用程式調用的其它應用提供的服務,甚至可以是一段代碼。隻要通過 Sentinel API 定義的代碼,就是資源,能夠被 Sentinel 保護起來。大部分情況下,可以使用方法簽名,URL,甚至服務名稱作為資源名來标示資源。

規則:

圍繞資源的實時狀态設定的規則,可以包括流量控制規則、熔斷降級規則以及系統保護規則。所有規則可以動态實時調整。

1.3 Sentinel 功能和設計理念

1.3.1 流量控制

什麼是流量控制:

流量控制在網絡傳輸中是一個常用的概念,它用于調整網絡包的發送資料。然而,從系統穩定性角度考慮,在處理請求的速度上,也有非常多的講究。任意時間到來的請求往往是随機不可控的,而系統的處理能力是有限的。我們需要根據系統的處理能力對流量進行控制。Sentinel 作為一個調配器,可以根據需要把随機的請求調整成合适的形狀,如下圖所示:

Spring Cloud Alibaba系列-第8節-Sentinel介紹,安裝1. Sentinel: 分布式系統的流量防衛兵2. 服務限流算法3. 在windows在安裝Sentinel

流量控制設計理念:

流量控制有以下幾個角度:

  • 資源的調用關系,例如資源的調用鍊路,資源和資源之間的關系;
  • 運作名額,例如 QPS、線程池、系統負載等;
  • 控制的效果,例如直接限流、冷啟動、排隊等。

1.3.2 熔斷降級

什麼是熔斷降級:

除了流量控制以外,及時對調用鍊路中的不穩定因素進行熔斷也是 Sentinel 的使命之一。由于調用關系的複雜性,如果調用鍊路中的某個資源出現了不穩定,可能會導緻請求發生堆積,進而導緻級聯錯誤。

Sentinel 和 Hystrix 的原則是一緻的: 當檢測到調用鍊路中某個資源出現不穩定的表現,例如請求響應時間長或異常比例升高的時候,則對這個資源的調用進行限制,讓請求快速失敗,避免影響到其它的資源而導緻級聯故障。

熔斷降級設計理念:

在限制的手段上,Sentinel 和 Hystrix 采取了完全不一樣的方法。Hystrix 通過 線程池隔離 的方式,來對依賴(在 Sentinel 的概念中對應 資源)進行了隔離。這樣做的好處是資源和資源之間做到了最徹底的隔離。缺點是除了增加了線程切換的成本(過多的線程池導緻線程數目過多),還需要預先給各個資源做線程池大小的配置設定。

Sentinel 對這個問題采取了兩種手段:

  • 通過并發線程數進行限制

和資源池隔離的方法不同,Sentinel 通過限制資源并發線程的數量,來減少不穩定資源對其它資源的影響。這樣不但沒有線程切換的損耗,也不需要您預先配置設定線程池的大小。當某個資源出現不穩定的情況下,例如響應時間變長,對資源的直接影響就是會造成線程數的逐漸堆積。當線程數在特定資源上堆積到一定的數量之後,對該資源的新請求就會被拒絕。堆積的線程完成任務後才開始繼續接收請求。

  • 通過響應時間對資源進行降級

除了對并發線程數進行控制以外,Sentinel 還可以通過響應時間來快速降級不穩定的資源。當依賴的資源出現響應時間過長後,所有對該資源的通路都會被直接拒絕,直到過了指定的時間視窗之後才重新恢複。

1.3.3 系統自适應保護

Sentinel 同時提供系統次元的自适應保護能力。防止雪崩,是系統防護中重要的一環。當系統負載較高的時候,如果還持續讓請求進入,可能會導緻系統崩潰,無法響應。在叢集環境下,網絡負載均衡會把本應這台機器承載的流量轉發到其它的機器上去。如果這個時候其它的機器也處在一個邊緣狀态的時候,這個增加的流量就會導緻這台機器也崩潰,最後導緻整個叢集不可用。

針對這個情況,Sentinel 提供了對應的保護機制,讓系統的入口流量和系統的負載達到一個平衡,保證系統在能力範圍之内處理最多的請求。

2. 服務限流算法

要實作限流,就要使用限流算法,下面介紹四種限流的算法。

2.1 計數器算法

計數器算法以周期為機關,在周期内累加通路次數,當周期内通路次數達到門檻值,觸發限流政策,進入到下一個周期自動清零。

如下圖:

限定周期為一分鐘,最大門檻值為100,在第一個周期内内有60次請求,未觸發限流門檻值

在第二個一分鐘,進行清零,再第二個周期某一時刻達到100次請求,觸發限流。

Spring Cloud Alibaba系列-第8節-Sentinel介紹,安裝1. Sentinel: 分布式系統的流量防衛兵2. 服務限流算法3. 在windows在安裝Sentinel

計數算法的問題:

如下圖:

同樣的場景,但是在第一個周期内的第58秒和第二個周期的第2秒,分别出現99個請求,此時未觸發門檻值

但是卻是在4秒的時間達到接近200的并發,未能進行有效的限流,是以存在這種臨界值的問題

Spring Cloud Alibaba系列-第8節-Sentinel介紹,安裝1. Sentinel: 分布式系統的流量防衛兵2. 服務限流算法3. 在windows在安裝Sentinel

2.2 滑動視窗算法

為了解決計數器算法帶來的臨界值算法,是以引入了活動視窗算法。滑動視窗算法的原理是在固定視窗中分割多個小的時間視窗,分别在每個小的時間視窗中記錄通路次數,根據時間往前滑動并删除過期的小時間視窗,隻需要統計滑動視窗範圍内的所有小時間視窗總的數量。sentinel就是采用此種方式進行限流 。

如下圖:

将一分鐘拆分四個時間視窗,每個時間視窗處理25個請求,通過虛線表示視窗的滑動。在0~30s是兩個時間視窗,代表每30s能通過50個請求。

在經過15秒後,視窗移動到15~45s時間處,在此時間内最多能有50個請求。

Spring Cloud Alibaba系列-第8節-Sentinel介紹,安裝1. Sentinel: 分布式系統的流量防衛兵2. 服務限流算法3. 在windows在安裝Sentinel

2.3 令牌同限流算法

對于每一個請求,需要在令牌桶中取得一個令牌,如果沒有獲得令牌,則觸發限流。

如下圖:

系統以恒定速度向令牌桶中放入令牌,如果請求過來,先在令牌桶中擷取令牌後才能發送請求。

桶是有固定大小的,如果沒有請求,那麼桶在填滿後就不再放入令牌。但是此時桶是滿的,是以令牌桶可以處理突發的流量,在短時間内新增的流量能夠正常處理,這是桶令牌的特性。

假設令牌生成速度是每秒100個,就是每秒的QPS為10

請求速度大于令牌生成速度:令牌消耗完畢,後續限流

請求速度等于令牌生成速度:流量處于平穩狀态

請求速度小于令牌生成速度:并發不高,能夠正常處理

Spring Cloud Alibaba系列-第8節-Sentinel介紹,安裝1. Sentinel: 分布式系統的流量防衛兵2. 服務限流算法3. 在windows在安裝Sentinel

2.4 漏桶限流算法

漏桶限流算法的主要作用是控制資料注入網絡的速度,平滑網絡的突發流量。

如下圖:

與令牌桶相同,維護一個桶容器,容器以恒定速度出水

以恒定的速度出水,不管上面的速度多快,漏桶速度不變

當水流入速度過大會直接溢出(通路頻率超過接口響應速率),然後就拒絕請求,可以看出漏桶算法能強行限制資料的傳輸速率

Spring Cloud Alibaba系列-第8節-Sentinel介紹,安裝1. Sentinel: 分布式系統的流量防衛兵2. 服務限流算法3. 在windows在安裝Sentinel

3. 在windows在安裝Sentinel

3.1 控制台簡介

Sentinel 控制台提供一個輕量級的控制台,它提供機器發現、單機資源實時監控、叢集資源彙總,以及規則管理的功能。您隻需要對應用進行簡單的配置,就可以使用這些功能。

3.2 安裝包擷取

3.2.1 源碼下載下傳打包

操作步驟如下:

a. 進行源碼的下載下傳 https://github.com/alibaba/Sentinel

b. 源碼解壓:如 F:\spring-cloud-alibaba\Sentinel-master(解壓後的目錄)

c. 在 F:\spring-cloud-alibaba\Sentinel-master(解壓後的目錄) 執行“mvn clean”

d. 在 F:\spring-cloud-alibaba\Sentinel-master(解壓後的目錄) 執行"mvn package -DskipTests" 

e. 在 “F:\spring-cloud-alibaba\Sentinel-master\sentinel-dashboard\target”  檔案夾中,會看到sentinel-dashboard.jar包

3.2.2 直接下載下傳jar包

下載下傳位址:https://github.com/alibaba/Sentinel/releases

Spring Cloud Alibaba系列-第8節-Sentinel介紹,安裝1. Sentinel: 分布式系統的流量防衛兵2. 服務限流算法3. 在windows在安裝Sentinel

3.3 啟動即安裝

java -jar sentinel-dashboard-1.7.1.jar
           

3.4 通路控制台

在浏覽器輸入http://localhost:8080/即可通路,賬号和密碼為:sentinel/sentinel

Spring Cloud Alibaba系列-第8節-Sentinel介紹,安裝1. Sentinel: 分布式系統的流量防衛兵2. 服務限流算法3. 在windows在安裝Sentinel

3.5 修改consumer-8001和provider-7001兩個微服務

3.5.1. 修改pom檔案

在consumer-8001和provider-7001 pom中增加sentinel jar包

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

 3.5.2 增加配置

在application.properties中增加如下配置:sentinel控制台位址

# sentinel dashboard
spring.cloud.sentinel.transport.dashboard=localhost:8080
           

3.5.3 啟動服務,發起請求

下圖中左側菜單中的consumer-8001和provider-7001是需要在浏覽器發起消費者請求後(http://localhost:8001/echo/feign/1111)在會出現,詳情檢視之間的博文

Spring Cloud Alibaba系列-第8節-Sentinel介紹,安裝1. Sentinel: 分布式系統的流量防衛兵2. 服務限流算法3. 在windows在安裝Sentinel

繼續閱讀