在項目中,大部分都會使用到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依賴,修改配置文件,即可實現效果。