Zuul【限流】


在項目中,大部分都會使用到hyrtrix做熔斷機制,通過某個預定的閾值來對異常流量進行降級處理,除了做服務降級以外,還可以對服務進行限流,分流,排隊等。

當然,zuul也能做到限流策略,最簡單的方式就是使用自定義的filter加上限流算法,生產環境中zuul網關肯定是部署的多節點,所以還會借助類似Redis的K/V存儲工具。

這里借助的是第三方工具《spring-cloud-zuul-ratelimit》,開箱即用,直接加入pom依賴即可:

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

它提供了多種細粒度策略:

  • user:認證用戶名或者匿名,針對某個用戶進行限流。
  • origin:客戶機IP,針對請求的客戶機IP進行限流。
  • url:針對某個特定的url進行限流。
  • serviceId:針對某個服務進行限流。

多粒度臨時變量存儲方式:

  • IN_MEMEORY:基於本地內存,底層是ConcurrentHashMap。
  • REDIS:基於Redis的K/V存儲。
  • CONSUL:基於consul的K/V存儲。
  • JPA:基於數據庫。
  • BUKET4J:Java編寫的基於令牌桶算法的限流庫,它有4種模式,JCache、Hazelcast、Apache Ignite、Inifinispan,后面3種支持異步。

配置文件:

spring:
  application:
    name: zuul-server
server:
  port: 5555
eureka:
  client:
    serviceUrl:
      defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8888}/eureka/
  instance:
    prefer-ip-address: true
zuul:
  routes:
    client-a:
      path: /client/**
      serviceId: client-a
  ratelimit: 
    #key-prefix: springcloud-book #按粒度拆分的臨時變量key前綴
    enabled: true #啟用開關
    repository: IN_MEMORY #key存儲類型,默認是IN_MEMORY本地內存,此外還有多種形式
    behind-proxy: true #表示代理之后
    default-policy: #全局限流策略,可單獨細化到服務粒度
      limit: 2 #在一個單位時間窗口的請求數量
      quota: 1 #在一個單位時間窗口的請求時間限制(秒)
      refresh-interval: 3 #單位時間窗口(秒)
      type: 
        - user #可指定用戶粒度
        - origin #可指定客戶端地址粒度
        - url #可指定url粒度

上面的配置是說,3秒中內不能有超過2次的接口調用,只需在zuul工程中加入pom依賴,修改配置文件,即可實現效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM