前面介绍了 spring-cloud-zuul-ratelimit 限流简单示例,spring-cloud-zuul-ratelimit 还提供了多种内置的限流类型,方便使用,主要包括以下几种:
基于请求的来源进行限流,通常是指请求的 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 攻击或爬虫过度请求。
基于用户进行限流,该用户通常是经过认证的用户标识。这需要与用户认证机制配合使用,如 Spring Security。例如:
zuul: ratelimit: enabled: true default-policy-list: - limit: 50 refresh-interval: 60 type: [USER]
说明:limit: 50 表示在 60 秒内,同一用户的请求最多允许 50 次。不同用户的请求将分别统计和限流,这对于实现基于用户的个性化服务和资源分配非常有用,例如,不同用户等级可能有不同的请求限制。
按照请求的具体 URL 路径进行限流。这可以精确控制对每个服务接口的访问频率,对于保护资源消耗大或敏感的服务接口非常有效。例如:
zuul: ratelimit: enabled: true default-policy-list: - limit: 20 refresh-interval: 30 type: [URL]
说明:limit: 20 表示在 30 秒内,对于同一请求 URL 的请求最多允许 20 次。比如对于 /api/v1/resource 这样的接口,可以单独设置限流策略,防止对该接口的过度访问。
基于 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 次。
基于用户角色进行限流,需要结合用户认证和角色管理机制,如 Spring Security 提供的角色信息。例如:
zuul: ratelimit: enabled: true default-policy-list: - limit: 40 refresh-interval: 60 type: [ROLE]
说明:limit: 40 表示在 60 秒内,同一角色的用户请求最多允许 40 次。不同角色的用户可能对系统资源的需求不同,可根据角色进行差异化的限流,比如管理员和普通用户可能有不同的请求限制。
根据不同的 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 请求头中的信息进行限流。可以根据请求头中的自定义字段或标准字段(如 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)来存储限流信息,以适应不同的系统架构,例如分布式系统或单机系统。通过这些限流类型的灵活运用,可以更好地应对不同的流量模式和业务需求,提高系统的服务质量和安全性。
点击下载/查看本教程相关资料或者源代码。