精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot中如何實現限流,這種方式才叫優雅!

開發 前端
在實際應用中,只需要根據場景需求選擇對應的限流機制,即可非常方便的進行限流操作。這種靈活性和便捷性,也是SpringBoot中定義Starter的一般套路。

很早以前,我曾寫過兩篇介紹如何在SpringBoot中使用Guava和Redis實現接口限流的文章。具體包括:

  1. 使用Guava實現單機令牌桶限流
  2. 使用Redis實現分布式限流

現在,一個問題擺在我們面前:如何將這兩種限流機制整合到同一個組件中,以便用戶隨時切換呢?

顯然,我們需要定義一個通用的限流組件,將其引入到業務中,并支持通過配置文件自由切換不同的限流機制。舉例而言,當使用limit.type=redis時,啟用Redis分布式限流組件,當使用limit.type=local時,啟用Guava限流組件。這種自由切換機制能夠為用戶提供更大的靈活性和可維護性。

接下來,讓我們開始動手實現吧!

第一步,創建通用模塊cloud-limiter-starter

首先在父項目下創建一個模塊

圖片

然后在pom文件中引入相關依賴

<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</dependency>
<!--SpringFramework-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<scope>provided</scope>
</dependency>

</dependencies>

小提示:通用模塊命名最好遵照規則以starter命名結束,同時通用模塊引入的依賴最好設置<scope>provided</scope>屬性。

第二步,實現限流功能

  1. 創建限流接口

既然有兩種限流機制,按照套路肯定得先創建一個限流接口,就叫LimiterManager吧。

public interface LimiterManager {
boolean tryAccess(Limiter limiter);
}
  1. 分別實現Redis的限流功能和Guava的限流功能,這里只給出核心代碼。

Guava限流的核心實現GuavaLimiter

@Slf4j
public class GuavaLimiter implements LimiterManager{
private final Map<String, RateLimiter> limiterMap = Maps.newConcurrentMap();

@Override
public boolean tryAccess(Limiter limiter) {
RateLimiter rateLimiter = getRateLimiter(limiter);
if (rateLimiter == null) {
return false;
}

boolean access = rateLimiter.tryAcquire(1,100, TimeUnit.MILLISECONDS);

log.info("{} access :{}",limiter.getKey() , access);

return access;
}
}

Redis限流的核心實現RedisLimiter

@Slf4j
public class RedisLimiter implements LimiterManager{

private final StringRedisTemplate stringRedisTemplate;

public RedisLimiter(StringRedisTemplate stringRedisTemplate) {
this.stringRedisTemplate = stringRedisTemplate;
}

@Override
public boolean tryAccess(Limiter limiter) {

String key = limiter.getKey();
if (StringUtils.isEmpty(key)) {
throw new LimiterException( "redis limiter key cannot be null" );
}

List<String> keys = new ArrayList<>();
keys.add( key );

int seconds = limiter.getSeconds();
int limitCount = limiter.getLimitNum();

String luaScript = buildLuaScript();

RedisScript<Long> redisScript = new DefaultRedisScript<>(luaScript, Long.class);

Long count = stringRedisTemplate.execute( redisScript, keys, "" + limitCount, "" + seconds );

log.info( "Access try count is {} for key={}", count, key );

return count != null && count != 0;
}
}

第三步,創建配置類

編寫配置類根據配置文件注入限流實現類,當配置文件中屬性 limit.type=local 時啟用Guava限流機制,當limit.type=redis 時啟用Redis限流機制。

@Configuration
public class LimiterConfigure {

@Bean
@ConditionalOnProperty(name = "limit.type",havingValue = "local")
public LimiterManager guavaLimiter(){
return new GuavaLimiter();
}


@Bean
@ConditionalOnProperty(name = "limit.type",havingValue = "redis")
public LimiterManager redisLimiter(StringRedisTemplate stringRedisTemplate){
return new RedisLimiter(stringRedisTemplate);
}
}

第四步,創建AOP

根據前面的兩篇文章可知,避免限流功能污染業務邏輯的最好方式是借助Spring AOP,所以很顯然還得需要創建一個AOP。

@Aspect
@EnableAspectJAutoProxy(proxyTargetClass = true) //使用CGLIB代理
@Conditional(LimitAspectCondition.class)
public class LimitAspect {

@Setter(onMethod_ = @Autowired)
private LimiterManager limiterManager;

@Pointcut("@annotation(com.jianzh5.limit.aop.Limit)")
private void check() {

}

@Before("check()")
public void before(JoinPoint joinPoint){
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();

Limit limit = method.getAnnotation(Limit.class);
if(limit != null){

Limiter limiter = Limiter.builder().limitNum(limit.limitNum())
.seconds(limit.seconds())
.key(limit.key()).build();

if(!limiterManager.tryAccess(limiter)){
throw new LimiterException( "There are currently many people , please try again later!" );
}
}
}
}

注意到類上我加了一行@Conditional(LimitAspectCondition.class),使用了自定義條件選擇器,意思是只有當配置類中出現了limit.type屬性時才會加載這個AOP。

public class LimitAspectCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//檢查配置文件是否包含limit.type屬性
return conditionContext.getEnvironment().containsProperty(ConfigConstant.LIMIT_TYPE);
}
}

第四步,創建spring.factories文件,引導SpringBoot加載配置類

## AutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoCnotallow=\
com.jianzh5.limit.config.LimiterConfigure,\
com.jianzh5.limit.aop.LimitAspect

完整目錄結構如下:

圖片

第五步,在項目中引用限流組件

  1. 引入依賴
<dependency>
<groupId>com.jianzh5</groupId>
<artifactId>cloud-limit-starter</artifactId>
</dependency>
  1. 在application.properties中設置加載的限流組件
limit.type = redis

如果不配置此屬性則不加載對應限流功能。

  1. 在需要限流的接口上加上注解
@Limit(key = "Limiter:test",limitNum = 3,seconds = 1)

小結

通過上述步驟,我們已經成功實現了一個通用限流組件。在實際應用中,只需要根據場景需求選擇對應的限流機制,即可非常方便的進行限流操作。這種靈活性和便捷性,也是SpringBoot中定義Starter的一般套路。

如果你想詳細了解這兩種限流機制的原理,可以參考之前的文章中所介紹的內容。

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2025-09-22 00:00:00

2022-02-15 17:56:19

SpringBoot日志

2025-09-22 09:31:34

2022-09-01 13:12:53

LinuxTC網絡限流

2023-10-27 08:20:12

springboot微服務

2024-09-09 11:35:35

2020-03-25 17:55:30

SpringBoot攔截器Java

2021-03-30 10:46:42

SpringBoot計數器漏桶算法

2020-10-25 19:58:04

Pythonic代碼語言

2021-11-10 10:03:18

SpringBootJava代碼

2023-06-28 08:25:14

事務SQL語句

2023-12-20 13:50:00

SpringBootJSON序列化

2021-11-05 21:33:28

Redis數據高并發

2023-08-01 08:54:02

接口冪等網絡

2024-12-18 12:10:00

2023-08-08 08:01:22

微服務架構服務

2024-11-05 15:02:41

2025-03-17 00:00:00

2024-03-18 14:06:00

停機Spring服務器

2025-07-10 07:24:54

Spring支付策略類
點贊
收藏

51CTO技術棧公眾號

91精品免费久久久久久久久| 欧美日韩黄色| 最新国产一区| 亚洲一区二区三区四区的| dy888夜精品国产专区| 国产第一页视频| 三级视频在线看| 99re8这里有精品热视频免费| 一区二区三区导航| 久久久久亚洲蜜桃| 亚洲成人中文字幕| 日韩黄色一级片| 欧美日韩综合色| 国产午夜精品一区理论片飘花| 国产精品2018| 国产系列第一页| 国产一级黄色录像片| 亚洲精品国产片| 黄色日韩在线| 中文字幕九色91在线| 涩涩网站在线看| 麻豆网站在线观看| 中文一区一区三区免费在线观看| 日韩久久午夜影院| 无码人妻aⅴ一区二区三区日本| 水莓100国产免费av在线播放| 国产在线乱码一区二区三区| 日本不卡高字幕在线2019| 国产精品老熟女一区二区| 嫩草一区二区三区| 亚洲精品一区二区在线观看| 国产一级不卡毛片| 国产一二三在线| 99久久国产免费看| 成人免费91在线看| 国产精品毛片一区二区在线看舒淇 | 国产精品亚洲四区在线观看 | 偷偷操不一样的久久| 91av精品| xxav国产精品美女主播| 亚洲蜜桃精久久久久久久久久久久| 4438五月综合| 欧美性感一区二区三区| 怡红院av亚洲一区二区三区h| 羞羞视频在线免费国产| 亚洲欧美日韩综合aⅴ视频| 日韩免费毛片| 可以在线观看的黄色| 不卡的av中国片| 99在线热播| 国产高清免费在线观看| 精品亚洲成a人| 国产精品男女猛烈高潮激情| 国产伦精品一区二区三区视频网站| 欧美日韩一区二区三区四区在线观看| 久久精品在线播放| 在线免费看av网站| 亚洲精品一区二区在线看| 色一情一乱一区二区| 亚洲色图日韩精品| 久久中文字幕av一区二区不卡| 国产亚洲精品日韩| 亚洲无人区码一码二码三码的含义| 自拍偷拍一区| 亚洲欧洲国产伦综合| 日韩一级av毛片| 日韩精品久久| 久久精品99国产精品酒店日本| 97精品在线播放| 中国成人一区| 国语自产精品视频在线看抢先版图片| 国语对白一区二区| 亚洲精品一二| 日韩免费观看av| 在线观看亚洲一区二区| 极品少妇xxxx精品少妇偷拍| 亚洲va欧美va国产综合剧情| 性色av蜜臀av| 91在线小视频| 午夜精品电影在线观看| 欧美尤物美女在线| 一个色综合网站| 国产黄色一级网站| 成人黄色免费观看| 91精品国产免费| 国产婷婷在线观看| 伊人精品一区| 久久激情视频免费观看| 日本少妇全体裸体洗澡| 性欧美暴力猛交另类hd| 国产精品香蕉国产| 亚洲欧美国产高清va在线播放| av不卡在线播放| 日韩精品另类天天更新| 成人video亚洲精品| 亚洲h精品动漫在线观看| 中文字幕乱码人妻综合二区三区| 久久久久久久性潮| 亚洲国产精品免费| 免费黄色激情视频| 中文精品在线| 成人免费观看a| 亚州av在线播放| 中文字幕一区三区| 日韩免费视频播放| 日本午夜精品久久久久| 日韩av在线播放资源| 人妻互换一区二区激情偷拍| 亚洲三级色网| 成人国产精品久久久| 神马电影在线观看| 一区二区三区丝袜| 色综合天天色综合| 丝袜av一区| 美女精品视频一区| 色老头在线视频| 成人激情小说乱人伦| 亚洲一区3d动漫同人无遮挡 | 国产精品香蕉| www.日韩不卡电影av| 中文字幕第15页| 国产成人亚洲综合a∨婷婷| 欧美精品欧美精品系列c| 91一区二区三区在线| 色婷婷综合久久久中文字幕| 香蕉久久久久久av成人| 久久精品国产亚洲夜色av网站 | 欧美人体一区二区三区| 精品美女一区二区三区| 日韩在线一卡二卡| 日韩高清在线一区| 久久艹中文字幕| 丁香花电影在线观看完整版| 8x8x8国产精品| eeuss中文字幕| 日韩在线卡一卡二| 日本不卡一区| 久久久久久久| 日韩成人在线观看| 五月天婷婷网站| 国产成人综合网站| 手机福利在线视频| 992tv国产精品成人影院| 亚洲人成电影网站色…| 久久久国产精品成人免费| 国产成人午夜高潮毛片| 男同互操gay射视频在线看| 亚洲成人短视频| 亚洲美女av在线| 欧美一二三区视频| 91小视频免费观看| www.com毛片| 香蕉人人精品| 欧洲亚洲妇女av| 日本不卡视频一区二区| 欧美性猛xxx| 久久人人爽人人爽人人片| 国产欧美欧美| 久久综合九色综合网站| 日韩欧美精品一区二区三区| 日韩成人中文字幕| 免费的毛片视频| 日本一区二区三区国色天香| 色戒在线免费观看| 亚洲成人最新网站| 国产精品久久久久久久久婷婷| 色在线视频网| 亚洲精品按摩视频| 一级黄色av片| 国产精品私人影院| 国产精品久久久久久久99| 欧美aⅴ99久久黑人专区| 国产精品毛片va一区二区三区| 波多一区二区| 亚洲精品一区二区在线| 香蕉污视频在线观看| 国产亲近乱来精品视频| 成人av毛片在线观看| 女同性一区二区三区人了人一| 成人动漫在线视频| 国产精品电影| 在线看国产精品| a天堂视频在线| 亚洲高清一区二区三区| 制服 丝袜 综合 日韩 欧美| 精品一区二区三区免费| 国产玉足脚交久久欧美| 视频小说一区二区| 成人h视频在线| 操喷在线视频| 日韩在线观看网址| 成人免费视频国产免费麻豆| 日韩欧美主播在线| av成人免费网站| 99riav一区二区三区| 中文字幕国产传媒| 亚洲视频高清| 亚洲精品国产一区| 国产精品99久久免费观看| 国产精品99久久久久久久久 | 91黄色8090| 午夜视频在线免费观看| 日韩一区二区在线观看视频播放| 天天做天天爱夜夜爽| 亚洲欧美国产毛片在线| 日本xxx在线播放| 国产高清不卡二三区| 嫩草av久久伊人妇女超级a| 欧美三级小说| 午夜视频久久久| 老牛精品亚洲成av人片| 亚洲va欧美va国产综合剧情| 欧美日韩国产v| 国内精品久久久久久久久| 日本视频在线免费观看| 亚洲欧美一区二区三区情侣bbw| 国产哺乳奶水91在线播放| 日本乱人伦aⅴ精品| 久久久久久久极品内射| 国产精品日日摸夜夜摸av| 性色av蜜臀av浪潮av老女人| 精品一区二区免费在线观看| 日韩一级在线免费观看| 在线观看亚洲| 欧美日韩中文字幕在线播放| 日韩一区电影| 欧美日韩一区二区三区免费| 精品自拍偷拍| 91偷拍精品一区二区三区| 欧美黄色成人| 国产精品18久久久久久首页狼| 国内激情视频在线观看| 欧美劲爆第一页| 亚洲www色| 久热精品在线视频| 蜜芽在线免费观看| 中文字幕亚洲色图| 国产视频二区在线观看| 国产视频精品免费播放| 午夜福利视频一区二区| 精品国产免费人成在线观看| 国产美女www爽爽爽视频| 欧美剧情电影在线观看完整版免费励志电影| 久久国产黄色片| 精品国产91久久久| 二区视频在线观看| 精品av在线播放| 欧美一级视频免费观看| 精品欧美激情精品一区| 日产欧产va高清| 精品福利一区二区| 免费黄色网址在线| 色婷婷综合久久久| 波多野结衣一本一道| 91成人免费在线视频| 欧美视频xxxx| 欧美另类videos死尸| 一级特黄aa大片| 在线成人免费视频| av中文字幕播放| 精品粉嫩超白一线天av| 天天操天天干天天插| 亚洲老司机av| porn视频在线观看| 精品久久久av| 里番在线播放| 青草青草久热精品视频在线观看| 精品国产第一福利网站| 国产日本欧美一区| 精品一区二区三区四区五区| 国产传媒欧美日韩| 欧美中文一区| 视频一区国产精品| 91成人免费| 国产一区二区在线视频播放| 久久国产66| 精品亚洲视频在线| www.亚洲精品| 2019男人天堂| 亚洲精选免费视频| 日本黄色片视频| 欧洲一区二区av| 国产视频一二三四区| 精品88久久久久88久久久| 秋霞av在线| 日韩在线中文视频| free性m.freesex欧美| 国产成人精品视频| 精品一区二区三区亚洲| 欧美lavv| 中文字幕一区二区三三| 免费成人午夜视频| 精品制服美女丁香| 国产又粗又猛又色| 中文字幕一区二区三中文字幕| xxxx 国产| 欧美日韩久久一区| 少妇高潮久久久| 日日噜噜噜夜夜爽亚洲精品| xxxcom在线观看| 国产精品日韩专区| 日本韩国欧美超级黄在线观看| 亚洲一区二区不卡视频| 亚洲黄色影片| 在线观看日本www| 26uuu国产电影一区二区| 希岛爱理中文字幕| 色天使久久综合网天天| 亚洲精品一区二区三区不卡| 在线播放国产一区中文字幕剧情欧美 | 亚洲AV无码成人精品区东京热 | 欧美视频一二区| 日日骚久久av| 欧美极品影院| 国产伦精品一区| 一区二区三区午夜探花| 亚欧在线免费观看| 91视频国产观看| 久草免费新视频| 7777精品伊人久久久大香线蕉超级流畅| 欧美日韩在线中文字幕| 久久久久亚洲精品国产| 国产高清亚洲| 亚洲自拍三区| 日韩在线a电影| 国产肉体xxxx裸体784大胆| 亚洲女人****多毛耸耸8| 中文字幕资源网| 亚洲欧美日韩国产成人| 成av人片在线观看www| 99视频免费观看| 亚洲精品二区三区| av免费一区二区| 国产精品美女www爽爽爽| 日韩电影在线观看一区二区| 日韩av中文字幕在线| av影视在线看| 国产嫩草一区二区三区在线观看| 亚洲精品va| 久久久精品视频国产| 综合自拍亚洲综合图不卡区| 在线观看不卡的av| 亚洲天堂一区二区三区| 成人激情综合| 天天久久人人| 琪琪一区二区三区| youjizz亚洲女人| 欧美日韩综合色| 日本不卡在线| 91久久国产综合久久91精品网站 | 国产精品视频网站在线观看| 国产精品91xxx| 久久午夜鲁丝片午夜精品| 日韩精品一区二区三区视频| 男女在线视频| 国产三区精品| 亚洲欧美激情诱惑| 男人操女人动态图| 欧美在线你懂得| 尤物网址在线观看| 成人免费网站在线| 黄色亚洲大片免费在线观看| 这里只有精品在线观看视频| 欧美日韩亚洲精品一区二区三区| 免费看男男www网站入口在线 | 国产精品成人**免费视频| 日本三级福利片| 国产成人精品影视| 国产一级免费av| 日韩av中文字幕在线播放| 国产精品亚洲d| 在线无限看免费粉色视频| 国产精品系列在线播放| 日韩免费观看一区二区| 亚洲欧美一区二区三区在线 | 国产麻豆日韩| 嫩草成人www欧美| 国产一区在线观看免费| 日韩欧美专区在线| 在线观看特色大片免费视频| 日韩欧美三级一区二区| 国产自产2019最新不卡| 国产网址在线观看| 一区二区三区视频在线| 欧美午夜在线播放| 国产女大学生av| 国产精品三级久久久久三级| 亚洲AV午夜精品| 日韩美女视频在线观看| 91精品久久久久久久久久不卡| 手机免费看av片| 欧美日韩视频一区二区| 操喷在线视频| 在线观看精品视频| 99久久免费视频.com| 91在线精品入口| 欧美亚洲日本网站| 中文字幕一区二区三区久久网站| 一级国产黄色片| 91精品国产综合久久婷婷香蕉|