【问题标题】:microservice architecture - global data sharing微服务架构——全球数据共享
【发布时间】:2019-05-10 16:02:50
【问题描述】:

我有一个关于微服务架构的有趣问题。 情况是我有多项服务需要一个关于许可的中心信息。在我们的架构中,所有微服务都自己管理权限,但我们系统中的用户可以拥有多个允许他管理的公司。系统中几乎每条路由都需要请求中的 company_id。 理论上,用户 X 可以从某个公司删除用户 Y,如果用户 Y 现在试图对这家公司采取任何行动,他应该不再被允许。 但是任何服务都必须知道用户不再被允许访问。 为了在所有服务之间共享这些数据,有 3 种可能的方法:

1) 如果用户 X 将用户 Y 从公司中删除,该服务将在 Q 中放置一条消息,并且工作人员会通知所有其他服务有关此更改的信息。 2)我使用Zuul作为API网关理论上API网关可以检查请求中的每个请求(具有company_id),如果用户甚至被允许访问这家公司。但这意味着 API 网关本身必须进行数据库调用,这并不好,因为网关应该是一个网关,而不是其他任何东西。 3) 我可以使用在每个微服务上复制的全局数据存储,为此我可以使用 etcd。每个微服务都可以检查用户 Y 是否被允许访问公司。

在所有情况下重要的是,如果用户 Y 被允许访问公司,微服务本身仍然必须检查用户 Y 是否被允许对该公司执行特定操作。所以这个用户到公司的匹配只是为了确保用户完全可以访问公司。

我对这些方法中的任何一种都不太满意,因为将消息放入队列 (1) 意味着必须将更改通知每个服务。使用 Zuul 验证(2)也不是很实用,因为它应该只是一个网关。

【问题讨论】:

    标签: database architecture microservices


    【解决方案1】:

    在我看来,没有全局数据这样的东西。所有数据都本地化到一个给定的服务,它是它的所有者,其他人可以拨打电话获取这些数据。在其他微服务中复制这些数据可能会导致状态不一致。

    对于这个非常用例,您为什么不尝试授权路线。当 userY 登录您的系统时,您授权他访问某些公司。一个或多个。此信息可以在令牌中传递,每个关心公司 id 的服务都可以获取并处理它,由于令牌的生存时间有限,一旦 userX 从公司中删除 UserY,后续令牌将没有 company_id 和将被忽略。

    您的逻辑在 Auth 服务中,而其他人只是在标头中查找此信息。如果您不喜欢身份验证服务的想法,您可以添加一项服务,将公司标头添加到所有传入请求中一次。 (这与 API 网关不同,因为 api 网关有其他职责)。

    您的数据不会被不同的服务复制,有一个地方可以管理有关公司标题的所有信息

    【讨论】:

    • 感谢您的意见,我同意。我认为将此信息存储在令牌中有点冒险,因为用户 Y 可以删除用户 X,但用户 X 仍然拥有旧令牌(其中包含已删除的公司)。如果我理解您的想法,即拥有一项将公司添加到标头的服务,而不是请求从 LB 到 Zuul 再到 Header Service,则标头服务会进行 db 调用,然后最终会转到目标服务。对吗?
    • 是的,但它可能是也可能不是数据库调用,这取决于标头服务如何使用它。它可以是数据库或缓存。 wrt 令牌,是的,userY 将使用所述公司 ID 行事,但仅限于有限的时间。 AT 是短暂的,如果这对您有帮助,那么您可以考虑。
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2019-06-11
    • 2016-05-22
    • 1970-01-01
    • 2016-05-29
    • 2019-08-19
    • 2020-01-26
    • 2021-11-26
    相关资源
    最近更新 更多