一:高併發帶來的問題?
在微服務架構中,我們將業務拆分成一個個的服務,服務與服務之間可以相互呼叫,但是由於網路原因或者自身的原因,服務並不能保證服務的100%可用,如果單個服務出現問題,呼叫這個服務就會
出現網路延遲,此時若有大量的網路湧入,會形成任務堆積,最終導致服務癱瘓。
由於服務與服務之間的依賴性,故障會傳播,會對整個微服務系統造成災難性的嚴重後果,這就是服務故障的 “雪崩效應” 。
雪崩發生的原因多種多樣,有不合理的容量設計,或者是高併發下某一個方法響應變慢,亦或是某臺機器的資源耗盡。我們無法完全杜絕雪崩源頭的發生,只有做好足夠的容錯,保證在一個服務發生問
題,不會影響到其它服務的正常執行。也就是"雪落而不雪崩"。
二:解決方式引入服務容錯機制
常見的容錯思路有隔離、超時、限流、熔斷、降級這幾種,下面分別介紹一下。
- 隔離:它是指將系統按照一定的原則劃分為若干個服務模組,各個模組之間相對獨立,無強依賴。當有故障發生時,能將問題和影響隔離在某個模組內部,而不擴散風險,不波及其它模組,不影響整體的系統服務。常見的隔離方式有:執行緒池隔離和訊號量隔離.
- 超時:在上游服務呼叫下游服務的時候,設定一個最大響應時間,如果超過這個時間,下游未作出反應,就斷開請求,釋放掉執行緒。
- 限流:限流就是限制系統的輸入和輸出流量已達到保護系統的目的。為了保證系統的穩固執行,一旦達到的需要限制的閾值,就需要限制流量並採取少量措施以完成限制流量的目的。
- 熔斷:在網際網路系統中,當下遊服務因訪問壓力過大而響應變慢或失敗,上游服務為了保護系統整體的可用性,可以暫時切斷對下游服務的呼叫。這種犧牲區域性,保全整體的措施就叫做熔斷。
三:常見的容錯元件
- Hystrix:由Netflix開源的一個延遲和容錯庫,用於隔離訪問遠端系統、服務或者第三方庫,防止級聯失敗,從而提升系統的可用性與容錯性。
- Resilience4J:一款非常輕量、簡單,並且文件非常清晰、豐富的熔斷工具,這也是Hystrix官方推薦的替代產品。不僅如此,Resilicence4j還原生支援Spring Boot 1.x/2.x,而且監控也支援和prometheus等多款主流產品進行整合
- Sentinel: 是阿里巴巴開源的一款斷路器實現,本身在阿里內部已經被大規模採用,非常穩定。
三者之間的區別
Sentinel | Hystrix | resilience4j | |
隔離策略 | 訊號量隔離(併發執行緒數限流) |
執行緒池隔離/訊號量隔離 |
訊號量隔離 |
熔斷降級策略 |
基於響應時間、異常比率、異常數 | 基於異常比率 |
基於異常比率、響應時間 |
實時統計實現 |
滑動視窗(LeapArray) |
滑動視窗(基於 RxJava) |
Ring Bit Buffer |
動態規則配置 |
支援多種資料來源 | 支援多種資料來源 | 有限支援 |
擴充套件性 | 多個擴充套件點 | 外掛的形式 | 介面的形式 |
基於註解的支援 | 支援 | 支援 | 支援 |
限流 | 基於 QPS,支援基於呼叫關係的限流 | 有限的支援 | Rate Limiter |
流量整形 |
支援預熱模式、勻速器模式、預熱排隊模式 |
不支援 |
簡單的 Rate Limiter模式 |
系統自適應保護 | 支援 | 不支援 | 不支援 |
控制檯 |
提供開箱即用的控制檯,可配置規則、檢視秒級監控、機器發現等 |
簡單的監控檢視 |
不提供控制檯,可對接其它監控系統 |
四:Sentinel入門
Sentinel (分散式系統的流量防衛兵) 是阿里開源的一套用於服務容錯的綜合性解決方案。它以流量為切入點, 從流量控制、熔斷降級、系統負載保護等多個維度來保護服務的穩定性。
Sentinel 具有以下特徵:
- 豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景, 例如秒殺(即突發流量控制在系統容量可以承受的範圍)、訊息削峰填谷、叢集流量控制、實時熔斷下游不可用應用等。
- 完備的實時監控:Sentinel 提供了實時的監控功能。通過控制檯可以看到接入應用的單臺機器秒級資料, 甚至 500 臺以下規模的叢集的彙總執行情況。
- 廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模組, 例如與 SpringCloud、Dubbo、gRPC 的整合。只需要引入相應的依賴並進行簡單的配置即可快速地接入Sentinel。
- 完善的 SPI 擴充套件點:Sentinel 提供簡單易用、完善的 SPI 擴充套件介面。您可以通過實現擴充套件介面來快速地定製邏輯。例如定製規則管理、適配動態資料來源等。
Sentinel 分為兩個部分:
- 核心庫(Java 客戶端)不依賴任何框架/庫,能夠執行於所有 Java 執行時環境,同時對 Dubbo /Spring Cloud 等框架也有較好的支援。
- 控制檯(Dashboard)基於 Spring Boot 開發,打包後可以直接執行,不需要額外的 Tomcat 等應用容器。
五:微服務整合Sentinel
1: pom.xml引入依賴
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
2:修改application.yml
spring: cloud: sentinel: transport: dashboard: localhost:8080 # 指定控制檯服務的地址 port: 9999
2:測試Controller
@Slf4j @RestController @RequestMapping("/sentinel") public class SentinelController { @RequestMapping("/mesg1") public String message1(){ return "message1"; } @RequestMapping("/mesg2") public String message2(){ return "message2"; } }
六:安裝Sentinel控制檯
Sentinel 提供一個輕量級的控制檯, 它提供機器發現、單機資源實時監控以及規則管理等功能。
1:下載jar包(本例版本1.7.0)
https://github.com/alibaba/Sentinel/releases
2:啟動控制檯
# 直接使用jar命令啟動專案(控制檯本身是一個SpringBoot專案) java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.7.0.jar
3:啟動成功後如圖(localhost:8080 使用者、密碼:sentinel)
注意點:sentinel預設是懶載入、所以啟動成功後其實頁面是沒有我們整合的微服務資訊,當我們隨便訪問一個介面時才能看到。
簡單測試一個限流功能,針對/sentinel/mesg1做個流控 如下每秒只能呼叫2次,超出則訪問失敗
在瀏覽器快速重新整理多次/sentinel/mesg1效果如圖
Sentinel整合的一個簡單應用到此就實現了,因為Sentinel的功能不單單如此 寫在一篇篇幅感覺過長,所以接下來再寫一篇進行更進一步的學習。