如何使用ratelimiter-spring-boot-starter限流器

這篇文章主要講解了“如何使用ratelimiter-spring-boot-starter限流器”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何使用ratelimiter-spring-boot-starter限流器”吧!

創(chuàng)新互聯(lián) - 四川電信科技城機(jī)房,四川服務(wù)器租用,成都服務(wù)器租用,四川網(wǎng)通托管,綿陽服務(wù)器托管,德陽服務(wù)器托管,遂寧服務(wù)器托管,綿陽服務(wù)器托管,四川云主機(jī),成都云主機(jī),西南云主機(jī),四川電信科技城機(jī)房,西南服務(wù)器托管,四川/成都大帶寬,成都機(jī)柜租用,四川老牌IDC服務(wù)商

ratelimiter-spring-boot-starter

基于 redis 的偏業(yè)務(wù)應(yīng)用的分布式限流組件,使得項(xiàng)目擁有分布式限流能力變得很簡單。限流的場景有很多,常說的限流一般指網(wǎng)關(guān)限流,控制好洪峰流量,以免打垮后方應(yīng)用。這里突出偏業(yè)務(wù)應(yīng)用的分布式限流的原因,是因?yàn)閰^(qū)別于網(wǎng)關(guān)限流,業(yè)務(wù)側(cè)限流可以輕松根據(jù)業(yè)務(wù)性質(zhì)做到細(xì)粒度的流量控制。比如如下場景,

  • 案例一:

有一個公開的 openApi 接口, openApi 會給接入方派發(fā)一個 appId,此時,如果需要根據(jù)各個接入方的 appId 限流,網(wǎng)關(guān)限流就不好做了,只能在業(yè)務(wù)側(cè)實(shí)現(xiàn)

  • 案例二:

公司內(nèi)部的短信接口,內(nèi)部對接了多個第三方的短信通道,每個短信通道對流量的控制都不盡相同,假設(shè)有的第三方根據(jù)手機(jī)號和短信模板組合限流,網(wǎng)關(guān)限流就更不好做了

以上舉例的場景,通過 ratelimiter-spring-boot-starter 可以輕松解決限流問題

1、快速開始

1.1、添加組件依賴,已上傳到maven中央倉庫

maven

<dependency>
    <groupId>com.github.taptap</groupId>
    <artifactId>ratelimiter-spring-boot-starter</artifactId>
    <version>1.0</version>
</dependency>

gradle

implementation 'com.github.taptap:ratelimiter-spring-boot-starter:1.0'

1.2、application.properties 配置

spring.ratelimiter.enabled = true

spring.ratelimiter.redis-address = redis://127.0.0.1:6379
spring.ratelimiter.redis-password = xxx

啟用 ratelimiter 的配置必須加,默認(rèn)不會加載。redis 相關(guān)的連接是非必須的,如果你的項(xiàng)目里已經(jīng)使用了 Redisson ,則不用配置限流框架的 redis 連接

1.3、在需要加限流邏輯的方法上,添加注解 @RateLimit,如:

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/get")
    @RateLimit(rate = 5, rateInterval = "10s")
    public String get(String name) {
        return "hello";
    }
}
1.3.1 @RateLimit 注解說明

@RateLimit 注解可以添加到任意被 spring 管理的 bean 上,不局限于 controller ,service 、repository 也可以。在最基礎(chǔ)限流功能使用上,以上三個步驟就已經(jīng)完成了。@RateLimit 有兩個最基礎(chǔ)的參數(shù),rateInterval 設(shè)置了時間窗口,rate 設(shè)置了時間窗口內(nèi)允許通過的請求數(shù)量

1.3.2 限流的粒度,限流 key

。限流的粒度是通過限流的 key 來做的,在最基礎(chǔ)的設(shè)置下,限流的 key 默認(rèn)是通過方法名稱拼出來的,規(guī)則如下:

key = RateLimiter_ + 類名 + 方法名

除了默認(rèn)的 key 策略,ratelimiter-spring-boot-starter 充分考慮了業(yè)務(wù)限流時的復(fù)雜性,提供了多種方式。結(jié)合業(yè)務(wù)特征,達(dá)到更細(xì)粒度的限流控制。

1.3.3 觸發(fā)限流后的行為

默認(rèn)觸發(fā)限流后 程序會返回一個 http 狀態(tài)碼為 429 的響應(yīng),響應(yīng)值如下:

{
  "code":429,
  "msg":"Too Many Requests"
}

同時,響應(yīng)的 header 里會攜帶一個 Retry-After 的時間值,單位 ms,用來告訴調(diào)用方多久后可以重試。當(dāng)然這一切都是可以自定義的,進(jìn)階用法可以繼續(xù)往下看

2、進(jìn)階用法

2.1、自定義限流的 key

自定義限流 key 有三種方式,當(dāng)自定義限流的 key 生效時,限流的 key 就變成了(默認(rèn)的 key + 自定義的 key)。下面依次給出示例

2.1.1、@RateLimitKey 的方式
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/get")
    @RateLimit(rate = 5, rateInterval = "10s")
    public String get(@RateLimitKey String name) {
        return "get";
    }
}

@RateLimitKey 注解可以放在方法的入?yún)⑸?,要求入?yún)⑹腔A(chǔ)數(shù)據(jù)類型,上面的例子,如果 name = kl。那么最終限流的 key 如下:

key = RateLimiter_com.taptap.ratelimiter.web.TestController.get-kl
2.1.2、指定 keys 的方式
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/get")
    @RateLimit(rate = 5, rateInterval = "10s",keys = {"#name"})
    public String get(String name) {
        return "get";
    }

    @GetMapping("/hello")
    @RateLimit(rate = 5, rateInterval = "10s",keys = {"#user.name","user.id"})
    public String hello(User user) {
        return "hello";
    }
}

keys 這個參數(shù)比 @RateLimitKey 注解更智能,基本可以包含 @RateLimitKey 的能力,只是簡單場景下,使用起來沒有 @RateLimitKey 那么便捷。keys 的語法來自 spring 的 Spel,可以獲取對象入?yún)⒗锏膶傩裕С肢@取多個,最后會拼接起來。使用過 spring-cache 的同學(xué)可能會更加熟悉 如果不清楚 Spel 的用法,可以參考 spring-cache 的注解文檔

2.1.3、自定義 key 獲取函數(shù)
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/get")
    @RateLimit(rate = 5, rateInterval = "10s",customKeyFunction = "keyFunction")
    public String get(String name) {
        return "get";
    }

    public String keyFunction(String name) {
        return "keyFunction" + name;
    }
}

當(dāng) @RateLimitKey 和 keys 參數(shù)都沒法滿足時,比如入?yún)⒌闹凳且粋€加密的值,需要解密后根據(jù)相關(guān)明文內(nèi)容限流。可以通過在同一類里自定義獲取 key 的函數(shù),這個函數(shù)要求和被限流的方法入?yún)⒁恢拢祷刂禐?String 類型。返回值不能為空,為空時,會回退到默認(rèn)的 key 獲取策略。

2.2、自定義限流后的行為

2.2.1、配置響應(yīng)內(nèi)容
spring.ratelimiter.enabled=true
spring.ratelimiter.response-body=Too Many Requests
spring.ratelimiter.status-code=509

添加如上配置后,觸發(fā)限流時,http 的狀態(tài)碼就變成了 509 。響應(yīng)的內(nèi)容變成了 Too Many Requests 了

2.2.2 自定義限流觸發(fā)異常處理器

默認(rèn)的觸發(fā)限流后,限流器會拋出一個異常,限流器框架內(nèi)定義了一個異常處理器來處理。自定義限流觸發(fā)處理器,需要先禁用系統(tǒng)默認(rèn)的限流觸發(fā)處理器,禁用方式如下:

spring.ratelimiter.exceptionHandler.enable=false

然后在項(xiàng)目里添加自定義處理器,如下:

@ControllerAdvice
public class RateLimitExceptionHandler {

    private final  RateLimiterProperties limiterProperties;

    public RateLimitExceptionHandler(RateLimiterProperties limiterProperties) {
        this.limiterProperties = limiterProperties;
    }

    @ExceptionHandler(value = RateLimitException.class)
    @ResponseBody
    public String exceptionHandler(HttpServletResponse response, RateLimitException e){
        response.setStatus(limiterProperties.getStatusCode());
        response.setHeader("Retry-After", String.valueOf(e.getRetryAfter()));
        return limiterProperties.getResponseBody();
    }
}
2.2.3 自定義觸發(fā)限流處理函數(shù)
@RequestMapping("/test")
public class TestController {

    @GetMapping("/get")
    @RateLimit(rate = 5, rateInterval = "10s",fallbackFunction = "getFallback")
    public String get(String name) {
        return "get";
    }

    public String getFallback(String name){
        return "Too Many Requests" + name;
    }

}

這種方式實(shí)現(xiàn)和使用和 2.1.3、自定義 key 獲取函數(shù)類似。但是多一個要求,返回值的類型需要和原限流函數(shù)的返回值類型一致,當(dāng)觸發(fā)限流時,框架會調(diào)用 fallbackFunction 配置的函數(shù)執(zhí)行并返回

感謝各位的閱讀,以上就是“如何使用ratelimiter-spring-boot-starter限流器”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何使用ratelimiter-spring-boot-starter限流器這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

網(wǎng)站標(biāo)題:如何使用ratelimiter-spring-boot-starter限流器
URL鏈接:http://www.muchs.cn/article28/phdocp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)品牌網(wǎng)站建設(shè)、軟件開發(fā)、GoogleApp開發(fā)、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)