SpringCloud 限流、熔斷、降級(jí)的區(qū)別及實(shí)現(xiàn)
前言
在微服務(wù)架構(gòu)中,Spring Cloud 提供了一系列的工具和技術(shù)來(lái)保障系統(tǒng)的穩(wěn)定性和可靠性。其中,限流、熔斷和降級(jí)是三個(gè)重要的概念,它們?cè)诓煌膱?chǎng)景下發(fā)揮著關(guān)鍵作用。本文將詳細(xì)介紹 Spring Cloud 中限流、熔斷和降級(jí)的區(qū)別,并探討它們的具體實(shí)現(xiàn)方式。
一、限流、熔斷、降級(jí)的概念
(一)限流
限流是指在一段時(shí)間內(nèi),限制系統(tǒng)能夠處理的請(qǐng)求數(shù)量,以防止系統(tǒng)因過(guò)多的請(qǐng)求而崩潰。限流可以有效地保護(hù)系統(tǒng)的資源,確保系統(tǒng)在高負(fù)載情況下仍然能夠正常運(yùn)行。
例如,一個(gè)電商網(wǎng)站在促銷活動(dòng)期間,可能會(huì)面臨大量的用戶請(qǐng)求。如果不進(jìn)行限流,系統(tǒng)可能會(huì)因?yàn)闊o(wú)法處理這么多請(qǐng)求而崩潰,導(dǎo)致用戶無(wú)法訪問(wèn)網(wǎng)站。通過(guò)限流,可以限制每秒能夠處理的請(qǐng)求數(shù)量,確保系統(tǒng)不會(huì)被過(guò)多的請(qǐng)求壓垮。
(二)熔斷
熔斷是指在系統(tǒng)出現(xiàn)故障或異常情況時(shí),自動(dòng)切斷對(duì)故障服務(wù)的調(diào)用,以防止故障擴(kuò)散。當(dāng)系統(tǒng)檢測(cè)到某個(gè)服務(wù)出現(xiàn)故障時(shí),會(huì)立即停止對(duì)該服務(wù)的調(diào)用,并返回一個(gè)預(yù)設(shè)的錯(cuò)誤響應(yīng)。這樣可以避免因一個(gè)服務(wù)的故障而影響整個(gè)系統(tǒng)的穩(wěn)定性。
例如,一個(gè)微服務(wù)架構(gòu)中的訂單服務(wù)依賴于支付服務(wù)。如果支付服務(wù)出現(xiàn)故障,訂單服務(wù)在調(diào)用支付服務(wù)時(shí)會(huì)一直等待,導(dǎo)致訂單服務(wù)也無(wú)法正常工作。通過(guò)熔斷機(jī)制,訂單服務(wù)可以在檢測(cè)到支付服務(wù)故障時(shí),立即停止調(diào)用支付服務(wù),并返回一個(gè)“支付服務(wù)暫時(shí)不可用”的錯(cuò)誤響應(yīng),從而避免影響用戶的下單體驗(yàn)。
(三)降級(jí)
降級(jí)是指在系統(tǒng)出現(xiàn)故障或高負(fù)載情況下,降低系統(tǒng)的功能或性能,以保證系統(tǒng)的核心功能能夠正常運(yùn)行。降級(jí)可以是主動(dòng)的,也可以是被動(dòng)的。主動(dòng)降級(jí)是指在系統(tǒng)設(shè)計(jì)時(shí)就考慮到可能出現(xiàn)的故障情況,并提前制定好降級(jí)策略。被動(dòng)降級(jí)是指在系統(tǒng)出現(xiàn)故障時(shí),根據(jù)實(shí)際情況臨時(shí)采取的降級(jí)措施。
例如,一個(gè)在線教育平臺(tái)在高負(fù)載情況下,可能會(huì)出現(xiàn)視頻播放卡頓的情況。為了保證用戶能夠正常學(xué)習(xí),可以采取降級(jí)措施,將視頻的清晰度降低,或者暫停一些非核心功能,如在線討論等,以保證視頻播放的流暢性。
二、限流、熔斷、降級(jí)的區(qū)別
(一)目的不同
- 限流:主要目的是限制系統(tǒng)的請(qǐng)求數(shù)量,防止系統(tǒng)因過(guò)多的請(qǐng)求而崩潰,保護(hù)系統(tǒng)的資源。
- 熔斷:主要目的是在系統(tǒng)出現(xiàn)故障時(shí),自動(dòng)切斷對(duì)故障服務(wù)的調(diào)用,防止故障擴(kuò)散,保證系統(tǒng)的穩(wěn)定性。
- 降級(jí):主要目的是在系統(tǒng)出現(xiàn)故障或高負(fù)載情況下,降低系統(tǒng)的功能或性能,保證系統(tǒng)的核心功能能夠正常運(yùn)行。
(二)觸發(fā)條件不同
- 限流:通常是在系統(tǒng)負(fù)載達(dá)到一定程度時(shí)觸發(fā),例如每秒請(qǐng)求數(shù)量超過(guò)了系統(tǒng)的處理能力。
- 熔斷:通常是在系統(tǒng)檢測(cè)到某個(gè)服務(wù)出現(xiàn)故障時(shí)觸發(fā),例如服務(wù)響應(yīng)時(shí)間過(guò)長(zhǎng)、服務(wù)拋出異常等。
- 降級(jí):可以在系統(tǒng)出現(xiàn)故障、高負(fù)載、資源緊張等情況下觸發(fā)。
(三)處理方式不同
- 限流:通過(guò)限制請(qǐng)求數(shù)量來(lái)保護(hù)系統(tǒng),可能會(huì)拒絕部分請(qǐng)求,或者將請(qǐng)求放入隊(duì)列中等待處理。
- 熔斷:自動(dòng)切斷對(duì)故障服務(wù)的調(diào)用,返回預(yù)設(shè)的錯(cuò)誤響應(yīng)。
- 降級(jí):降低系統(tǒng)的功能或性能,例如降低服務(wù)的質(zhì)量、暫停一些非核心功能等。
三、Spring Cloud 限流的實(shí)現(xiàn)方式
(一)Guava RateLimiter
Guava RateLimiter 是 Google Guava 庫(kù)提供的一種限流工具。它基于令牌桶算法實(shí)現(xiàn),可以限制每秒能夠處理的請(qǐng)求數(shù)量。
使用 Guava RateLimiter 的步驟如下:
- 在項(xiàng)目中引入 Google Guava 庫(kù)的依賴。
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> </dependency>
- 創(chuàng)建 RateLimiter 對(duì)象,并設(shè)置每秒能夠處理的請(qǐng)求數(shù)量。
import com.google.common.util.concurrent.RateLimiter;
public class RateLimiterExample {
public static void main(String[] args) {
// 創(chuàng)建一個(gè)每秒能夠處理 10 個(gè)請(qǐng)求的 RateLimiter 對(duì)象
RateLimiter rateLimiter = RateLimiter.create(10);
// 模擬請(qǐng)求處理
for (int i = 0; i < 20; i++) {
if (rateLimiter.tryAcquire()) {
// 處理請(qǐng)求
System.out.println("處理請(qǐng)求 " + i);
} else {
// 請(qǐng)求被限流
System.out.println("請(qǐng)求 " + i + " 被限流");}
}
}
}(二)Spring Cloud Gateway 限流
Spring Cloud Gateway 是 Spring Cloud 提供的一個(gè) API 網(wǎng)關(guān),可以實(shí)現(xiàn)請(qǐng)求的路由、過(guò)濾和限流等功能。
使用 Spring Cloud Gateway 限流的步驟如下:
- 在項(xiàng)目中引入 Spring Cloud Gateway 的依賴。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
- 在配置文件中配置限流規(guī)則。
spring:
cloud:
gateway:
routes:
- id: myroute
uri: http://localhost:8080
predicates:
- Path=/myapi/**
filters:
- name: RequestRateLimiter
args:
key-resolver: '#{@pathKeyResolver}'
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20在上面的配置中,我們使用了 Redis 作為限流的存儲(chǔ)介質(zhì),并設(shè)置了每秒能夠處理的請(qǐng)求數(shù)量為 10,突發(fā)容量為 20。
- 創(chuàng)建 KeyResolver 接口的實(shí)現(xiàn)類,用于確定限流的鍵。
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Configuration
public class RateLimitConfig {
@Bean
public KeyResolver pathKeyResolver() {
return exchange -> Mono.just(exchange.getRequest().getPath().toString());
}
}在上面的代碼中,我們創(chuàng)建了一個(gè) KeyResolver 接口的實(shí)現(xiàn)類,用于根據(jù)請(qǐng)求的路徑確定限流的鍵。
四、Spring Cloud 熔斷的實(shí)現(xiàn)方式
(一)Hystrix
Hystrix 是 Netflix 開(kāi)源的一個(gè)庫(kù),用于實(shí)現(xiàn)服務(wù)的熔斷、降級(jí)和隔離等功能。它通過(guò)斷路器模式來(lái)實(shí)現(xiàn)熔斷功能,當(dāng)服務(wù)出現(xiàn)故障時(shí),斷路器會(huì)自動(dòng)打開(kāi),阻止對(duì)故障服務(wù)的調(diào)用,直到服務(wù)恢復(fù)正常。
使用 Hystrix 的步驟如下:
在項(xiàng)目中引入 Hystrix 的依賴。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
在服務(wù)方法上添加 @HystrixCommand 注解,并指定熔斷后的回調(diào)方法。
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
@Service
public class MyService {
@HystrixCommand(fallbackMethod = "fallbackMethod")
public String myMethod() {
// 調(diào)用遠(yuǎn)程服務(wù)或執(zhí)行其他可能出現(xiàn)故障的操作
return "正常響應(yīng)";
}
public String fallbackMethod() {
// 熔斷后的回調(diào)方法
return "服務(wù)不可用,請(qǐng)稍后再試";
}
}在上面的代碼中,我們?cè)?myMethod 方法上添加了 @HystrixCommand 注解,并指定了熔斷后的回調(diào)方法 fallbackMethod。當(dāng) myMethod 方法執(zhí)行出現(xiàn)故障時(shí),會(huì)自動(dòng)調(diào)用 fallbackMethod 方法返回預(yù)設(shè)的錯(cuò)誤響應(yīng)。
(二)Resilience4j
Resilience4j 是一個(gè)輕量級(jí)的容錯(cuò)庫(kù),提供了熔斷、重試、限速等功能。它的設(shè)計(jì)理念與 Hystrix 類似,但更加簡(jiǎn)潔和靈活。
使用 Resilience4j 的步驟如下:
在項(xiàng)目中引入 Resilience4j 的依賴。
<dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-spring-boot2</artifactId> <version>1.7.1</version> </dependency>
在服務(wù)方法上添加 @CircuitBreaker 注解,并指定熔斷后的回調(diào)方法。
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
@Service
public class MyService {
@CircuitBreaker(name = "myCircuitBreaker", fallbackMethod = "fallbackMethod")
public String myMethod() {
// 調(diào)用遠(yuǎn)程服務(wù)或執(zhí)行其他可能出現(xiàn)故障的操作
return "正常響應(yīng)";
}
public String fallbackMethod() {
// 熔斷后的回調(diào)方法
return "服務(wù)不可用,請(qǐng)稍后再試";
}
}在上面的代碼中,我們?cè)?myMethod 方法上添加了 @CircuitBreaker 注解,并指定了熔斷后的回調(diào)方法 fallbackMethod。當(dāng) myMethod 方法執(zhí)行出現(xiàn)故障時(shí),會(huì)自動(dòng)調(diào)用 fallbackMethod 方法返回預(yù)設(shè)的錯(cuò)誤響應(yīng)。
五、Spring Cloud 降級(jí)的實(shí)現(xiàn)方式
(一)Hystrix 降級(jí)
在使用 Hystrix 實(shí)現(xiàn)熔斷的同時(shí),也可以實(shí)現(xiàn)降級(jí)功能。在熔斷后的回調(diào)方法中,可以返回一個(gè)預(yù)設(shè)的降級(jí)響應(yīng),或者執(zhí)行一些降級(jí)邏輯,如從緩存中獲取數(shù)據(jù)等。
例如,在上面的 Hystrix 示例中,fallbackMethod 方法就是一個(gè)降級(jí)方法,當(dāng)服務(wù)出現(xiàn)故障時(shí),會(huì)返回一個(gè)預(yù)設(shè)的錯(cuò)誤響應(yīng)。
(二)Spring Cloud 自定義降級(jí)邏輯
除了使用 Hystrix 提供的降級(jí)功能外,還可以在 Spring Cloud 中自定義降級(jí)邏輯。可以通過(guò)實(shí)現(xiàn) FallbackFactory 接口來(lái)創(chuàng)建自定義的降級(jí)方法。
使用自定義降級(jí)邏輯的步驟如下:
創(chuàng)建一個(gè)實(shí)現(xiàn) FallbackFactory 接口的類,并實(shí)現(xiàn) create 方法。
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
@Component
public class MyServiceFallbackFactory implements FallbackFactory<MyService> {
@Override
public MyService create(Throwable cause) {
return new MyService() {
@Override
public String myMethod() {
// 自定義降級(jí)邏輯
return "服務(wù)不可用,請(qǐng)稍后再試";
}
};
}
}在 Feign 客戶端接口上指定降級(jí)工廠類。
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
@FeignClient(name = "myService", fallbackFactory = MyServiceFallbackFactory.class)
public interface MyFeignClient {
@GetMapping("/myapi")
String myMethod();
}在上面的代碼中,我們創(chuàng)建了一個(gè)實(shí)現(xiàn) FallbackFactory 接口的類 MyServiceFallbackFactory,并在 create 方法中實(shí)現(xiàn)了自定義的降級(jí)邏輯。然后,在 Feign 客戶端接口上指定了降級(jí)工廠類為 MyServiceFallbackFactory.class。當(dāng)服務(wù)出現(xiàn)故障時(shí),會(huì)自動(dòng)調(diào)用降級(jí)工廠類中的 create 方法創(chuàng)建一個(gè)降級(jí)對(duì)象,并執(zhí)行降級(jí)對(duì)象中的 myMethod 方法返回預(yù)設(shè)的降級(jí)響應(yīng)。
六、總結(jié)
限流、熔斷和降級(jí)是微服務(wù)架構(gòu)中保障系統(tǒng)穩(wěn)定性和可靠性的重要手段。它們?cè)诓煌膱?chǎng)景下發(fā)揮著不同的作用,但目的都是為了確保系統(tǒng)能夠在各種情況下正常運(yùn)行。
在 Spring Cloud 中,可以使用 Guava RateLimiter、Spring Cloud Gateway 等實(shí)現(xiàn)限流功能;使用 Hystrix、Resilience4j 等實(shí)現(xiàn)熔斷功能;使用 Hystrix 提供的降級(jí)方法或自定義降級(jí)邏輯實(shí)現(xiàn)降級(jí)功能。在實(shí)際應(yīng)用中,可以根據(jù)具體的需求選擇合適的實(shí)現(xiàn)方式,并結(jié)合監(jiān)控和報(bào)警系統(tǒng),及時(shí)發(fā)現(xiàn)和處理系統(tǒng)中的問(wèn)題,保障系統(tǒng)的穩(wěn)定運(yùn)行。
到此這篇關(guān)于SpringCloud 限流、熔斷、降級(jí)的區(qū)別及實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringCloud限流、熔斷、降級(jí)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java前端實(shí)現(xiàn)發(fā)送date類型的參數(shù)給后端
這篇文章主要介紹了Java前端實(shí)現(xiàn)發(fā)送date類型的參數(shù)給后端方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
Spring中@RequestMapping、@RestController和Postman
本文介紹了Spring框架中常用的@RequestMapping和@RestController注解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10
java之向linux文件夾下寫文件無(wú)權(quán)限的問(wèn)題
這篇文章主要介紹了java之向linux文件夾下寫文件無(wú)權(quán)限的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
SpringBoot實(shí)現(xiàn)輕量級(jí)動(dòng)態(tài)定時(shí)任務(wù)管控及組件化的操作步驟
文章介紹了一種在SpringBoot中實(shí)現(xiàn)動(dòng)態(tài)定時(shí)任務(wù)的解決方案,基于COLA架構(gòu)理論,封裝到了組件層,該組件支持類級(jí)別和方法級(jí)別的定時(shí)任務(wù)注冊(cè),并提供了易用性和擴(kuò)展性,組件使用Maven形式引入,并且可以通過(guò)YAML配置文件進(jìn)行設(shè)置,感興趣的朋友一起看看吧2024-11-11
Java通過(guò)正則表達(dá)式獲取字符串中數(shù)字的方法示例
最近工作中遇到了一個(gè)需求,需要利用java獲取字符串中的數(shù)字,嘗試幾種方法后發(fā)現(xiàn)利用正則表達(dá)式實(shí)現(xiàn)最為方法,下面這篇文章就主要介紹了Java通過(guò)正則表達(dá)式獲取字符串中數(shù)字的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下。2017-03-03

