Zuul:構(gòu)建高可用網(wǎng)關(guān)之多維度限流

  • 對請求的目標(biāo)URL進行限流(例如:某個URL每分鐘只允許調(diào)用多少次)
  • 對客戶端的訪問IP進行限流(例如:某個IP每分鐘只允許請求多少次)
  • 對某些特定用戶或者用戶組進行限流(例如:非VIP用戶限制每分鐘只允許調(diào)用100次某個API等)
  • 多維度混合的限流。此時纯路,就需要實現(xiàn)一些限流規(guī)則的編排機制。與愈腾、或、非等關(guān)系评架。

介紹

spring-cloud-zuul-ratelimit是和zuul整合提供分布式限流策略的擴展,只需在yaml中配置幾行配置,就可使應(yīng)用支持限流

<dependency>
    <groupId>com.marcosbarbero.cloud</groupId>
    <artifactId>spring-cloud-zuul-ratelimit</artifactId>
    <version>1.3.4.RELEASE</version>
</dependency>

支持的限流粒度

  • 服務(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<Type> 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();
}

支持的存儲方式

image
  • 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)圖 ↓↓↓↓↓

image

Redis 中數(shù)據(jù)結(jié)構(gòu) 注意紅色字體

image

總結(jié)

  • 可以使用Spring Boot Actuator 提供的服務(wù)狀態(tài)郊酒,動態(tài)設(shè)置限流開關(guān)
  • 源碼可以參考:https://gitee.com/log4j/pig
  • 用戶限流的實現(xiàn):如果你的項目整合 Shiro 或者 Spring Security 安全框架遇绞,那么會自動維護request域UserPrincipal,如果是自己的框架燎窘,請登錄成功后維護request域UserPrincipal摹闽,才能使用用戶粒度的限流。未登錄默認(rèn)是:anonymous
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褐健,一起剝皮案震驚了整個濱河市付鹿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蚜迅,老刑警劉巖舵匾,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谁不,居然都是意外死亡坐梯,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門刹帕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吵血,“玉大人,你說我怎么就攤上這事偷溺〖桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵亡蓉,是天一觀的道長晕翠。 經(jīng)常有香客問我,道長砍濒,這世上最難降的妖魔是什么淋肾? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮爸邢,結(jié)果婚禮上樊卓,老公的妹妹穿的比我還像新娘。我一直安慰自己杠河,他們只是感情好碌尔,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布浇辜。 她就那樣靜靜地躺著,像睡著了一般唾戚。 火紅的嫁衣襯著肌膚如雪柳洋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天叹坦,我揣著相機與錄音熊镣,去河邊找鬼。 笑死募书,一個胖子當(dāng)著我的面吹牛绪囱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播莹捡,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鬼吵,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了篮赢?” 一聲冷哼從身側(cè)響起齿椅,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荷逞,沒想到半個月后媒咳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡种远,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年涩澡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坠敷。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡妙同,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出膝迎,到底是詐尸還是另有隱情粥帚,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布限次,位于F島的核電站芒涡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏卖漫。R本人自食惡果不足惜费尽,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羊始。 院中可真熱鬧旱幼,春花似錦、人聲如沸突委。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缘缚,卻和暖如春勾笆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背忙灼。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工匠襟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留钝侠,地道東北人该园。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像帅韧,于是被迫代替她去往敵國和親里初。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容