微服务架构-全局数据共享

时间:2018-12-09 15:59:00

标签: database architecture microservices

我对微服务架构有一个有趣的问题。 情况是我有多项服务,需要一项有关许可的中央信息。在我们的体系结构中,所有微服务都自行管理权限,但是我们系统中的用户可以拥有允许其管理的多个公司。系统中几乎所有路由都需要在请求中添加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)也不是实际可行的,因为它应该只是网关。

1 个答案:

答案 0 :(得分:1)

我认为没有全局数据之类的东西。所有数据都被本地化到一个拥有它的所有者的给定服务,而其他人可以进行呼叫以获取该数据。在其他微服务中复制此数据可能会导致状态不一致。

在这种用例中,为什么不尝试授权路由。当userY登录您的系统时,您授权他有权访问某些公司。一个或多个。可以在令牌中传递此信息,并且每个关心公司ID的服务都可以使用它并对其进行操作。由于令牌的生存时间有限,因此,一旦userX从公司中删除UserY,后续的令牌就不会具有company_id和将被忽略。

您的逻辑在Auth服务中,其他用户则在标题中查找此信息。如果您不喜欢auth服务的想法,则可以添加一项将公司标头添加到所有传入请求一次的服务。 (这与API网关的做法不同,因为api网关还有其他职责)。

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