【发布时间】: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