alibaba限流組件Sentinel

alibaba限流組件Sentinel


一.Sentinel 是什麼二.Sentinel 的歷史三.Sentinel 基本概念 3.1.資源 3.2.規則四.Sentinel 功能和設計理念 4.1.流量控制 4.1.1.什麼是流量控制 4.1.2.流量控制設計理念 4.2.熔斷降級 4.2.1.什麼是熔斷降級 4.2.2.熔斷降級設計理念 4.3.系統負載保護五.Sentinel 是如何工作的六.實戰演練 6.1.maven導入 6.2.application.properties配置 6.3.SpringBoot啟動類 6.4.SentinelTest測試類 6.5.啟動Sentinel及頁面展示 6.7.啟動springBoot測試類 6.8.postman啟動測試 6.9.再次進入Sentinel控制檯 6.10.`test`接口限流 6.11.流控配置 6.12.實時監控

一.Sentinel 是什麼

隨著微服務的流行,服務和服務之間的穩定性變得越來越重要。 Sentinel 是面向分佈式服務架構的輕量級流量控制產品,主要以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度來幫助您保護服務的穩定性。

二.Sentinel 的歷史

  • 2012 年, Sentinel 誕生,主要功能為入口流量控制。
  • 2013-2017 年, Sentinel 在阿里巴巴集團內部迅速發展,成為基礎技術模塊,覆蓋了所有的核心場景。 Sentinel 也因此積累了大量的流量歸整場景以及生產實踐。
  • 2018 年, Sentinel 開源。

三.Sentinel 基本概念

3.1.資源

資源是 Sentinel 的關鍵概念。它可以是 Java 應用程序中的任何內容,例如,由應用程序提供的服務,或由應用程序調用的其它應用提供的服務,甚至可以是一段代碼。在接下來的文檔中,我們都會用資源來描述代碼塊。

只要通過 SentinelAPI 定義的代碼,就是資源,能夠被 Sentinel 保護起來。大部分情況下,可以使用方法簽名,URL,甚至服務名稱作為資源名來標示資源。

3.2.規則

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

四.Sentinel 功能和設計理念

4.1.流量控制

4.1.1.什麼是流量控制

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

alibaba限流組件Sentinel

4.1.2.流量控制設計理念

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

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

Sentinel 的設計理念是讓您自由選擇控制的角度,並進行靈活組合,從而達到想要的效果。

4.2.熔斷降級

4.2.1.什麼是熔斷降級

除了流量控制以外,降低調用鏈路中的不穩定資源也是 Sentinel 的使命之一。由於調用關係的複雜性,如果調用鏈路中的某個資源出現了不穩定,最終會導致請求發生堆積。這個問題和 Hystrix裡面描述的問題是一樣的。

Sentinel 和 Hystrix 的原則是一致的: 當調用鏈路中某個資源出現不穩定,例如,表現為 timeout,異常比例升高的時候,則對這個資源的調用進行限制,並讓請求快速失敗,避免影響到其它的資源,最終產生雪崩的效果。

4.2.2.熔斷降級設計理念

在限制的手段上, Sentinel 和 Hystrix 採取了完全不一樣的方法。

Hystrix 通過線程池的方式,來對依賴(在我們的概念中對應資源)進行了隔離。這樣做的好處是資源和資源之間做到了最徹底的隔離。缺點是除了增加了線程切換的成本,還需要預先給各個資源做線程池大小的分配。

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

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

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

4.3.系統負載保護

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

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

五.Sentinel 是如何工作的

Sentinel 的主要工作機制如下:

  • 對主流框架提供適配或者顯示的 API,來定義需要保護的資源,並提供設施對資源進行實時統計和調用鏈路分析。
  • 根據預設的規則,結合對資源的實時統計信息,對流量進行控制。同時, Sentinel 提供開放的接口,方便您定義及改變規則。
  • Sentinel 提供實時的監控系統,方便您快速瞭解目前系統的狀態。

六.實戰演練

6.1.maven導入

相關 jar包:1. spring-boot-starter-web2. spring-cloud-starter-alibaba-sentinel3. spring-boot-starter-parent

  1. <parent>
  2. <groupid>
  3. org.springframework.boot
  4. <artifactid>
  5. spring-boot-starter-parent
  6. <version>
  7. 2.0.5.RELEASE
  8. <relativepath>
  9. <properties>
  10. <project.build.sourceencoding>
  11. UTF-8
  12. <project.reporting.outputencoding>
  13. UTF-8
  14. <java.version>
  15. 1.8
  16. <dependencies>
  17. <dependency>
  18. <groupid>
  19. org.springframework.boot
  20. <artifactid>
  21. spring-boot-starter-web
  22. <dependency>
  23. <groupid>
  24. org.projectlombok
  25. <artifactid>
  26. lombok
  27. <version>
  28. 1.18.2
  29. <optional>
  30. true
  31. <dependency>
  32. <groupid>
  33. org.springframework.cloud
  34. <artifactid>
  35. spring-cloud-starter-alibaba-sentinel
  36. <dependency>
  37. <groupid>
  38. org.springframework.boot
  39. <artifactid>
  40. spring-boot-starter-test
  41. <scope>
  42. test

6.3.application.properties配置

  1. spring
  2. .
  3. application
  4. .
  5. name
  6. =
  7. SentinelTest
  8. server
  9. .
  10. port
  11. =
  12. 10021
  13. spring
  14. .
  15. cloud
  16. .
  17. sentinel
  18. .
  19. transport
  20. .
  21. dashboard
  22. =
  23. localhost
  24. :
  25. 8080

6.4.SpringBoot啟動類

  1. @SpringBootApplication
  2. public
  3. class
  4. SpringcloudsentineltestApplication
  5. {
  6. public
  7. static
  8. void
  9. main
  10. (
  11. String
  12. []
  13. args
  14. )
  15. {
  16. SpringApplication
  17. .
  18. run
  19. (
  20. SpringcloudsentineltestApplication
  21. .
  22. class
  23. ,
  24. args
  25. );
  26. }
  27. }

6.5.SentinelTest測試類

  1. @RestController
  2. @Slf4j
  3. public
  4. class
  5. SentinelTest
  6. {
  7. @GetMapping
  8. (
  9. "/test"
  10. )
  11. public
  12. String
  13. test
  14. ()
  15. {
  16. return
  17. "OK"
  18. ;
  19. }
  20. }

6.6.啟動及頁面展示

下載 sentinel-dashboard-1.4.0.jar到本地以後,雙擊啟動即可,在瀏覽器輸入 http://localhost:8080,見到如下圖即可表示啟動成功。

alibaba限流組件Sentinel

6.7.啟動springBoot測試類

按下圖操作,點擊啟動按鈕即可

alibaba限流組件Sentinel

6.8.postman啟動測試

在postman頁面輸入 http://localhost:10021/test,進行測試即可,收到OK,表示測試成功

alibaba限流組件Sentinel

6.9.再次進入Sentinel控制檯

進入sentinel控制檯,刷新控制檯,會見到如下頁面:

alibaba限流組件Sentinel

6.10. test接口限流

點擊 簇點鏈路,會見到如下頁面

alibaba限流組件Sentinel

6.11.流控配置

點擊頁面中的`流控`按鈕,則彈出配置頁面,測試配置的單機閾值:3,如下圖

alibaba限流組件Sentinel

6.12.實時監控

回到postman,快速請求接口,再次回到 Sentinel,查看實時監控, QPS最高是3,剩下的請求都會被限制住,如圖所示

alibaba限流組件Sentinel


分享到:


相關文章: