在项目中,大部分都会使用到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依赖,修改配置文件,即可实现效果。