[英]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)的用户名。
有人可以帮我解决在这种情况下应该使用的架构吗? 我想到的一些解决方案如下。 但是我不太确定这些是否是最好的
欢迎任何其他建议。
不太清楚您要做什么 - 问题标题似乎与描述没有太大关系。 尽管如此,您似乎对这个问题有两个不同的方面:
此外,您提到:
但是,当我必须返回批量数据(比如 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.