文章目錄
- 1、雪崩問題及解決方案
- 1.1、雪崩問題
- 1.2、超時處理
- 1.3、倉壁模式
- 1.4、斷路器
- 1.5、限流
- 1.6、總結
- 2、服務保護技術對比
- 3、Sentinel介紹和安裝
- 3.1、初識Sentinel
- 3.2、安裝Sentinel
- 4、微服務整合Sentinel
?🍃作者介紹:雙非本科大三網絡工程專業在讀,阿里云專家博主,專注于Java領域學習,擅長web應用開發、數據結構和算法,初步涉獵Python人工智能開發和前端開發。
🦅主頁:@逐夢蒼穹
📕所屬專欄:微服務
? 您的一鍵三連,是我創作的最大動力🌹
1、雪崩問題及解決方案
1.1、雪崩問題
微服務中,服務間調用關系錯綜復雜,一個微服務往往依賴于多個其它微服務。
如圖,如果服務提供者I發生了故障,當前的應用的部分業務因為依賴于服務I,因此也會被阻塞。此時,其它不依賴于服務I的業務似乎不受影響。
但是,依賴服務I的業務請求被阻塞,用戶不會得到響應,則tomcat的這個線程不會釋放,于是越來越多的用戶請求到來,越來越多的線程會阻塞;
服務器支持的線程和并發數有限,請求一直阻塞,會導致服務器資源耗盡,從而導致所有其它服務都不可用,那么當前服務也就不可用了。
那么,依賴于當前服務的其它服務隨著時間的推移,最終也都會變的不可用,形成級聯失敗,雪崩就發生了:
解決雪崩問題的常見方式有四種:
超時處理:設定超時時間,請求超過一定時間沒有響應就返回錯誤信息,不會無休止等待
艙壁模式:限定每個業務能使用的線程數,避免耗盡整個tomcat的資源,因此也叫線程隔離。
熔斷降級:由斷路器統計業務執行的異常比例,如果超出闊值則會熔斷該業務,攔截訪問該業務的一切請求。
流量控制:限制業務訪問的QPS,避免服務因流量的突增而故障。
1.2、超時處理
超時處理:設定超時時間,請求超過一定時間沒有響應就返回錯誤信息,不會無休止等待
1.3、倉壁模式
倉壁模式來源于船艙的設計:
船艙都會被隔板分離為多個獨立空間,當船體破損時,只會導致部分空間進入,將故障控制在一定范圍內,避免整個船體都被淹沒。
與此類似,我們可以限定每個業務能使用的線程數,避免耗盡整個tomcat的資源,因此也叫線程隔離。
1.4、斷路器
斷路器模式:由斷路器統計業務執行的異常比例,如果超出閾值則會熔斷該業務,攔截訪問該業務的一切請求。
斷路器會統計訪問某個服務的請求數量,異常比例:
當發現訪問服務D的請求異常比例過高時,認為服務D有導致雪崩的風險,會攔截訪問服務D的一切請求,形成熔斷:
1.5、限流
流量控制:限制業務訪問的QPS,避免服務因流量的突增而故障。
1.6、總結
什么是雪崩問題?
微服務之間相互調用,因為調用鏈中的一個服務故障,引起整個鏈路都無法訪問的情況。
可以認為:
①限流是對服務的保護,避免因瞬間高并發流量而導致服務故障,進而避免雪崩。是一種預防措施
②超時處理、線程隔離、降級熔斷是在部分服務故障時,將故障控制在一定范圍,避免雪崩。是一種補救措施
2、服務保護技術對比
在SpringCloud當中支持多種服務保護技術:
- Netfix Hystrix
- Sentinel
- Resilience4J
Sentinel中文文檔:introduction | Sentinel (sentinelguard.io)
早期比較流行的是Hystrix框架,但目前國內實用最廣泛的還是阿里巴巴的Sentinel框架,這里我們做下對比:
Sentinel | Hystrix | |
---|---|---|
隔離策略 | 信號量隔離 | 線程池隔離/信號量隔離 |
熔斷降級策略 | 基于慢調用比例或異常比例 | 基于失敗比率 |
實時指標實現 | 滑動窗口 | 滑動窗口(基于 RxJava) |
規則配置 | 支持多種數據源 | 支持多種數據源 |
擴展性 | 多個擴展點 | 插件的形式 |
基于注解的支持 | 支持 | 支持 |
限流 | 基于 QPS,支持基于調用關系的限流 | 有限的支持 |
流量整形 | 支持慢啟動、勻速排隊模式 | 不支持 |
系統自適應保護 | 支持 | 不支持 |
控制臺 | 開箱即用,可配置規則、查看秒級監控、機器發現等 | 不完善 |
常見框架的適配 | Servlet、Spring Cloud、Dubbo、gRPC 等 | Servlet、Spring Cloud Netflix |
3、Sentinel介紹和安裝
3.1、初識Sentinel
Sentinel是阿里巴巴開源的一款微服務流量控制組件。
官網地址:https://sentinelguard.io/zh-cn/index.html
Sentinel 具有以下特征:
豐富的應用場景:Sentinel 承接了阿里巴巴近 10 年的雙十一大促流量的核心場景,例如秒殺(即突發流量控制在系統容量可以承受的范圍)、消息削峰填谷、集群流量控制、實時熔斷下游不可用應用等。
完備的實時監控:Sentinel 同時提供實時的監控功能。您可以在控制臺中看到接入應用的單臺機器秒級數據,甚至 500 臺以下規模的集群的匯總運行情況。
廣泛的開源生態:Sentinel 提供開箱即用的與其它開源框架/庫的整合模塊,例如與 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相應的依賴并進行簡單的配置即可快速地接入 Sentinel。
完善的SPI擴展點:Sentinel 提供簡單易用、完善的 SPI 擴展接口。您可以通過實現擴展接口來快速地定制邏輯。例如定制規則管理、適配動態數據源等。
3.2、安裝Sentinel
1)下載
sentinel官方提供了UI控制臺,方便我們對系統做限流設置。可以在GitHub下載。
2)運行
下載jar包:
將jar包放到任意非中文目錄,執行命令(跟普通的jar包一個運行方式):
java -jar sentinel-dashboard-1.8.1.jar
如果要修改Sentinel的默認端口、賬戶、密碼,可以通過下列配置:
配置項 | 默認值 | 說明 |
---|---|---|
server.port | 8080 | 服務端口 |
sentinel.dashboard.auth.username | sentinel | 默認用戶名 |
sentinel.dashboard.auth.password | sentinel | 默認密碼 |
例如,修改端口:
java -Dserver.port=8090 -jar sentinel-dashboard-1.8.1.jar
3)訪問
啟動之后:
訪問http://localhost:8080頁面,就可以看到sentinel的控制臺了:
需要輸入賬號和密碼,默認都是:sentinel
登錄后,發現一片空白,什么都沒有:
這是因為還沒有與微服務整合。
4)如果啟動報錯:
則是JDK版本的問題,更換電腦的JDK版本就可以了。
不更換電腦版本的方法:
①去官網(https://www.java.com/zh-CN/download/)下一個jre(注意是jar而不是jdk)
②在虛擬機安裝,然后拷貝安裝目錄下面的內容到物理機
③拷貝完成后,把jar包放在bin目錄下即可啟動
4、微服務整合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的控制臺,查看效果: