精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产午夜在线播放| 亚洲乱妇老熟女爽到高潮的片| 美女毛片在线看| 日韩av网站在线观看| 久久久99免费视频| 国产吃瓜黑料一区二区| 超碰超碰人人人人精品| 中文字幕日韩一区二区| 国产66精品久久久久999小说| 欧美国产成人精品一区二区三区| 首页国产精品| 亚洲黄页网在线观看| 波多野结衣xxxx| 黄色的视频在线观看| 亚洲国产精品av| 99久久自偷自偷国产精品不卡| 中文字幕激情小说| 亚洲精品99| 亚洲欧美日韩在线一区| 久久精品无码一区二区三区毛片 | 欧美成年网站| 欧美色另类天堂2015| 日本丰满少妇黄大片在线观看| 婷婷久久久久久| 国产精品一色哟哟哟| 全球成人中文在线| 美女毛片在线观看| 外国成人激情视频| 亚洲视频在线免费观看| 黄色免费视频网站| 国产精品免费精品自在线观看| 91成人在线免费观看| 日本大片免费看| 日本在线播放| 久久精品这里都是精品| 国产一区精品在线| 国模人体一区二区| 国产一区二区伦理片| 国产精品视频26uuu| 亚洲欧美综合自拍| 99精品福利视频| 欧美激情videos| 欧美精品色哟哟| 91精品国产福利在线观看麻豆| 一区二区三区久久精品| 少妇真人直播免费视频| 日韩mv欧美mv国产网站| 精品国产91久久久久久久妲己 | 精品美女一区| 欧洲一区在线电影| 别急慢慢来1978如如2| 密臀av在线播放| 精品久久久视频| 男女视频网站在线观看| 亚洲精品天堂| 亚洲综合丝袜美腿| 青青草视频国产| xxx在线免费观看| 亚洲一区二区三区四区中文字幕| 青青草视频在线视频| jizzjizz亚洲| 亚洲成a人片在线观看中文| 国产精品第157页| heyzo在线欧美播放| 午夜精品久久久久久久久久久 | 欧美另类老肥妇| 欧美日韩国产综合视频在线观看中文| 欧美视频在线观看网站| 345成人影院| 日韩欧美主播在线| 国产三级日本三级在线播放| 国产a亚洲精品| 7777精品伊人久久久大香线蕉| 夜夜爽久久精品91| 超碰精品在线观看| 亚洲欧美另类在线观看| 亚洲第一视频区| 小小影院久久| 久久久久久久久电影| 91九色丨porny丨肉丝| 丝瓜av网站精品一区二区| 国产精品美女久久久久av超清| 97免费观看视频| 成人精品国产免费网站| 欧洲亚洲一区二区三区四区五区| www 日韩| 一区二区三区高清| 毛葺葺老太做受视频| 日韩第二十一页| 亚洲国产精品中文| 99久久99久久精品免费| 欧美日韩三级| 国产精品久久久久久久久| av资源免费看| 久久伊人中文字幕| 免费观看中文字幕| 无遮挡爽大片在线观看视频 | 成人在线免费观看视频| 欧美精品免费在线| 天天干天天干天天操| 久久99国产精品免费网站| 国产精品一区二区欧美黑人喷潮水| 毛片在线播放网址| 一区二区三区欧美日| 亚洲爆乳无码专区| 久久国产精品美女| 国产一级揄自揄精品视频| 久久精品国产亚洲av无码娇色| 日产国产高清一区二区三区| 97久久夜色精品国产九色| 日本不卡免费播放| 亚洲综合免费观看高清在线观看| 99久久国产宗和精品1上映| 美女精品久久| 日韩在线免费视频观看| 东京热一区二区三区四区| 成人小视频在线观看| 在线观看欧美亚洲| 88xx成人永久免费观看| 亚洲精品美女在线观看| 欧美毛片在线观看| 黄色小说综合网站| 婷婷四房综合激情五月| 成人午夜视屏| 日韩激情视频在线播放| 久久久精品一区二区涩爱| 激情图区综合网| 天天综合色天天综合色hd| 亚洲男人av| 日韩av中文在线| 国产精品第二十页| 国产精品2024| 四虎精品欧美一区二区免费| 日本久久二区| 色爱精品视频一区| 在线免费a视频| 国产女主播在线一区二区| 日韩精品一区二区三区色欲av| 国内自拍欧美| 国语自产偷拍精品视频偷| 国产精品羞羞答答在线| 日本一区二区三区国色天香| 丝袜老师办公室里做好紧好爽| 麻豆一区一区三区四区| 2019av中文字幕| 亚洲av片在线观看| 韩曰欧美视频免费观看| 草草地址线路①屁屁影院成人| 亚洲国产专区校园欧美| 国产精品高清一区二区三区| 日本h片在线观看| 精品国产免费人成电影在线观看四季 | 黄色一级片播放| 日韩中文av| 情事1991在线| jizz在线观看中文| 欧美日韩国产综合一区二区 | 911久久香蕉国产线看观看| 国产日韩在线一区| 国产原创视频在线观看| 欧美一级淫片007| 久久精品女人毛片国产| 99精品欧美一区二区三区综合在线| 欧美综合在线播放| 伊甸园亚洲一区| 国产精品电影网站| 久久精品视频免费看| 日韩亚洲欧美在线观看| 久久精品视频日本| 久久综合色婷婷| 在线观看高清免费视频| 自拍视频亚洲| 精品免费国产| 国产成人a视频高清在线观看| 久久精品久久久久久国产 免费| av中文字幕免费| 亚洲成av人片在线观看无码| 国产特黄级aaaaa片免| 日韩不卡一区二区三区| 一区一区视频| 久久中文字幕导航| 国产精品日韩在线| 1024在线播放| 亚洲九九九在线观看| 中文字幕+乱码+中文字幕明步| 亚洲人妖av一区二区| 成年人小视频在线观看| 丝袜美腿亚洲色图| 免费看日b视频| 国产一区二区精品福利地址| 91色精品视频在线| 午夜影院在线播放| 精品国产自在精品国产浪潮| 手机在线观看免费av| 欧洲另类一二三四区| 久久机热这里只有精品| 国产亚洲人成网站| 18深夜在线观看免费视频| 久久蜜桃资源一区二区老牛| 成人短视频在线看| 亚洲自拍电影| 国产v亚洲v天堂无码| 全球最大av网站久久| 欧美精品福利在线| 天堂资源在线中文| 日韩国产精品视频| 国产成人精品无码高潮| 91国偷自产一区二区三区观看 | 在线免费观看黄色av| 精品精品国产高清a毛片牛牛| 中文字幕亚洲乱码熟女1区2区| 亚洲美女淫视频| 林心如三级全黄裸体| 91麻豆文化传媒在线观看| 日本成人在线免费观看| 免播放器亚洲一区| 女性隐私黄www网站视频| 亚洲第一黄色| 992tv快乐视频| 久久精品国产68国产精品亚洲| 久久久久高清| 大奶一区二区三区| 91超碰在线免费观看| 日韩五码电影| 国产精品一区久久久| 日韩成人动漫| 欧美与欧洲交xxxx免费观看| 丁香影院在线| 色综合久久精品亚洲国产| 日本精品一区二区三区在线播放| 亚洲国产中文字幕久久网| www.蜜桃av.com| 欧美一区二区三区成人| 99热这里是精品| 欧美久久久久中文字幕| 在线观看视频二区| 欧美日本在线视频| 国产精品久久免费| 欧美伊人久久久久久午夜久久久久| 91浏览器在线观看| 亚洲高清免费观看 | 欧美黄免费看| a级网站在线观看| 68国产成人综合久久精品| 伊人情人网综合| 欧美高清视频手机在在线| 深夜福利成人| 欧美电影《轻佻寡妇》| 伊人婷婷久久| 午夜久久福利| 国产毛片视频网站| 国产毛片久久| wwwwww.色| 麻豆成人免费电影| 超碰在线免费av| 国产精品一区免费视频| 中文字幕1区2区| www.亚洲激情.com| 男生草女生视频| 中文字幕av一区二区三区免费看 | 国产在线观看免费播放| 国产91高潮流白浆在线麻豆 | www.成人免费视频| 欧美成人三级在线| 色视频在线观看福利| 亚洲午夜av电影| 久久黄色美女电影| 欧美精品video| 牛牛精品一区二区| 国产精品久久久久久亚洲调教 | 日韩精品一级中文字幕精品视频免费观看| 欧美日韩第二页| 精品国产91乱码一区二区三区 | 香蕉精品久久| 日韩精品久久一区| 日本久久一二三四| 日本精品免费视频| 激情另类综合| 国产v亚洲v天堂无码久久久| 精品制服美女久久| 人妖粗暴刺激videos呻吟| 久久久久久毛片| 日本不卡一区视频| 亚洲免费在线看| 麻豆成人免费视频| 日韩一区二区三区四区五区六区| 日本黄视频在线观看| 正在播放欧美视频| xxx.xxx欧美| 国产精品久久久久久亚洲调教| 欧美成人精品一级| 欧洲久久久久久| 午夜久久影院| 亚洲天堂2018av| 国产69精品久久99不卡| 日本美女bbw| 亚洲成人www| 国产精品欧美亚洲| 亚洲天堂第二页| 成人影音在线| 成人女保姆的销魂服务| 亚洲成人一品| 美女av免费观看| 奇米色777欧美一区二区| 人妻av一区二区| 综合激情成人伊人| 日韩精品在线一区二区三区| 精品成人a区在线观看| 美女羞羞视频在线观看| 欧洲亚洲免费视频| 成人台湾亚洲精品一区二区| 一区二区在线中文字幕电影视频| 亚洲综合国产激情另类一区| 18深夜在线观看免费视频| 国产精品国模大尺度视频| 天堂网免费视频| 亚洲国产精品成人av| 91精品国产91久久久久久青草| 国产精品视频播放| 亚洲人和日本人hd| 国精产品一区一区三区视频| 国产精品中文欧美| 日韩在线观看免| 欧美性猛交xxxxxx富婆| 嫩草精品影院| 日本不卡高字幕在线2019| 国产精品白丝av嫩草影院| 亚洲一区 在线播放| 男人的j进女人的j一区| 久久国产柳州莫菁门| 欧美日韩一区二区三区在线免费观看| 国产成人无码www免费视频播放| 美女久久久久久久| 国产精品日本一区二区不卡视频 | 精品麻豆一区二区三区| 国产精品一区专区欧美日韩| 国产一区二区三区四区五区传媒| 1024av视频| 91毛片在线观看| 国产视频1区2区| 亚洲男人天堂古典| 黑人巨大精品| 日韩欧美在线电影| 麻豆国产91在线播放| 91视频免费看片| 56国语精品自产拍在线观看| 免费观看在线黄色网| 91精品久久久久久久久久另类| 爽成人777777婷婷| 国产精品久久久久久久99| 亚洲视频在线观看三级| 国产一区二区三区成人| 不卡av日日日| 成人福利一区| 一区二区传媒有限公司| 久久久久久久久免费| 香蕉污视频在线观看| 中文字幕精品网| 日本在线一区二区三区| 男人添女人荫蒂免费视频| 99精品视频一区二区三区| 丁香社区五月天| 日韩一区二区在线视频| 美女久久精品| 日韩小视频在线播放| 国产清纯在线一区二区www| 欧美另类高清videos的特点| xvideos成人免费中文版| 秋霞一区二区| 日本少妇高潮喷水视频| 国产欧美日韩精品在线| 国产a级免费视频| 97免费中文视频在线观看| 免费一区二区三区视频导航| 91人人澡人人爽人人精品| 亚洲欧美另类小说| 无套内谢的新婚少妇国语播放| 国产精品88a∨| 91精品国偷自产在线电影| 扒开伸进免费视频| 在线一区二区视频| 国产区在线观看| 久久久久久欧美精品色一二三四| 麻豆91在线观看| 国产一级做a爱免费视频| 国产亚洲a∨片在线观看| 国产乱码精品一区二区三区亚洲人| 99在线免费视频观看| 国产日韩欧美不卡在线| 亚洲av无码一区二区三区性色 | 国产片侵犯亲女视频播放| 26uuu另类欧美| 国产人妖在线播放| 日韩av电影中文字幕| 欧美freesex交免费视频| x88av在线| 亚洲成人1234| 国产精品99久久免费| 无遮挡又爽又刺激的视频| 亚洲精品欧美专区|