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

  • 相关阅读:
    SGU 127. Telephone directory --- 模拟
    SGU 126. Boxes --- 模拟
    SGU 128. Snake --- 暴力枚举+并查集+贪心+计算几何
    Codeforces Round #246 (Div. 2) B. Football Kit
    Codeforces Round #252 (Div. 2) C. Valera and Tubes
    Codeforces Round #251 (Div. 2) C. Devu and Partitioning of the Array
    codeforces --- Round #250 (Div. 2) B. The Child and Set
    codeforces --- Round #250 (Div. 2) A. The Child and Homework
    AFNetworking 动态修改acceptableContentTypes 设置ContentType
    swift pod第三方OC库使用use_frameworks!导致#import提示无法找到头文件
  • 原文地址:https://www.cnblogs.com/idoljames/p/11743457.html
Copyright © 2020-2023  润新知