Spring boot 如何在Spring boot micro services中管理JPA实体?

Spring boot 如何在Spring boot micro services中管理JPA实体?,spring-boot,architecture,spring-data-jpa,microservices,Spring Boot,Architecture,Spring Data Jpa,Microservices,我有两个共享数据库的微型服务。比如用户管理服务和组织管理服务。这两个服务都有自己的实体 现在的问题是我必须管理组织和用户之间的一对多关系,我几乎没有疑问的解决方案 解决方案: 我可以在这两个服务中复制实体(但如果实体中有任何更改,如添加或删除属性,我必须在 所有服务) 我可以为实体创建一个共享jar(但如果实体发生变化,我必须重新启动这两个服务) 我可以启动纯SQLquery 任何其他的建议或帮助都可以挽救我的一天 请给我一个更好的解决方案 您似乎试图遵循(好的)建议,即微服务应该维护自己的数据

我有两个共享数据库的微型服务。比如用户管理服务和组织管理服务。这两个服务都有自己的实体

现在的问题是我必须管理组织和用户之间的一对多关系,我几乎没有疑问的解决方案

解决方案:

  • 我可以在这两个服务中复制实体(但如果实体中有任何更改,如添加或删除属性,我必须在 所有服务)

  • 我可以为实体创建一个共享jar(但如果实体发生变化,我必须重新启动这两个服务)

  • 我可以启动纯
    SQL
    query

  • 任何其他的建议或帮助都可以挽救我的一天


    请给我一个更好的解决方案

    您似乎试图遵循(好的)建议,即微服务应该维护自己的数据,并尽可能独立于其他服务。以此为前提,领域驱动设计提供了有用的建议

    您的微服务分别管理一个(或一组)聚合。聚合是指

    • 始终保持一致(除了在对聚合根的方法调用中)
    • 从持久性存储中以原子方式存储和加载
    每个聚合只有一个聚合根。它的组件只能通过聚合根的方法访问。这允许聚合根确保一致性

    聚合的组合只是最终一致的,也就是说,它们在给定的时间点可能不一致,但最终会变得一致。这使得聚合保持简单,因为它们不需要担心其他聚合的状态。为了允许聚合仅通过id相互引用

    下面是你如何将其应用于你的情况

    如果你为你的微服务设计
    Person
    实体,你可能会发现它们没有相同的属性。例如,用户管理服务可能需要
    人员的哈希密码。组织管理服务可能有其他属性,甚至可能除了id之外没有其他属性

    因此,您应该为这些设置单独的类。现在有不同的方法来结合这两个集合,这取决于它们的设计方式。让我们从最简单的开始:

    如果
    人员
    完全由一个服务所有,则其他所有内容都只需要id。在web应用程序中,您可以(也可能应该)只包含一个指向人员资源的链接,并加载要使用
    人员
    所属服务显示的任何详细信息。您也可以在后端执行此操作,但这是另一天的决定

    如果两个服务都有共同的属性(例如,您可能希望在组织管理服务中包括基本信息,如
    名称
    ),这样即使在其他服务不可用时,您也可以显示人类可读的内容。 在这种情况下,您可以使用事件通知服务需要应用于其实体版本的更改

    请注意,您希望将任何事件处理与其他服务分离,以便

    a) 事件基础结构中的问题不会导致服务尝试发布事件时出现问题

    b) 当事件基础结构在一段时间内不可用时,您有一个同步信息的过程


    需要维护的一个重要属性是,每个属性仅由一个服务更改。如果您不坚持认为,如果属性的值出现偏差,那么很难找出哪个是正确的变量。

    我添加了[architecture]标记,因为这似乎就是您的问题所在。如果是关于问题的更技术方面,那么问题可能需要更新。