首页 文章

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

提问于
浏览
0

我有一个关于微服务架构的令人兴奋的问题 . 案例是我有多个服务,需要一个关于许可的中央信息 . 在我们的架构中,所有微服务都自己管理权限,但我们系统中的用户可以拥有允许他管理的多个公司 . 系统中几乎每条路径都需要请求中的company_id . 理论上,用户X可以从某个公司中删除用户Y,如果用户Y现在尝试对该公司做出任何操作,则他不应再被允许 . 但是任何服务都必须知道不再允许用户访问 . 为了在所有服务之间共享这些数据,有三种可能的方法:

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

在所有情况下重要的是,如果允许用户Y访问公司,微服务本身仍然必须检查用户Y是否被允许对该公司做出某种行动 . 因此,该公司匹配的用户仅用于确保用户完全访问公司 .

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

1 回答

  • 1

    在我看来,没有全球数据这样的东西 . 所有数据都本地化为一个给定服务,该服务是它的所有者,而其他服务可以调用获取此数据 . 在其他微服务中复制此数据可能会导致状态不一致 .

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

    这里你的逻辑是在Auth服务中,而其他人只是在头文件中查找这些信息 . 如果您不喜欢auth服务的想法,您可以添加一个服务,将公司标头添加到所有传入请求一次 . (这与API网关不同,因为api网关还有其他职责) .

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

相关问题