SpringBoot整合resilience4j實(shí)現(xiàn)接口限流
最近在開發(fā)項(xiàng)目的時(shí)候,需要用到限流的功能,搜索資料發(fā)現(xiàn),最近resilience4j這個(gè)框架還是挺火的,使用了一下還是挺簡單實(shí)用的。這篇博客主要是SpringBoot簡單整合resilience4j框架實(shí)現(xiàn)接口限流功能。
Resilience4j是一個(gè)用于增強(qiáng)容錯(cuò)能力的Java庫,旨在幫助開發(fā)人員構(gòu)建可靠的分布式系統(tǒng)。它基于斷路器模式和其他容錯(cuò)模式,提供了一組輕量級(jí)的、可組合的容錯(cuò)模塊,如斷路器、限流器、重試等。其原理如下:
- 斷路器模式:Resilience4j主要基于斷路器模式,當(dāng)被保護(hù)的服務(wù)或資源發(fā)生故障或長時(shí)間不可用時(shí),斷路器會(huì)打開,從而避免對(duì)該服務(wù)的連續(xù)請(qǐng)求,減輕了服務(wù)的負(fù)載,快速失敗,同時(shí)能夠提供降級(jí)或備用方案。
- 限流器模式:Resilience4j提供了限流器模式來控制請(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ù)不同的異常類型進(jìn)行針對(duì)性的重試。
- 異步支持:Resilience4j支持異步操作,可以在異步任務(wù)中使用各種容錯(cuò)模塊??梢允褂肅ompletableFuture、RxJava或Java 8的CompletionStage進(jìn)行異步編程。
- 配置靈活:Resilience4j提供了靈活的配置選項(xiàng),可以根據(jù)具體的需求對(duì)每個(gè)容錯(cuò)模塊進(jìn)行個(gè)性化配置??梢酝ㄟ^代碼或者配置文件進(jìn)行配置,也可以使用注解來標(biāo)記需要增加容錯(cuò)功能的方法。
總之,Resilience4j利用斷路器模式、限流器模式、重試機(jī)制等容錯(cuò)模式,結(jié)合靈活的配置選項(xiàng)和異步支持,幫助開發(fā)人員構(gòu)建可靠、彈性的分布式系統(tǒng)。
這里Resilience4j只簡單實(shí)現(xiàn)接口限流功能。
版本說明
- SpringBoot 2.5.15版本
- JDK8
代碼開發(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
不能起作用,畢竟它是通過AOP來實(shí)現(xiàn)功能的。
application配置
resilience4j: # resilience4j的配置開始,用于增加服務(wù)彈性的庫 ratelimiter: #限流機(jī)制的配置,用于防止過多的請(qǐng)求涌入系統(tǒng) instances: ratelimitApi: # 第一個(gè)限流策略實(shí)例的名稱 limit-for-period: 5 # 在一個(gè)特定的時(shí)間周期內(nèi),允許的最大請(qǐng)求數(shù)量為5 limit-refresh-period: 1s # 時(shí)間周期長度為1s,即每秒會(huì)重置請(qǐng)求計(jì)數(shù) timeout-duration: 100ms # 當(dāng)請(qǐng)求超過限制時(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)求過于頻繁,稍后再試",HttpStatus.OK); } }
ratelimitApi
是在application.yml
中配置的名稱,從這里也可以知道,不同的接口可以使用不同的限流策略,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)求過于頻繁,稍后再試
最后一個(gè)線程無法正常請(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)文章希望大家以后多多支持腳本之家!
- 詳解Springboot集成sentinel實(shí)現(xiàn)接口限流入門
- Spring Boot接口限流的常用算法及特點(diǎn)
- SpringBoot如何使用自定義注解實(shí)現(xiàn)接口限流
- SpringBoot Redis用注釋實(shí)現(xiàn)接口限流詳解
- SpringBoot使用Redis對(duì)用戶IP進(jìn)行接口限流的示例詳解
- SpringBoot使用Redis對(duì)用戶IP進(jìn)行接口限流的項(xiàng)目實(shí)踐
- Springboot項(xiàng)目接口限流實(shí)現(xiàn)方案
- SpringBoot+Resilience4j實(shí)現(xiàn)接口限流的示例代碼
相關(guān)文章
java如何多線程批量更新10萬級(jí)的數(shù)據(jù)
在處理大數(shù)據(jù)量的批量更新時(shí),直接使用mybatis的updateBatch可能導(dǎo)致效率低下甚至OOM,通過每次處理5000條數(shù)據(jù)的方式雖然安全但效率低,更優(yōu)的解決方案是使用多線程處理,將數(shù)據(jù)分批并多線程執(zhí)行,有效提高了處理速度并保證了系統(tǒng)穩(wěn)定性2024-10-10springboot?靜態(tài)方法中使用@Autowired注入方式
這篇文章主要介紹了springboot?靜態(tài)方法中使用@Autowired注入方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02一文徹底弄懂Java中MultipartFile接口和File類
MultipartFile是一個(gè)接口,我們可以理解為是Spring?給我們綁定的一個(gè)在使用文件上傳等時(shí)簡便實(shí)現(xiàn)的口子,這篇文章主要給大家介紹了關(guān)于如何通過一文徹底弄懂Java中MultipartFile接口和File類的相關(guān)資料,需要的朋友可以參考下2023-11-11FastJson對(duì)于JSON格式字符串、JSON對(duì)象及JavaBean之間的相互轉(zhuǎn)換操作
這篇文章主要介紹了FastJson對(duì)于JSON格式字符串、JSON對(duì)象及JavaBean之間的相互轉(zhuǎn)換,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11Mybatis實(shí)現(xiàn)SQL存儲(chǔ)流程詳解
MyBatis作為一款優(yōu)秀的持久層框架,它支持自定義SQL、存儲(chǔ)過程以及高級(jí)映射。它免除了幾乎所有的JDBC代碼以及設(shè)置參數(shù)和獲取結(jié)果集的工作2023-03-03SpringBoot基于MyBatis-Plus實(shí)現(xiàn)Lambda Query查詢的示例代碼
MyBatis-Plus 是 MyBatis 的增強(qiáng)工具,簡化了數(shù)據(jù)庫操作,并提高了開發(fā)效率,它提供了多種查詢方式,包括常規(guī)的 SQL 查詢、Lambda Query 查詢、分頁查詢、條件查詢等,在本篇博客中,我們將詳細(xì)講解如何使用 MyBatis-Plus 的各種查詢方式,需要的朋友可以參考下2025-01-01Struts2學(xué)習(xí)教程之Action類如何訪問WEB資源
這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)教程之Action類如何訪問WEB資源的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04