SpringBoot整合resilience4j實(shí)現(xiàn)接口限流
最近在開(kāi)發(fā)項(xiàng)目的時(shí)候,需要用到限流的功能,搜索資料發(fā)現(xiàn),最近resilience4j這個(gè)框架還是挺火的,使用了一下還是挺簡(jiǎn)單實(shí)用的。這篇博客主要是SpringBoot簡(jiǎn)單整合resilience4j框架實(shí)現(xiàn)接口限流功能。
Resilience4j是一個(gè)用于增強(qiáng)容錯(cuò)能力的Java庫(kù),旨在幫助開(kāi)發(fā)人員構(gòu)建可靠的分布式系統(tǒng)。它基于斷路器模式和其他容錯(cuò)模式,提供了一組輕量級(jí)的、可組合的容錯(cuò)模塊,如斷路器、限流器、重試等。其原理如下:
- 斷路器模式:Resilience4j主要基于斷路器模式,當(dāng)被保護(hù)的服務(wù)或資源發(fā)生故障或長(zhǎng)時(shí)間不可用時(shí),斷路器會(huì)打開(kāi),從而避免對(duì)該服務(wù)的連續(xù)請(qǐng)求,減輕了服務(wù)的負(fù)載,快速失敗,同時(shí)能夠提供降級(jí)或備用方案。
- 限流器模式:Resilience4j提供了限流器模式來(lái)控制請(qǐng)求的流量。限流器可以被配置為每秒鐘、每分鐘或每小時(shí)允許的最大請(qǐng)求數(shù)。當(dāng)請(qǐng)求數(shù)超出限制時(shí),可以選擇拒絕請(qǐng)求、返回錯(cuò)誤信息或放入隊(duì)列等處理方式。
- 重試機(jī)制:Resilience4j提供了靈活的重試機(jī)制,可以在服務(wù)調(diào)用失敗時(shí)自動(dòng)重試,減少因臨時(shí)故障造成的服務(wù)不可用時(shí)間??梢耘渲弥卦嚨拇螖?shù)、重試的間隔等參數(shù),還可以根據(jù)不同的異常類(lèi)型進(jìn)行針對(duì)性的重試。
- 異步支持:Resilience4j支持異步操作,可以在異步任務(wù)中使用各種容錯(cuò)模塊??梢允褂肅ompletableFuture、RxJava或Java 8的CompletionStage進(jìn)行異步編程。
- 配置靈活:Resilience4j提供了靈活的配置選項(xiàng),可以根據(jù)具體的需求對(duì)每個(gè)容錯(cuò)模塊進(jìn)行個(gè)性化配置。可以通過(guò)代碼或者配置文件進(jìn)行配置,也可以使用注解來(lái)標(biāo)記需要增加容錯(cuò)功能的方法。
總之,Resilience4j利用斷路器模式、限流器模式、重試機(jī)制等容錯(cuò)模式,結(jié)合靈活的配置選項(xiàng)和異步支持,幫助開(kāi)發(fā)人員構(gòu)建可靠、彈性的分布式系統(tǒng)。
這里Resilience4j只簡(jiǎn)單實(shí)現(xiàn)接口限流功能。
版本說(shuō)明
- SpringBoot 2.5.15版本
- JDK8
代碼開(kāi)發(fā)整合
引入Jar
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
引入Jar包特別要注意版本,我的SpringBoot版本是2.5.15,所以我的resilience4j使用的是spring-boot2版本,且resilience4j-spring-boot2必須不能高于1.7.1,不然不兼容。
第二還要注意引入spring-boot-starter-aop,不然resilience4j不能起作用,畢竟它是通過(guò)AOP來(lái)實(shí)現(xiàn)功能的。
application配置
resilience4j: # resilience4j的配置開(kāi)始,用于增加服務(wù)彈性的庫(kù)
ratelimiter: #限流機(jī)制的配置,用于防止過(guò)多的請(qǐng)求涌入系統(tǒng)
instances:
ratelimitApi: # 第一個(gè)限流策略實(shí)例的名稱(chēng)
limit-for-period: 5 # 在一個(gè)特定的時(shí)間周期內(nèi),允許的最大請(qǐng)求數(shù)量為5
limit-refresh-period: 1s # 時(shí)間周期長(zhǎng)度為1s,即每秒會(huì)重置請(qǐng)求計(jì)數(shù)
timeout-duration: 100ms # 當(dāng)請(qǐng)求超過(guò)限制時(shí),客戶端應(yīng)立即收到超時(shí)的響應(yīng),而不等待處理
控制器實(shí)現(xiàn)
@RestController
@Slf4j
public class Resilience4jController {
@GetMapping("ratelimit")
@RateLimiter(name="ratelimitApi",fallbackMethod = "fallback")
public ResponseEntity<String> ratelimitApi(){
log.info("request ratelimitApi");
return new ResponseEntity<>("success",HttpStatus.OK);
}
public ResponseEntity fallback(Throwable e){
log.error("fallback exception , {}",e.getMessage());
return new ResponseEntity<>("您請(qǐng)求過(guò)于頻繁,稍后再試",HttpStatus.OK);
}
}
ratelimitApi是在application.yml中配置的名稱(chēng),從這里也可以知道,不同的接口可以使用不同的限流策略,fallbackMethod是指當(dāng)出現(xiàn)異常的時(shí)候調(diào)用的方法,即為降級(jí)服務(wù)方法。
多線程測(cè)試
import org.springframework.web.client.RestTemplate;
public class ThreadTest {
public static void main(String[] args) {
for(int i=0;i<5;i++){
new Thread(()->{
System.out.println(new RestTemplate().getForObject("http://localhost:8080/ratelimit",String.class));
}).start();
}
}
}
限流設(shè)定是每秒只能處理5個(gè)請(qǐng)求,所以我這邊用5個(gè)線程的時(shí)候,都是正常的
success
success
success
success
success
之后我調(diào)整為6個(gè)線程
success
success
success
success
success
您請(qǐng)求過(guò)于頻繁,稍后再試
最后一個(gè)線程無(wú)法正常請(qǐng)求,實(shí)現(xiàn)效果。
Resilience4j還有其他強(qiáng)大的功能,等我慢慢研究一下。
到此這篇關(guān)于SpringBoot整合resilience4j實(shí)現(xiàn)接口限流的文章就介紹到這了,更多相關(guān)SpringBoot resilience4j接口限流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中SimpleDateFormat 的多線程安全問(wèn)題
本文主要介紹了java中SimpleDateFormat 的多線程安全問(wèn)題,包括其內(nèi)部可變狀態(tài)和競(jìng)爭(zhēng)條件,文章提供了四種解決方案,下面就來(lái)詳細(xì)的介紹一下2026-02-02
java常用的定時(shí)任務(wù)框架及相關(guān)代碼應(yīng)用示例
在Java開(kāi)發(fā)中,定時(shí)任務(wù)是一個(gè)常見(jiàn)的需求,比如定時(shí)備份數(shù)據(jù)、定時(shí)清理日志、定時(shí)發(fā)送郵件等,這篇文章主要介紹了java常用的定時(shí)任務(wù)框架及相關(guān)代碼應(yīng)用的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-11-11
Java使用ByteBuffer進(jìn)行多文件合并和拆分的代碼實(shí)現(xiàn)
因?yàn)轵?yàn)證證書(shū)的需要,需要把證書(shū)文件和公鑰給到客戶,考慮到多個(gè)文件交互的不便性,所以決定將2個(gè)文件合并成一個(gè)文件交互給客戶,但是由于是加密文件,采用字符串形式合并后,拆分后文件不可用,本文給大家介紹了Java使用ByteBuffer進(jìn)行多文件合并和拆分,需要的朋友可以參考下2024-09-09
mybatis-plus無(wú)法通過(guò)logback-spring輸出的解決方法
本文主要介紹了mybatis-plus無(wú)法通過(guò)logback-spring輸出,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Hibernate中樂(lè)觀鎖的實(shí)現(xiàn)示例
Hibernate的樂(lè)觀鎖通過(guò)版本號(hào)機(jī)制實(shí)現(xiàn)并發(fā)控制,在數(shù)據(jù)更新時(shí)檢查版本號(hào)是否一致,下面就來(lái)介紹一下樂(lè)觀鎖如何實(shí)現(xiàn),感興趣的可以了解一下2026-01-01
SpringBoot2入門(mén)自動(dòng)配置原理及源碼分析
這篇文章主要為大家介紹了SpringBoot2入門(mén)自動(dòng)配置原理及源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Java Spring @Autowired的這些騷操作,你都知道嗎
這篇文章主要介紹了徹底搞明白Spring中的自動(dòng)裝配和Autowired注解的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-09-09
Java中finally關(guān)鍵字對(duì)返回值的影響詳解
這篇文章主要介紹了Java中finally關(guān)鍵字對(duì)返回值的影響詳解,執(zhí)行完try catch里面內(nèi)容準(zhǔn)備return時(shí),如果還有finally需要執(zhí)行這是編譯器會(huì)為我們?cè)黾右粋€(gè)全局變量去暫存return 的值,等到finally執(zhí)行完成去return這個(gè)全局變量,需要的朋友可以參考下2024-01-01

