Sentinel 斷路器在Spring Cloud使用詳解
Sentinel 介紹
隨著微服務(wù)的流行,服務(wù)和服務(wù)之間的穩(wěn)定性變得越來(lái)越重要。Sentinel 是面向分布式、多語(yǔ)言異構(gòu)化服務(wù)架構(gòu)的流量治理組件,主要以流量為切入點(diǎn),從流量路由、流量控制、流量整形、熔斷降級(jí)、系統(tǒng)自適應(yīng)過(guò)載保護(hù)、熱點(diǎn)流量防護(hù)等多個(gè)維度來(lái)幫助開(kāi)發(fā)者保障微服務(wù)的穩(wěn)定性。
同類對(duì)比
Hystrix:
- 熔斷器:當(dāng)服務(wù)調(diào)用失敗率達(dá)到閾值時(shí),自動(dòng)熔斷,避免雪崩。
- 降級(jí):提供 fallback 機(jī)制,在服務(wù)不可用時(shí)返回默認(rèn)值或執(zhí)行備用邏輯。
- 隔離:通過(guò)線程池或信號(hào)量隔離資源,防止單個(gè)服務(wù)的故障影響整個(gè)系統(tǒng)。
- 監(jiān)控:提供 Hystrix Dashboard 實(shí)時(shí)監(jiān)控服務(wù)狀態(tài)。
Sentinel:
- 流量控制:支持 QPS、線程數(shù)等多種維度的限流。
- 熔斷降級(jí):基于響應(yīng)時(shí)間、異常比例等指標(biāo)進(jìn)行熔斷。
- 熱點(diǎn)參數(shù)限流:針對(duì)特定參數(shù)(如用戶 ID)進(jìn)行精細(xì)化限流。
- 系統(tǒng)自適應(yīng)保護(hù):根據(jù)系統(tǒng)負(fù)載(如 CPU 使用率)動(dòng)態(tài)調(diào)整流量。
- 實(shí)時(shí)監(jiān)控:提供 Dashboard 實(shí)時(shí)查看流量、熔斷等信息。
微服務(wù)雪崩問(wèn)題
微服務(wù)調(diào)用鏈路中的某個(gè)服務(wù)故障,引起整個(gè)鏈路中的所有微服務(wù)都不可用,這就是雪崩。
問(wèn)題原因
微服務(wù)相互調(diào)用,服務(wù)提供者出現(xiàn)故障或阻塞。
服務(wù)調(diào)用者沒(méi)有做好異常處理,導(dǎo)致自身故障。
調(diào)用鏈中的所有服務(wù)級(jí)聯(lián)失敗,導(dǎo)致整個(gè)集群故障
問(wèn)題解決方案
盡量避免服務(wù)出現(xiàn)故障或阻塞。
保證代碼的健壯性;
保證網(wǎng)絡(luò)暢通;
能應(yīng)對(duì)較高的并發(fā)請(qǐng)求;
服務(wù)調(diào)用者做好遠(yuǎn)程調(diào)用異常的后備方案,避免故障擴(kuò)散
請(qǐng)求限流
請(qǐng)求限流:限制訪問(wèn)微服務(wù)的請(qǐng)求的并發(fā)量,避免服務(wù)因流量激增出現(xiàn)故障。
線程隔離
線程隔離:也叫做艙壁模式,模擬船艙隔板的防水原理。通過(guò)限定每個(gè)業(yè)務(wù)能使用的線程數(shù)量而將故障業(yè)務(wù)隔離,避免故障擴(kuò)散。
失敗處理
快速失敗:給業(yè)務(wù)編寫(xiě)一個(gè)調(diào)用失敗時(shí)的處理的邏輯,稱為fallback。當(dāng)調(diào)用出現(xiàn)故障(比如無(wú)線程可用)時(shí),按照失敗處理邏輯執(zhí)行業(yè)務(wù)并返回,而不是直接拋出異常。
服務(wù)熔斷
服務(wù)熔斷:由斷路器統(tǒng)計(jì)請(qǐng)求的異常比例或慢調(diào)用比例,如果超出閾值則會(huì)熔斷該業(yè)務(wù),則攔截該接口的請(qǐng)求。
熔斷期間,所有請(qǐng)求快速失敗,全都走fallback邏輯。
解決雪崩問(wèn)題的常見(jiàn)方案有哪些?
請(qǐng)求限流:限制流量在服務(wù)可以處理的范圍,避免因突發(fā)流量而故障
線程隔離:控制業(yè)務(wù)可用的線程數(shù)量,將故障隔離在一定范圍
服務(wù)熔斷:將異常比例過(guò)高的接口斷開(kāi),拒絕所有請(qǐng)求,直接走fallback
失敗處理:定義fallback邏輯,讓業(yè)務(wù)失敗時(shí)不再拋出異常,而是返回默認(rèn)數(shù)據(jù)或友好提示
Sentinel
Sentinel是阿里巴巴開(kāi)源的一款微服務(wù)流量控制組件。官網(wǎng)地址: https://sentinelguard.io/zh-cn/index.html
docker 安裝
docker search sentinel docker pull bladex/sentinel-dashboard # 簡(jiǎn)化 docker run --name sentinel -p 8858:8858 -d bladex/sentinel-dashboard:latest # 開(kāi)機(jī)啟動(dòng) docker run --name sentinel --restart=always -p 8858:8858 -p 8719:8719 -d bladex/sentinel-dashboard:latest
賬號(hào)/ 密碼
用戶名/密碼:sentinel / sentinel
項(xiàng)目導(dǎo)入
<!--nacos配置管理--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--讀取bootstrap文件--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <!--sentinel配置--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency>
- spring.cloud.sentinel.transport.dashboard:
- 這個(gè)配置指定了 Sentinel 控制臺(tái)的地址。Sentinel 控制臺(tái)用于監(jiān)控和管理流量控制規(guī)則、熔斷降級(jí)規(guī)則等。
- 你配置的地址是 127.0.0.1:8858,表示 Sentinel 控制臺(tái)運(yùn)行在本地的 8858 端口。
- spring.cloud.sentinel.http-method-specify:
- 這個(gè)配置項(xiàng)設(shè)置為 true,表示開(kāi)啟請(qǐng)求方式前綴。
- 當(dāng)這個(gè)選項(xiàng)開(kāi)啟時(shí),Sentinel 會(huì)根據(jù) HTTP 請(qǐng)求方法(如 GET、POST 等)來(lái)區(qū)分資源。例如,GET:/api/resource 和 POST:/api/resource 會(huì)被視為不同的資源,從而可以針對(duì)不同的 HTTP 方法設(shè)置不同的流控規(guī)則。
spring: cloud: sentinel: transport: dashboard: 127.0.0.1:8858 http-method-specify: true # 開(kāi)啟請(qǐng)求方式前綴
除了上述配置,Sentinel 還支持其他一些常用配置,例如:
- spring.cloud.sentinel.eager: 是否在應(yīng)用啟動(dòng)時(shí)立即初始化 Sentinel。默認(rèn)為 false,表示在首次訪問(wèn)時(shí)初始化。
- spring.cloud.sentinel.filter.enabled: 是否啟用 Sentinel 的 Web 過(guò)濾器。默認(rèn)為 true。
- spring.cloud.sentinel.metric.file-single-size: 單個(gè)監(jiān)控日志文件的大小。默認(rèn)為 52428800(50MB)。
- spring.cloud.sentinel.metric.file-total-count: 最多保留的監(jiān)控日志文件數(shù)量。默認(rèn)為 6
spring: cloud: sentinel: transport: dashboard: 127.0.0.1:8858 # Sentinel 控制臺(tái)地址 http-method-specify: true # 開(kāi)啟請(qǐng)求方式前綴 eager: true # 應(yīng)用啟動(dòng)時(shí)立即初始化 Sentinel filter: enabled: true # 啟用 Sentinel 的 Web 過(guò)濾器 metric: file-single-size: 52428800 # 單個(gè)監(jiān)控日志文件的大小 file-total-count: 6 # 最多保留的監(jiān)控日志文件數(shù)量
Feign 集成 Sentinel 的作用
- 流量控制:限制 Feign 客戶端的調(diào)用頻率,防止下游服務(wù)被壓垮。
- 熔斷降級(jí):當(dāng)下游服務(wù)出現(xiàn)異?;蝽憫?yīng)時(shí)間過(guò)長(zhǎng)時(shí),快速失敗并執(zhí)行降級(jí)邏輯。
- 系統(tǒng)保護(hù):通過(guò) Sentinel 的規(guī)則配置,保護(hù)系統(tǒng)的穩(wěn)定性。
feign: sentinel: enabled: true # 啟用 Feign 的 Sentinel 支持
簇點(diǎn)鏈路
簇點(diǎn)鏈路,就是單機(jī)調(diào)用鏈路。是一次請(qǐng)求進(jìn)入服務(wù)后經(jīng)過(guò)的每一個(gè)被Sentinel監(jiān)控的資源鏈。默認(rèn)Sentinel會(huì)監(jiān)控SpringMVC的每一個(gè)Endpoint(http接口)。限流、熔斷等都是針對(duì)簇點(diǎn)鏈路中的資源設(shè)置的。而資源名默認(rèn)就是接口的請(qǐng)求路徑:
請(qǐng)求限流
線程隔離
當(dāng)商品服務(wù)出現(xiàn)阻塞或故障時(shí),調(diào)用商品服務(wù)的購(gòu)物車服務(wù)可能因此而被拖慢,甚至資源耗盡。所以必須限制購(gòu)物車服務(wù)中查詢商品這個(gè)業(yè)務(wù)的可用線程數(shù),實(shí)現(xiàn)線程隔離。
Fallback
FeignClient的Fallback有兩種配置方式:
方式一:FallbackClass,無(wú)法對(duì)遠(yuǎn)程調(diào)用的異常做處理
方式二:FallbackFactory,可以對(duì)遠(yuǎn)程調(diào)用的異常做處理,通常都會(huì)選擇這種
主要用于處理 服務(wù)調(diào)用失敗 的情況,比如服務(wù)掉線、超時(shí)、異常等。它的核心作用是為 Feign 客戶端提供 容錯(cuò)機(jī)制,確保在服務(wù)不可用時(shí),系統(tǒng)仍然能夠正常運(yùn)行或提供有意義的反饋。
服務(wù)掉線時(shí)的處理流程
假設(shè) item-service 服務(wù)掉線,以下是 Feign 客戶端的處理流程:
Feign 客戶端嘗試調(diào)用遠(yuǎn)程服務(wù):
調(diào)用 queryItemByIds 或 deductStock 方法。
由于服務(wù)掉線,F(xiàn)eign 會(huì)拋出異常(如 FeignException)。
FallbackFactory 捕獲異常:
異常會(huì)被 ItemClientFallbackFactory 捕獲。
create 方法中的 Throwable cause 參數(shù)會(huì)包含具體的異常信息。
執(zhí)行降級(jí)邏輯:
對(duì)于 queryItemByIds,返回一個(gè)空列表。
對(duì)于 deductStock,記錄日志并拋出 RuntimeException。
調(diào)用方處理降級(jí)結(jié)果:
如果調(diào)用方是查詢商品列表,可以繼續(xù)使用空列表作為返回值。
如果調(diào)用方是扣減庫(kù)存,需要捕獲 RuntimeException 并決定是否重試或回滾事務(wù)。
@Slf4j public class ItemClientFallbackFactory implements FallbackFactory<ItemClient> { @Override public ItemClient create(Throwable cause) { return new ItemClient() { @Override public List<ItemDTO> queryItemByIds(Collection<Long> ids) { log.error("查詢商品失敗!", cause); return CollUtils.emptyList(); } @Override public void deductStock(List<OrderDetailDTO> items) { log.error("扣減商品庫(kù)存失敗!", cause); throw new RuntimeException(cause); } }; } }
注入配置類
public class FallbackConfig { @Bean public ItemClientFallbackFactory itemClientFallbackFactory(){ return new ItemClientFallbackFactory(); } }
@FeignClient 注解:
value = “item-service” 指定了這個(gè) Feign 客戶端將要請(qǐng)求的服務(wù)名稱。
fallbackFactory = ItemClientFallbackFactory.class 提供了容錯(cuò)機(jī)制,當(dāng) item-service 不可用時(shí),會(huì)使用 ItemClientFallbackFactory 生成的降級(jí)邏輯。
@FeignClient(value = "item-service", fallbackFactory = ItemClientFallbackFactory.class) public interface ItemClient { @GetMapping("/items") List<ItemDTO> queryItemByIds(@RequestParam Collection<Long> ids); @PutMapping("/items/stock/deduct") public void deductStock(@RequestParam List<OrderDetailDTO> items); }
服務(wù)熔斷
熔斷是解決雪崩問(wèn)題的重要手段。思路是由斷路器統(tǒng)計(jì)服務(wù)調(diào)用的異常比例、慢請(qǐng)求比例,如果超出閾值則會(huì)熔斷該服務(wù)。即攔截訪問(wèn)該服務(wù)的一切請(qǐng)求;而當(dāng)服務(wù)恢復(fù)時(shí),斷路器會(huì)放行訪問(wèn)該服務(wù)的請(qǐng)求。
到此這篇關(guān)于Sentinel 斷路器在Spring Cloud使用詳解的文章就介紹到這了,更多相關(guān)Spring Cloud使用Sentinel 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 在SpringBoot項(xiàng)目中使用Spring Cloud Sentinel實(shí)現(xiàn)流量控制
- SpringCloud?集成Sentinel的實(shí)戰(zhàn)教程
- Spring?Cloud?中使用?Sentinel?實(shí)現(xiàn)服務(wù)限流的兩種方式
- Spring?Cloud中Sentinel的兩種限流模式介紹
- springcloud3 Sentinel的搭建及案例操作方法
- Spring?Cloud微服務(wù)架構(gòu)Sentinel數(shù)據(jù)雙向同步
- Spring?Cloud?Alibaba微服務(wù)組件Sentinel實(shí)現(xiàn)熔斷限流
- Spring?Cloud?Gateway整合sentinel?實(shí)現(xiàn)流控熔斷的問(wèn)題
- Java之SpringCloudAlibaba Sentinel組件案例講解
相關(guān)文章
Java中FilterInputStream和FilterOutputStream的用法詳解
這篇文章主要介紹了Java中FilterInputStream和FilterOutputStream的用法詳解,這兩個(gè)類分別用于封裝輸入和輸出流,需要的朋友可以參考下2016-06-06Java之定時(shí)器Timer和定時(shí)任務(wù)TimerTask應(yīng)用以及原理解讀
文章介紹了Java JDK自帶的定時(shí)器Timer和定時(shí)任務(wù)TimerTask的使用和原理,Timer和TimerTask成對(duì)出現(xiàn),Timer是定時(shí)器,TimerTask是定時(shí)任務(wù),TimerTask實(shí)現(xiàn)Runnable接口的run方法,Timer的屬性TimerThreadthread繼承Thread2024-12-12Java匿名內(nèi)部類和Lambda(->) 的多種寫(xiě)法總結(jié)
這篇文章主要和大家分享一下Java匿名內(nèi)部類和Lambda(->) 的多種寫(xiě)法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以先看一下2022-07-07Spring依賴注入的兩種方式(根據(jù)實(shí)例詳解)
這篇文章主要介紹了Spring依賴注入的兩種方式(根據(jù)實(shí)例詳解),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05