我有一个微服务架构,它与Spring Zuul Gateway类似于下面的映像。

我的身份验证服务返回由spring身份验证解析器生成的x-auth-token,而我的令牌存储库是redis。因此,用户应该使用此服务进行身份验证,然后使用其他服务。
我的所有其他服务都连接到同一个redis实例,所以当它们接收到x-auth-token时,它们可以获得用户会话的详细信息。我通常通过使用@PreAuthorize注释来进行授权,然后指定可以访问控制器或方法的角色。
到目前为止一切都很顺利。然后,我被要求在这个架构中添加速率限制功能。因此,例如,一个用户不应该能够对图书服务中的特定api提出超过一个POST请求。另外,如果有两个图书服务实例,那么当它限制利率时,我希望两者都被计算为单一服务。
我发现了大量的文档,这些文档把我推荐到了名为spring-cloud-zuul-ratelimit.的这项目看一下文档,我意识到它确实支持将redis作为存储(这对我很好,因为我已经有了redis ),它还支持每个用户的处理速率限制。
问题是我的zuul网关对用户一无所知!它无法进入红色存储器。如果我允许它访问redis,这个问题可能会解决,但另一个问题会出现:我需要授权用户两次,这需要更多的时间和更多的红宝石流量!一次在网关,一次在每个服务(检查角色和会话细节)。
我正在寻找最接近这一系列需求的解决方案:
发布于 2020-07-09 10:17:16
Zuul网关速率限制器插件主要根据特定密钥(可以是用户的IP、某些ID、请求路径或使用自定义密钥生成器的自定义组合)在时间间隔内跟踪用户请求的计数器。您可以将其添加到现有的zuul网关应用程序中。
假设清除率器-网关使用"[clientIP][userID][method][path]"作为存储在redis中的请求计数器密钥,例如"10.8.14.58:some@mail.com:POST:/books"。
以下是我能想到的一些选择:
author & books服务的传入请求,从令牌获取用户ID。然后使用SpringBoot过滤器将其作为另一个标头( ex:"x-app-user-id“)传递给上游服务。这样,上游服务就不会执行任何authn逻辑,它只是从头读取用户id。author和books服务之间的通信可能使用相同的标头。当然,这是假定上游服务器不会直接从外部网络访问。使用不同的redis实例作为棘轮键存储也可能是个好主意。
至于动态配置,根据它的文档,您可以通过属性来调整速率限制配置。我不知道它是否可以在运行时通过Spring或其他远程配置实现进行动态调整,而不需要重新启动网关应用程序。
https://stackoverflow.com/questions/60813216
复制相似问题