Architecture 微服务跨服务依赖

Architecture 微服务跨服务依赖,architecture,microservices,Architecture,Microservices,为了简化我的情况,我目前有3个微服务 认证 地点 存货 身份验证服务对用户进行身份验证并发回JWT访问令牌,我在其他服务中使用该令牌。它是无状态的,而且一切都很好 我在定位服务中设置了一些位置,这很好,正如预期的那样 但现在我在库存服务,我需要添加一些库存,但它链接到一个位置。我可以很容易地在API调用中传递locationId,但我无法授权当前用户向该位置添加内容,除非我随后调用位置服务来验证这一点 这会在彼此之间产生服务依赖性,这是我试图不惜一切代价避免的事情,否则您将失去微服务的大部分好处

为了简化我的情况,我目前有3个微服务

  • 认证
  • 地点
  • 存货
  • 身份验证服务对用户进行身份验证并发回JWT访问令牌,我在其他服务中使用该令牌。它是无状态的,而且一切都很好

    我在定位服务中设置了一些位置,这很好,正如预期的那样

    但现在我在库存服务,我需要添加一些库存,但它链接到一个位置。我可以很容易地在API调用中传递locationId,但我无法授权当前用户向该位置添加内容,除非我随后调用位置服务来验证这一点

    这会在彼此之间产生服务依赖性,这是我试图不惜一切代价避免的事情,否则您将失去微服务的大部分好处

    建议采用什么方法来验证当前用户是否具有该位置的权限?到目前为止,我唯一想到的是

  • 让location API发出另一个访问令牌,并声明他们可以访问哪些位置
  • 或者发出另一个完全独立的某种令牌,并通过报头将其传递给inventory micro服务,以执行类似于JWT身份验证的验证
  • 编辑

    正如下面提到的提供聚合根(或者我假设这意味着与API网关相同),它将在顶部提供另一个服务的第三个选项,以便与两者通信以提供信息


    然而,它让第三个服务依赖于另外两个服务,所以我只是增加了我的服务依赖性。

    你的微服务设计很差。您正在建模(
    位置
    项目
    )1 class=1微服务,这不是一个好主意

    您应该在
    DDD
    中对微服务进行建模,如
    聚合根
    ;即使有它自己的有限上下文。因此,在您的情况下,您应该使用
    位置
    项目
    用户
    聚合根
    进行建模,以允许在
    项目添加用户操作
    中检查域规则。这可能是,例如,在您的
    股票上下文中

    当然,这并不意味着你不应该有一个
    Wharehouse上下文
    ,在这个上下文中你可以添加、修改和/或删除
    位置
    ,如果不需要依赖于检查域规则,
    聚合根
    只是
    位置类
    。但这是另一个上下文中的另一个微服务


    这应该对你有帮助。它会给你带来一个大惊喜!当@jlvaquero提供了上述想法时,我只想列出我的实际解决方案以及原因

    然后归结到这个设置

    现在验证在网关级别完成。这里我唯一有一定程度不确定性的是,我现在正在对服务之外的实体进行验证,该实体将负责该领域


    库存服务只是接受允许用户附加到该位置。但是,考虑到位置和用户验证不在服务域内,因此它不应该关心该验证。

    网关应该只进行身份验证,而不进行授权。授权在服务内部处理,因为服务只维护可以访问它的用户。我会让Inventory服务获取用户有权访问的位置列表

    整个编排将在UI级别进行,这样库存服务就不会对位置服务产生硬依赖


    这是一种方法-不确定这是否适用于您。

    我还没有为1 class=1微服务建模。每个服务都处理自己的域,其中包含许多表,但其逻辑分组为处理特定函数。位置和库存有几个与之相关的模型。但这是一种依赖。位置服务还将为应用程序中与库存无关的其他部分处理基于位置的服务。仅添加一个示例就非常简单,因此我可以强调跨服务依赖的方面。当我看到一个跨服务依赖时,我想到的第一件事是,我应该将它组合在一起,但它不能在所有情况下都完成,因为那时我将把库存、位置和其他服务都组合到一个整体中,然后它就成了一个大型的整体API,所有的东西都组合在一起。“我将把库存、定位和其他服务结合在一起“我的观点不是组合服务,我的观点是从持久性中获得一个聚合根,只提供一个包含此聚合根的用户案例的微服务。当然,这会带来很多关于如何处理持久性的问题;所有微服务使用相同的持久性系统?拆分为读/写模式?每个服务都有独立的写模型,只有一个读模型?等等。当然,这取决于您的系统和需求。微服务的旅程很长,需要花费大量的时间和工作,直到一切都匹配。如果我可以问的话,我也从微服务模式开始。麻烦你给点建议好吗?我在这里发布了一个问题:在谷歌中查找
    aggregate
    aggregate root
    。它是一个事务性元素,非常适合微服务。