成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Guava RateLimiter:高效流量控制實(shí)踐指南

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
在互聯(lián)網(wǎng)飛速發(fā)展的今天,隨著系統(tǒng)用戶規(guī)模的不斷擴(kuò)大和分布式架構(gòu)的廣泛應(yīng)用,API 接口的穩(wěn)定性和性能成為系統(tǒng)設(shè)計(jì)中至關(guān)重要的因素。

背景

在互聯(lián)網(wǎng)飛速發(fā)展的今天,隨著系統(tǒng)用戶規(guī)模的不斷擴(kuò)大和分布式架構(gòu)的廣泛應(yīng)用,API 接口的穩(wěn)定性和性能成為系統(tǒng)設(shè)計(jì)中至關(guān)重要的因素。無論是應(yīng)對突發(fā)的流量高峰,還是防止惡意爬蟲的惡意請求,限流策略都已成為現(xiàn)代系統(tǒng)不可或缺的一部分,其主要目的包括但不限于以下幾點(diǎn):

  1. 保護(hù)后端服務(wù):通過限制單位時(shí)間內(nèi)對特定接口的訪問次數(shù),可以有效避免因突發(fā)流量或惡意攻擊導(dǎo)致的服務(wù)過載,從而確保后端服務(wù)的穩(wěn)定運(yùn)行。
  2. 保證用戶體驗(yàn):合理的限流策略可以在不影響正常用戶使用的情況下,控制資源的合理分配,確保大多數(shù)用戶的請求能夠得到及時(shí)響應(yīng),提升整體服務(wù)質(zhì)量。
  3. 資源優(yōu)化利用:對于有限的計(jì)算資源,如數(shù)據(jù)庫連接、緩存資源等,通過限流可以避免這些資源被少數(shù)高頻率請求耗盡,確保資源的有效利用。
  4. 成本控制:云服務(wù)通常按照資源消耗計(jì)費(fèi),不當(dāng)?shù)恼埱罂赡軙?dǎo)致不必要的成本增加。限流可以幫助企業(yè)更好地控制成本,避免因?yàn)橐馔獾母吡髁慷鴮?dǎo)致的成本激增。
  5. 防止惡意行為:限流可以作為一道防線,阻止惡意爬蟲、DDoS攻擊等非法行為,保護(hù)系統(tǒng)免受損害。
  6. 數(shù)據(jù)安全:通過限制對外部數(shù)據(jù)的訪問頻率,可以減少敏感信息泄露的風(fēng)險(xiǎn),特別是在處理個(gè)人隱私數(shù)據(jù)時(shí)尤為重要。
  7. 合規(guī)性:某些行業(yè)有特定的數(shù)據(jù)訪問規(guī)則和限制,實(shí)施限流有助于滿足這些合規(guī)要求,避免法律風(fēng)險(xiǎn)。

Guava 提供了多種實(shí)現(xiàn)限流的方法,其中最常用的是 RateLimiter 類。RateLimiter 可以幫助我們控制應(yīng)用程序的資源消耗速度,例如限制每秒的請求數(shù)量。

實(shí)現(xiàn)

1.依賴引入:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.1-jre</version> 
</dependency>

2.application.yml 中配置限流參數(shù):

rate-limiter:
  permits-per-second: 5       # 每秒許可數(shù)
  warmup-period: 0            # 預(yù)熱時(shí)間(秒)
  timeout: 0                  # 獲取許可的超時(shí)時(shí)間(秒)

3.限流配置屬性類

@Data
@Component
@ConfigurationProperties(prefix = "rate-limiter")
public class RateLimiterProperties {

    /**
     * 每秒許可數(shù)
     */
    private double permitsPerSecond;

    /**
     * 預(yù)熱時(shí)間(秒)
     */
    private long warmupPeriod;

    /**
     * 獲取許可的超時(shí)時(shí)間(秒)
     */
    private long timeout;
}

4.配置 RateLimiter

@Configuration
public class RateLimiterConfig {

    /**
     * 配置 RateLimiter Bean
     *
     * @param properties 注入的限流配置屬性
     * @return RateLimiter 實(shí)例
     */
    @Bean
    public RateLimiter rateLimiter(RateLimiterProperties properties) {
        if (properties.getWarmupPeriod() > 0) {
            // 創(chuàng)建帶有預(yù)熱期的 RateLimiter
            return RateLimiter.create(
                    properties.getPermitsPerSecond(),
                    properties.getWarmupPeriod(),
                    TimeUnit.SECONDS
            );
        } else {
            // 創(chuàng)建標(biāo)準(zhǔn)的 RateLimiter
            return RateLimiter.create(properties.getPermitsPerSecond());
        }
    }
}

5.創(chuàng)建控制器

@RestController
public class RateLimiterController {

    @Autowired
    private RateLimiter rateLimiter;

    @Autowired
    private RateLimiterProperties properties;

    /**
     * 測試限流接口
     *
     * @return 請求結(jié)果
     */
    @GetMapping("/api/test")  
    //@RateLimitAspect(qps = 2, timeout = 200, timeUnit = TimeUnit.MILLISECONDS)
    public ResponseEntity<String> rateApi() {
        boolean acquired = rateLimiter.tryAcquire(properties.getTimeout(), TimeUnit.SECONDS);
        if (acquired) {
            // 允許請求,返回成功響應(yīng)
            return ResponseEntity.ok("請求成功!");
        } else {
            // 拒絕請求,返回限流響應(yīng)
            return ResponseEntity.status(429).body("請求過多,請稍后再試!");
        }
    }
}

6.進(jìn)階版利用切面:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RateLimitAspect {
    double qps() default 1; // 每秒鐘生成令牌的速率
    long timeout() default 0; // 嘗試獲取令牌的超時(shí)時(shí)間
    TimeUnit timeUnit() default TimeUnit.SECONDS; // 超時(shí)時(shí)間單位
}
@Aspect
@Component
public class ApiRateLimitAspect {

    private final Map<String, RateLimiter> rateLimiters = new ConcurrentHashMap<>();

    @Before("@annotation(RateLimitAspect)")
    public void limit(JoinPoint joinPoint, RateLimitAspect rateLimitAspect) {
        String methodName = joinPoint.getSignature().toLongString();
        double qps = rateLimitAspect.qps();
        RateLimiter limiter = rateLimiters.computeIfAbsent(methodName, k -> RateLimiter.create(qps));
        long timeout = rateLimitAspect.timeout();
        TimeUnit timeUnit = rateLimitAspect.timeUnit();
        if (timeout > 0) {
            if (!limiter.tryAcquire(timeout, timeUnit)) {
                throw new RuntimeException("API rate limit exceeded");
            }
        } else {
            if (!limiter.tryAcquire()) {
                throw new RuntimeException("API rate limit exceeded");
            }
        }
    }
}


責(zé)任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2010-02-03 23:04:31

流量控制P2P華夏創(chuàng)新

2023-10-08 12:14:42

Sentinel流量控制

2013-07-22 14:25:29

iOS開發(fā)ASIHTTPRequ

2011-06-23 09:09:37

流量控制

2022-06-22 09:07:09

Guava算法

2014-12-25 09:47:59

GuavaGuava并發(fā)

2021-03-09 07:38:15

Percona Xtr流量控制運(yùn)維

2010-06-04 10:49:58

Linux流量控制

2010-06-17 17:00:07

Linux流量控制

2019-07-02 10:22:15

TCP流量數(shù)據(jù)

2009-02-05 10:13:00

局域網(wǎng)流量控制數(shù)據(jù)流量

2010-05-27 11:03:44

Linux流量控制

2010-08-06 10:02:07

2010-06-04 11:21:42

Linux 流量控制

2021-03-22 08:06:59

SpringBootSentinel項(xiàng)目

2024-03-04 00:02:00

Redis存儲令牌

2010-11-30 09:40:15

流量控制設(shè)備AllotQOS策略

2023-06-20 08:10:00

2009-10-27 20:14:15

數(shù)據(jù)傳輸流量控制網(wǎng)管技巧

2010-06-13 13:34:47

Linux 流量控制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品久久久久久一区二区三区 | 久草在线青青草 | 欧美激情a∨在线视频播放 成人免费共享视频 | 日日草夜夜草 | 97久久精品午夜一区二区 | 999国产精品视频 | 国产高清视频 | 一级黄片一级毛片 | 久久国产婷婷国产香蕉 | 欧美日韩国产精品激情在线播放 | 狠狠操你 | 91欧美精品 | 精品亚洲一区二区三区 | 国产精品久久久久久久久久久新郎 | 国产小视频自拍 | 欧美日韩精品综合 | 久久精品电影 | 99riav3国产精品视频 | 91视频在线观看免费 | 亚洲三级在线观看 | av大片 | 日韩不卡在线观看 | 日韩成人av在线 | 日韩精品视频一区二区三区 | 一级a性色生活片久久毛片波多野 | 酒色成人网 | 久久香蕉网 | 99久久久久久久久 | 亚洲精品乱码 | 狠狠操av| 99精品国产一区二区三区 | 91中文字幕在线 | 99re视频 | 亚洲综合日韩精品欧美综合区 | 亚洲精品乱码久久久久久9色 | 黄色大片免费网站 | 日韩av成人在线 | 91色网站| 日日骚网| 欧美一级久久精品 | 日日干夜夜操 |