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依赖,修改配置文件,即可实现效果。

posted @ 2019-10-26 15:52  KingJames、  阅读(1667)  评论(1编辑  收藏  举报