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

Guava RateLimiter:高效流量控制實踐指南

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

背景

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

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

Guava 提供了多種實現(xiàn)限流的方法,其中最常用的是 RateLimiter 類。RateLimiter 可以幫助我們控制應(yīng)用程序的資源消耗速度,例如限制每秒的請求數(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ù)熱時間(秒)
  timeout: 0                  # 獲取許可的超時時間(秒)

3.限流配置屬性類

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

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

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

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

4.配置 RateLimiter

@Configuration
public class RateLimiterConfig {

    /**
     * 配置 RateLimiter Bean
     *
     * @param properties 注入的限流配置屬性
     * @return RateLimiter 實例
     */
    @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.進階版利用切面:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RateLimitAspect {
    double qps() default 1; // 每秒鐘生成令牌的速率
    long timeout() default 0; // 嘗試獲取令牌的超時時間
    TimeUnit timeUnit() default TimeUnit.SECONDS; // 超時時間單位
}
@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流量控制運維

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項目

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 流量控制
點贊
收藏

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

主站蜘蛛池模板: 亚洲精品一区二区三区蜜桃久 | 免费a网站 | 99视频免费在线 | 国产精品久久久久久模特 | 欧美一区二区三区视频 | 亚洲国产视频一区 | aaa综合国产 | 国产精品一区二区在线免费观看 | 精品综合久久 | 国产美女精品 | 色婷婷婷婷色 | 色综合一区二区 | 91麻豆精品国产91久久久资源速度 | 免费日韩av网站 | 天天操夜夜爽 | 又黄又爽的网站 | 亚洲狠狠 | 国产1区 | 亚洲一区二区三区视频 | 中文在线a在线 | 久久久精品一区二区三区 | 九九热免费视频在线观看 | 日本精品一区二区 | 亚洲先锋影音 | 国产美女特级嫩嫩嫩bbb片 | 国产综合精品 | 一级毛片视频免费观看 | 日本精品一区二区三区在线观看视频 | 国产亚洲一区二区三区在线观看 | 国产69久久精品成人看动漫 | 先锋影音资源网站 | 精品粉嫩aⅴ一区二区三区四区 | 日韩在线一区二区三区 | 久久久99国产精品免费 | 成人在线欧美 | 91九色在线观看 | 国产视频精品免费 | 国产精品96久久久久久 | 99精品国产一区二区三区 | 久久久成人精品 | 亚洲最大看片网站 |