JBoss apiman 中基于速率的策略和配额

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在这篇关于 JBoss 的新 API 管理框架 apiman 系列文章的第六篇文章中,我们将研究 apiman 如何使您能够通过使用速率限制策略来管理对托管服务的访问。

apiman 的运行时核心是 API 网关及其应用于传入服务请求的策略。 apiman 开箱即用地配置了各种策略,可用于根据 IP 地址、用户身份验证和使用级别来管理对 API 网关管理的服务的访问。从第一个版本开始,apiman 就支持速率限制策略,其中服务使用的上限可以由策略管理。在其新的 1.1.6 版本中,apiman 扩展了这种支持以包括基于配额的限制策略。

限制政策的类型

从 1.1.6 版开始,apiman 支持这些类型的限制策略:

  • 速率限制 - 此策略类型控制在指定时间段内向服务发出请求的次数。这些请求可以按用户、应用程序或服务进行过滤,并且可以将时间段的粒度级别设置为秒、分钟、小时、天、月或年。此策略类型的预期用途是用于细粒度处理(例如,每秒 10 个请求)。
  • 配额 - 此策略类型执行与速率限制策略类型相同的基本功能。但是,此策略类型的预期用途是用于不太细粒度的处理(例如,每月 10,000 个请求)。
  • 传输配额 - 与其他策略类型相比,传输配额跟踪传输的字节数(上传或下载)而不是发出的请求总数。

这些策略中的每一个,如果单独使用,都可以有效地限制请求。但是,apiman 通过允许您组合使用这些策略类型,为您使用这些策略类型增加了一层额外的灵活性。让我们看几个例子。

限制政策的组合 = 灵活性

限制一段时间内的服务请求总数是一项简单的任务,因为这可以在配额策略中进行配置。但是,此策略可能不会产生预期的效果,因为配额可能会在定义的时间段内提前达到。如果发生这种情况,在剩余时间段内向服务发出的请求将被策略阻止。处理这种情况的更好方法是实施更灵活的方法,将月度配额策略与细粒度的速率限制策略相结合,以限制流量。

例如,一个月大约有 250 万秒。如果我们想设置一个月的服务请求配额为50万,那么我们也可以设置一个限速策略,限制为每秒5次请求,保证服务请求被限流,整个服务都可以访问月。

这是基于一周时间段的速率限制策略的直观视图。如果我们定义每周配额,则无法保证用户在一周结束之前不会使用该配额。这将导致服务请求在周末被拒绝:

相反,如果我们使用更细粒度的策略来增加每周配额,我们就可以保持服务在一周内响应请求的能力:

基于服务请求计数和传输的字节数来限制服务请求的能力为实施策略提供了更大的灵活性。传输大量数据但依赖较少服务请求的服务可以按字节限制数据传输。例如,一项数据密集型服务将返回大量数据以响应每个服务请求。该服务每天可能只接收数百次请求,但每次请求都可能导致传输数兆字节的数据。假设我们要将传输的数据量限制为每小时 6GB。对于此类服务,我们可以设置速率限制策略以允许每分钟一个请求,然后使用每小时 100Mb 的传输配额策略来扩充该策略。

概括

当您使用 apiman 配置限制策略时,请务必记住,您设置的限制不仅可以作为服务请求的硬限制,还可以用于限制服务请求。这种限制使您可以在策略中指定的一段时间内灵活地控制传入服务请求的级别,而不会阻止所有传入服务请求。 apiman 为您提供的配置限制策略的灵活性通过支持您创建限制策略组合而得到进一步增强。这些组合策略协同工作,为您提供对传入服务请求的粗粒度和细粒度控制。

作者致谢

作者一如既往地感谢 Eric Wittmann 和 apiman 团队对本文撰写的审阅意见和建议!