摘要:對請求的目標(biāo)進(jìn)行限流例如某個每分鐘只允許調(diào)用多少次對客戶端的訪問進(jìn)行限流例如某個每分鐘只允許請求多少次對某些特定用戶或者用戶組進(jìn)行限流例如非用戶限制每分鐘只允許調(diào)用次某個等多維度混合的限流。
對請求的目標(biāo)URL進(jìn)行限流(例如:某個URL每分鐘只允許調(diào)用多少次)
對客戶端的訪問IP進(jìn)行限流(例如:某個IP每分鐘只允許請求多少次)
對某些特定用戶或者用戶組進(jìn)行限流(例如:非VIP用戶限制每分鐘只允許調(diào)用100次某個API等)
多維度混合的限流。此時,就需要實現(xiàn)一些限流規(guī)則的編排機(jī)制。與、或、非等關(guān)系。
介紹spring-cloud-zuul-ratelimit是和zuul整合提供分布式限流策略的擴(kuò)展,只需在yaml中配置幾行配置,就可使應(yīng)用支持限流
支持的限流粒度com.marcosbarbero.cloud spring-cloud-zuul-ratelimit 1.3.4.RELEASE
服務(wù)粒度 (默認(rèn)配置,當(dāng)前服務(wù)模塊的限流控制)
用戶粒度 (詳細(xì)說明,見文末總結(jié))
ORIGIN粒度 (用戶請求的origin作為粒度控制)
接口粒度 (請求接口的地址作為粒度控制)
以上粒度自由組合,又可以支持多種情況。
如果還不夠,自定義RateLimitKeyGenerator實現(xiàn)。
//默認(rèn)實現(xiàn) public String key(final HttpServletRequest request, final Route route, final RateLimitProperties.Policy policy) { final List支持的存儲方式types = policy.getType(); final StringJoiner joiner = new StringJoiner(":"); joiner.add(properties.getKeyPrefix()); if (route != null) { joiner.add(route.getId()); } if (!types.isEmpty()) { if (types.contains(Type.URL) && route != null) { joiner.add(route.getPath()); } if (types.contains(Type.ORIGIN)) { joiner.add(getRemoteAddr(request)); } // 這個結(jié)合文末總結(jié)。 if (types.contains(Type.USER)) { joiner.add(request.getUserPrincipal() != null ? request.getUserPrincipal().getName() : ANONYMOUS_USER); } } return joiner.toString(); }
InMemoryRateLimiter - 使用 ConcurrentHashMap作為數(shù)據(jù)存儲
ConsulRateLimiter - 使用 Consul 作為數(shù)據(jù)存儲
RedisRateLimiter - 使用 Redis 作為數(shù)據(jù)存儲
SpringDataRateLimiter - 使用 數(shù)據(jù)庫 作為數(shù)據(jù)存儲
限流配置limit 單位時間內(nèi)允許訪問的個數(shù)
quota 單位時間內(nèi)允許訪問的總時間(統(tǒng)計每次請求的時間綜合)
refresh-interval 單位時間設(shè)置
zuul: ratelimit: key-prefix: your-prefix enabled: true repository: REDIS behind-proxy: true policies: myServiceId: limit: 10 quota: 20 refresh-interval: 30 type: - user
以上配置意思是:30秒內(nèi)允許10個訪問,并且要求總請求時間小于20秒
效果展示yaml配置:
zuul: ratelimit: key-prefix: pig-ratelimite enabled: true repository: REDIS behind-proxy: true policies: pig-admin-service: limit: 2 quota: 1 refresh-interval: 3
動態(tài)圖 ↓↓↓↓↓
Redis 中數(shù)據(jù)結(jié)構(gòu) 注意紅色字體
可以使用Spring Boot Actuator 提供的服務(wù)狀態(tài),動態(tài)設(shè)置限流開關(guān)
源碼可以參考:https://gitee.com/log4j/pig
用戶限流的實現(xiàn):如果你的項目整合 Shiro 或者 Spring Security 安全框架,那么會自動維護(hù)request域UserPrincipal,如果是自己的框架,請登錄成功后維護(hù)request域UserPrincipal,才能使用用戶粒度的限流。未登錄默認(rèn)是:anonymous
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70685.html
摘要:綜述經(jīng)調(diào)研,使用解決方案的占多數(shù),已經(jīng)能滿足絕大多數(shù)公司需求。但除了一些超級公司外,比如阿里,京東,他們是自己擼的一套網(wǎng)關(guān)。 綜述 經(jīng)調(diào)研,使用Spring Cloud Zuul解決方案的占多數(shù),已經(jīng)能滿足絕大多數(shù)公司需求。但除了一些超級公司外,比如阿里,京東,他們是自己擼的一套網(wǎng)關(guān)。此外,點評直接采用的nginx負(fù)載均衡前置網(wǎng)關(guān),而沒用第七層網(wǎng)關(guān),原因據(jù)說是七層網(wǎng)關(guān)會影響性能,但由于...
摘要:今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉(zhuǎn)發(fā)。 今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉(zhuǎn)發(fā)。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...
摘要:今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉(zhuǎn)發(fā)。 今天整理了一下近大半年以來的一些文章,和我的預(yù)期一樣,很多文章我都忘記自己曾經(jīng)寫過了,這個記錄的過程讓我也有了新的理解。希望大家,收藏,點贊,加轉(zhuǎn)發(fā)。 面試必備 面試必備:深入Spring MVC DispatchServlet 源碼...
摘要:整理自楊波老師的總結(jié)注冊中心支持模型存儲和靈活健康檢查能力。服務(wù)網(wǎng)關(guān)選擇是最佳搭配,但異步性能不足基于的異步未推出正式版。配置中心缺失治理能力。監(jiān)控存儲依賴于時間序列數(shù)據(jù)庫。隊列對于日志等可靠性要求不高的場景,用。功能強(qiáng)大但復(fù)雜。 整理自楊波老師的總結(jié) showImg(https://segmentfault.com/img/bV3iL1?w=800&h=512); 注冊中心 Eur...
摘要:常見的限流方式,比如適用線程池隔離,超過線程池的負(fù)載,走熔斷的邏輯。在令牌桶算法中,存在一個桶,用來存放固定數(shù)量的令牌。,令牌桶每秒填充平均速率。 轉(zhuǎn)載請標(biāo)明出處: https://www.fangzhipeng.com本文出自方志朋的博客 在高并發(fā)的系統(tǒng)中,往往需要在系統(tǒng)中做限流,一方面是為了防止大量的請求使服務(wù)器過載,導(dǎo)致服務(wù)不可用,另一方面是為了防止網(wǎng)絡(luò)攻擊。 常見的限流方式,...
閱讀 3311·2023-04-25 22:47
閱讀 3822·2021-10-11 10:59
閱讀 2335·2021-09-07 10:12
閱讀 4308·2021-08-11 11:15
閱讀 3457·2019-08-30 13:15
閱讀 1774·2019-08-30 13:00
閱讀 996·2019-08-29 14:02
閱讀 1712·2019-08-26 13:57