国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

使用策略模式實現(xiàn) Spring 分布式和單機限流

這篇具有很好參考價值的文章主要介紹了使用策略模式實現(xiàn) Spring 分布式和單機限流。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

我們可以使用策略模式來統(tǒng)一單機限流和分布式限流的實現(xiàn),提高代碼的可擴展性和可維護性。

思路是定義一個 RateLimitStrategy 接口,并分別實現(xiàn)單機限流策略 LocalRateLimitStrategy 和分布式限流策略 DistributedRateLimitStrategy。在 AOP 切面中,根據(jù)配置決定使用哪種限流策略。

定義策略接口

public interface RateLimitStrategy {
    boolean tryAcquire(String key, double qps, long timeout, TimeUnit timeUnit);
}

實現(xiàn)單機限流策略

import com.google.common.util.concurrent.RateLimiter;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;

public class LocalRateLimitStrategy implements RateLimitStrategy {

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

    @Override
    public boolean tryAcquire(String key, double qps, long timeout, TimeUnit timeUnit) {
        RateLimiter limiter = rateLimiters.computeIfAbsent(key, k -> RateLimiter.create(qps));
        if (timeout > 0) {
            return limiter.tryAcquire(timeout, timeUnit);
        } else {
            return limiter.tryAcquire();
        }
    }
}

實現(xiàn)分布式限流策略

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.RedisScript;

import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class DistributedRateLimitStrategy implements RateLimitStrategy {

    private final RedisTemplate<String, Object> redisTemplate;

    public DistributedRateLimitStrategy(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public boolean tryAcquire(String key, double qps, long timeout, TimeUnit timeUnit) {
        long window = timeUnit.toSeconds(timeout);
        List<String> keys = Collections.singletonList(key);

        String luaScript = buildLuaScript();
        RedisScript<Long> redisScript = new DefaultRedisScript<>(luaScript, Long.class);
        Long currentCount = redisTemplate.execute(redisScript, keys, Collections.singletonList(window), Collections.singletonList(qps));

        return currentCount <= qps;
    }

    private String buildLuaScript() {
       return "local key = KEYS[1]\n" +
                "local window = tonumber(ARGV[1])\n" +
                "local qps = tonumber(ARGV[2])\n" +
                "local current = redis.call('incrBy', key, 1)\n" +
                "if current == 1 then\n" +
                "    redis.call('expire', key, window)\n" +
                "end\n" +
                "if current > qps then\n" +
                "    return redis.call('decrBy', key, 1)\n" +
                "else\n" +
                "    return current\n" +
                "end";
    }
}

修改切面邏輯

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

@Aspect
@Component
public class RateLimitAspect {

    @Autowired
    private RateLimitStrategy rateLimitStrategy;

    @Around("@annotation(rateLimitAnnotation)")
    public Object around(ProceedingJoinPoint joinPoint, RateLimit rateLimitAnnotation) throws Throwable {
        String key = joinPoint.getSignature().toLongString();
        double qps = rateLimitAnnotation.qps();
        long timeout = rateLimitAnnotation.timeout();
        TimeUnit timeUnit = rateLimitAnnotation.timeUnit();

        boolean acquired = rateLimitStrategy.tryAcquire(key, qps, timeout, timeUnit);
        if (!acquired) {
            throw new RuntimeException("Rate limit exceeded");
        }

        return joinPoint.proceed();
    }
}

在切面邏輯中,我們注入了 RateLimitStrategy 的實現(xiàn)類。根據(jù)配置決定使用單機限流還是分布式限流策略。

使用示例

@RestController
public class DemoController {

    @Autowired
    private RateLimitStrategy rateLimitStrategy;

    @GetMapping("/test")
    @ApiRateLimit(qps = 10, timeout = 60, timeUnit = TimeUnit.SECONDS)
    public String test() {
        return "hello world";
    }
}

在使用時,我們只需要在方法上標注 @RateLimit 注解即可,而不需要關心底層使用的是單機限流還是分布式限流。

配置限流策略

在 Spring 配置中,我們可以根據(jù)需求注入不同的 RateLimitStrategy 實現(xiàn)類:

// 單機限流配置
@Bean
public RateLimitStrategy localRateLimitStrategy() {
    return new LocalRateLimitStrategy();
}

// 分布式限流配置
@Bean
public RateLimitStrategy distributedRateLimitStrategy(RedisTemplate<String, Object> redisTemplate) {
    return new DistributedRateLimitStrategy(redisTemplate);
}

通過使用策略模式,我們將限流算法與具體的限流策略解耦,提高了代碼的可擴展性和可維護性。未來如果需要新的限流策略,只需要實現(xiàn) RateLimitStrategy 接口并配置即可,無需修改核心的限流邏輯。文章來源地址http://www.zghlxwxcb.cn/news/detail-856858.html

到了這里,關于使用策略模式實現(xiàn) Spring 分布式和單機限流的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 使用Spring Cloud實現(xiàn)分布式系統(tǒng)的注冊中心——nacos詳解

    Nacos是一個全新的分布式系統(tǒng)服務框架,它能夠提供服務發(fā)現(xiàn)、配置管理、動態(tài)DNS、流量管理等多種功能。其中最為重要的功能之一就是服務發(fā)現(xiàn),可以使得開發(fā)者更加方便地管理和維護分布式系統(tǒng)的各個服務。 在Spring Cloud中,我們可以使用Nacos作為注冊中心,實現(xiàn)服務的注

    2024年02月05日
    瀏覽(92)
  • springboot實現(xiàn)后端防重復提交(AOP+redis分布式鎖)單機情況下

    springboot實現(xiàn)后端防重復提交(AOP+redis分布式鎖)單機情況下

    為什么要實現(xiàn)這個功能呢,可能用戶在提交一份數(shù)據(jù)后,可能因為網(wǎng)絡的原因、處理數(shù)據(jù)的速度慢等原因導致頁面沒有及時將用戶剛提交數(shù)據(jù)的后臺處理結果展示給用戶,這時用戶可能會進行如下操作: 1秒內連續(xù)點擊提交按鈕,導致重復提交表單。 使用瀏覽器后退按鈕重復之

    2024年02月08日
    瀏覽(27)
  • 分布式消息流處理平臺kafka(一)-kafka單機、集群環(huán)境搭建流程及使用入門

    分布式消息流處理平臺kafka(一)-kafka單機、集群環(huán)境搭建流程及使用入門

    kafka最初是LinkedIn的一個內部基礎設施系統(tǒng)。最初開發(fā)的起因是,LinkedIn雖然有了數(shù)據(jù)庫和其他系統(tǒng)可以用來存儲數(shù)據(jù),但是缺乏一個可以幫助處理持續(xù)數(shù)據(jù)流的組件。 所以在設計理念上,開發(fā)者不想只是開發(fā)一個能夠存儲數(shù)據(jù)的系統(tǒng),如關系數(shù)據(jù)庫、Nosql數(shù)據(jù)庫、搜索引擎等

    2024年02月16日
    瀏覽(50)
  • 單機和分布式有什么區(qū)別?分布式系統(tǒng)相比單機系統(tǒng)的優(yōu)勢在哪里?

    單機和分布式有什么區(qū)別?分布式系統(tǒng)相比單機系統(tǒng)的優(yōu)勢在哪里?

    本文隸屬于專欄《大數(shù)據(jù)理論體系》,該專欄為筆者原創(chuàng),引用請注明來源,不足和錯誤之處請在評論區(qū)幫忙指出,謝謝! 本專欄目錄結構和文獻引用請見《大數(shù)據(jù)理論體系》 單機系統(tǒng)是指只有一臺計算機,所有的軟件程序和數(shù)據(jù)都運行在這臺計算機上。在這種情況下,所

    2024年02月11日
    瀏覽(20)
  • 單機,集群和分布式概念

    1.受限于硬件資源,單機所能承受的用戶并發(fā)量太少; 2.一個系統(tǒng)有多個模塊,任意模塊的修改都會導致整個項目代碼重新編譯、部署; 3.系統(tǒng)中,有些模塊是CPU密集型,有些模塊是I/O密集型,造成各個模塊對于硬件資源的需求是不一樣的。 負載均衡??????? 集群的優(yōu)點

    2024年02月14日
    瀏覽(18)
  • 基于價值認同的需求側電能共享分布式交易策略(Matlab代碼實現(xiàn))

    基于價值認同的需求側電能共享分布式交易策略(Matlab代碼實現(xiàn))

    ???????? 歡迎來到本博客 ???????? ??博主優(yōu)勢: ?????? 博客內容盡量做到思維縝密,邏輯清晰,為了方便讀者。 ?? 座右銘: 行百里者,半于九十。 ?????? 本文目錄如下: ?????? 目錄 ??1 概述 1.1 電能共享模式與博弈均衡分析 1.2?電能共享市場出清機

    2023年04月16日
    瀏覽(20)
  • HBase(單機)偽分布式安裝

    HBase(單機)偽分布式安裝

    準備工作:Hadoop已經(jīng)安裝、hbase-1.2.6-bin安裝包。 1、上傳hbase-1.2.6-bin.tar.gz壓縮包到/home/hadoop目錄下,并使用tar xvf 解壓。 2、終端下輸入:vim .bashrc,即用vim編輯器打開bashrc文件。 3、在bashrc文件的末尾設置如下Hbase的環(huán)境變量,要注意hbase解壓后的文件名是hbase-1.2.6還是hbase-1

    2024年02月04日
    瀏覽(24)
  • 在Spring中,可以使用不同的方式來實現(xiàn)分布式鎖,例如基于數(shù)據(jù)庫、Redis、ZooKeeper等

    在Spring中,可以使用不同的方式來實現(xiàn)分布式鎖,例如基于數(shù)據(jù)庫、Redis、ZooKeeper等

    在Spring中,可以使用不同的方式來實現(xiàn)分布式鎖,例如基于數(shù)據(jù)庫、Redis、ZooKeeper等。下面是兩種常見的實現(xiàn)方式: 使用Redis實現(xiàn)分布式鎖: 使用自定義注解實現(xiàn)本地鎖: 以上是兩種常見的在Spring中實現(xiàn)分布式鎖的方式。第一種方式使用Redis作為分布式鎖的存儲介質,通過

    2024年03月17日
    瀏覽(24)
  • 單機架構到分布式架構的演變

    單機架構到分布式架構的演變

    目錄 1.單機架構 2.應用數(shù)據(jù)分離架構 3.應用服務集群架構 4.讀寫分離 / 主從分離架構 5.引入緩存 —— 冷熱分離架構 6.垂直分庫 7.業(yè)務拆分 —— 微服務 8.容器化引入——容器編排架構 總結 ???????? 初期,我們需要利用我們精干的技術團隊,快速將業(yè)務系統(tǒng)投入市場進行

    2024年02月04日
    瀏覽(24)
  • 【軟件開發(fā)】從單機到分布式

    【軟件開發(fā)】從單機到分布式

    問題:由于流量越來越大出現(xiàn)服務器性能問題。 對架構增加了一臺服務器,應用和數(shù)據(jù)庫分別部署到不同的服務器上,對于開發(fā)和測試沒有任何影響,只需要應用服務器新增一個遠程調用數(shù)據(jù)庫服務器的連接,有效地緩解了應用服務器負載的壓力。 問題:隨著請求流量的進

    2024年02月02日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包