Netflix Zuul 限流类型

前面介绍了 spring-cloud-zuul-ratelimit 限流简单示例,spring-cloud-zuul-ratelimit 还提供了多种内置的限流类型,方便使用,主要包括以下几种:

ORIGIN(请求来源)

基于请求的来源进行限流,通常是指请求的 IP 地址或经过反向代理后的 IP 地址。这对于防止来自特定 IP 地址或网络区域的恶意攻击或过度请求非常有用。例如:

zuul:
  ratelimit:
    enabled: true
    default-policy-list:
      - limit: 100
        refresh-interval: 60
        type: [ORIGIN]

说明:limit: 100 表示在 60 秒(refresh-interval)内,来自同一 IP 地址的请求最多允许 100 次。这有助于控制来自特定 IP 的请求流量,防止 IP 地址发起的 DoS 攻击或爬虫过度请求。

USER(用户)

基于用户进行限流,该用户通常是经过认证的用户标识。这需要与用户认证机制配合使用,如 Spring Security。例如:

zuul:
  ratelimit:
    enabled: true
    default-policy-list:
      - limit: 50
        refresh-interval: 60
        type: [USER]

说明:limit: 50 表示在 60 秒内,同一用户的请求最多允许 50 次。不同用户的请求将分别统计和限流,这对于实现基于用户的个性化服务和资源分配非常有用,例如,不同用户等级可能有不同的请求限制。

URL(请求路径)

按照请求的具体 URL 路径进行限流。这可以精确控制对每个服务接口的访问频率,对于保护资源消耗大或敏感的服务接口非常有效。例如:

zuul:
  ratelimit:
    enabled: true
    default-policy-list:
      - limit: 20
        refresh-interval: 30
        type: [URL]

说明:limit: 20 表示在 30 秒内,对于同一请求 URL 的请求最多允许 20 次。比如对于 /api/v1/resource 这样的接口,可以单独设置限流策略,防止对该接口的过度访问。

URL_PATTERN(请求路径模式)

基于 URL 的模式进行限流,可以使用通配符等方式来匹配多个相关的 URL 路径。这种方式适用于对一组具有相似功能的接口进行统一限流。例如:

zuul:
  ratelimit:
    enabled: true
    default-policy-list:
      - limit: 30
        refresh-interval: 60
        type: [URL_PATTERN]
  ratelimit-policies:
    myPattern:
      - limit: 30
        refresh-interval: 60
        pattern: /api/v1/*

说明:

  • type: [URL_PATTERN] 表示使用 URL 模式进行限流。

  • pattern: /api/v1/* 是具体的模式,这里表示对 /api/v1/ 开头的所有 URL 进行限流,limit: 30 表示在 60 秒内对这些 URL 的请求最多允许 30 次。

ROLE(用户角色)

基于用户角色进行限流,需要结合用户认证和角色管理机制,如 Spring Security 提供的角色信息。例如:

zuul:
  ratelimit:
    enabled: true
    default-policy-list:
      - limit: 40
        refresh-interval: 60
        type: [ROLE]

说明:limit: 40 表示在 60 秒内,同一角色的用户请求最多允许 40 次。不同角色的用户可能对系统资源的需求不同,可根据角色进行差异化的限流,比如管理员和普通用户可能有不同的请求限制。

HTTP_METHOD(HTTP 请求方法)

根据不同的 HTTP 请求方法(如 GET、POST、PUT、DELETE 等)进行限流。不同的请求方法对系统资源的消耗可能不同,可根据方法特点进行针对性的限流。例如:

zuul:
  ratelimit:
    enabled: true
    default-policy-list:
      - limit: 15
        refresh-interval: 60
        type: [HTTP_METHOD]
    policy-list:
      - path: /api/v1/data
        limit: 10
        refresh-interval: 60
        type: [HTTP_METHOD]

说明:

  • type: [HTTP_METHOD] 表示基于请求方法限流。

  • 对于 /api/v1/data 接口,使用 policy-list 可以为该接口单独设置 limit: 10,表示在 60 秒内对该接口的请求方法的请求最多允许 10 次。

HTTP_HEADER(HTTP 请求头)

基于 HTTP 请求头中的信息进行限流。可以根据请求头中的自定义字段或标准字段(如 User-Agent)来识别请求并进行限流。例如:

zuul:
  ratelimit:
    enabled: true
    default-policy-list:
      - limit: 80
        refresh-interval: 3600
        type: [HTTP_HEADER]
    http-header-names:
      - User-Agent

说明:

  • type: [HTTP_HEADER] 表示基于请求头限流。

  • http-header-names 中指定了要使用的请求头,这里是 User-Agent。limit: 80 表示在一小时(3600 秒)内,对于具有相同 User-Agent 的请求最多允许 80 次。

这些限流类型可以单独使用,也可以根据具体业务需求组合使用,为 spring-cloud-zuul-ratelimit 提供了强大的限流功能。通过合理配置这些限流类型,可以有效地保护后端服务,确保系统在高负载情况下的稳定性和可用性,同时可以根据不同的请求特征和用户特征实现精细化的流量控制。

此外,在实际应用中,还可以根据不同的场景灵活调整限流的时间间隔(refresh-interval)和请求限制(limit)等参数,并且可以通过使用不同的存储库(如 Redis)来存储限流信息,以适应不同的系统架构,例如分布式系统或单机系统。通过这些限流类型的灵活运用,可以更好地应对不同的流量模式和业务需求,提高系统的服务质量和安全性。

 

点击下载/查看本教程相关资料或者源代码。
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号