繁体   English   中英

Spring Boot - Zuul - 微服务 - 优化对网关的 API 调用以获取用户详细信息

[英]Spring Boot - Zuul - Microservice - optimise API calls made to gateway to fetch user details

我正在以 Zuul 作为网关在 Spring-Boot 中实现微服务架构。 我有一个具有身份验证和授权逻辑的 zuul 网关服务。 此外,它还公开了 API,可响应用户详细信息,如用户 ID 用户名映射、当前登录用户等。因此,我的其他服务通过 API 调用网关获取任何用户信息。 我已标记 zuul.sensitiveHeaders=Cookie,Set-Cookie 以允许将承载令牌传递给非网关微服务。

问题陈述 - 在我的其他服务中,我只是在需要的地方存储用户 ID。 然后,在向前端返回数据时,我对网关服务进行 API 调用以获取用户 ID 的用户名。 当我修改单个数据时,这很好用。

但是,当我必须返回批量数据(比如 1000 条记录)时,我将进行 1000 次 API 调用以根据每条记录的用户 ID 获取用户名。 这会影响速度。

例子 - 在此处输入图片说明

为了在 UI 上显示以上数据,我对网关进行了 8 次 API 调用,以获取每个用户 ID(created_by)的用户名。

有人可以帮我解决在这种情况下应该使用的架构吗? 我想到的一些解决方案如下。 但是我不太确定这些是否是最好的

  1. 登录后获取 userid-username 映射的 hashmap 并存储在会话缓存中。 但这会减慢登录调用
  2. 添加OncePerPrequestFilter 以便在每次API 调用时,将获取userid-username 映射的hashmap 并将其传递给控制器​​。 这是可行的,但在不需要此映射的 API 中,仍然会进行 API 调用,这将导致过载。

欢迎任何其他建议。

不太清楚您要做什么 - 问题标题似乎与描述没有太大关系。 尽管如此,您似乎对这个问题有两个不同的方面:

  1. 在您的后端,您需要通过服务中使用的令牌(通过您的网关)传递用户信息。
  2. 在您的前端,您需要该信息的一些(最小?)子集用于显示目的(我说的是显示,但通常此信息将用于其他一些过程 - 例如“向该用户发送电子邮件”)。

此外,您提到:

但是,当我必须返回批量数据(比如 1000 条记录)时,我将进行 1000 次 API 调用以根据每条记录的用户 ID 获取用户名。 这会影响速度。

您希望如何处理这种情况取决于您想要做什么以及您希望如何表示您的请求和结果。

简而言之,您需要在此特定请求背后的实际用例以及系统中将发生的请求的性质背后向我们提供更多详细信息。 例如,您真的需要每个单独的用户吗? 您是否可能需要系统中所有活动/非活动/用户的列表? 在后一种情况下,查询读取优化模型就足够了,该模型在创建新用户时更新。 在这种情况下,响应不仅会很快,而且您可以轻松添加分页和排序等不错的功能,因为您可能已经为基于集合的响应提供了此类功能。

您的后端服务仍然可以仅根据令牌信息填充安全上下文:用户在系统中的角色是什么,提供的范围等。对于更改系统状态,您仍然(在过程中的某个时刻)检查当前系统状态,例如通过数据库调用。

如果您只需要显示当前登录用户的一小部分详细信息(很少更改),并且此数据不是高度机密的,您可以考虑将其添加为不记名令牌中的自定义Claim 例如,如果您使用 JWT 作为不记名令牌,则可以轻松解码令牌并读取信息。

所以,这取决于你到底想做什么。 您是否真的需要为 1 个字段同时查询 >1,000 个个人用户? 也许我误解了这个问题,但在我看来,您想要关于系统中大量实体(在这种情况下 - 用户)的非常具体的信息子集,以及读取优化模型(甚至是数据库)具有足够权限的用户直接查询的视图)将完成这项工作。

Zuul说一句,自Greenwich发布系列以来,Spring Cloud Zuul一直处于维护模式,截至 2019 年 1 月 22 日。您应该考虑升级到Spring Cloud Gateway ,它取代了它并提供(在许多其他改进中)一个非阻塞请求模型(与Zuul阻塞模型相反)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM