首页 > 解决方案 > 如何在 Spring Boot 微服务中管理 JPA 实体?

问题描述

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

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

解决方案:

  1. 我可以在两个服务中复制实体(但如果实体有任何变化,如添加或删除属性,我必须注意所有服务)。

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

  3. 我可以触发纯SQL查询。

任何其他建议或帮助都会节省我的时间。

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

标签: spring-bootarchitecturespring-data-jpamicroservices

解决方案


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

您的微服务管理一个(或一组)聚合。聚合是一组实例,它们

  • 始终保持一致(在对聚合根的方法调用中除外)
  • 从持久性存储中以原子方式存储和加载。

每个聚合只有一个聚合根。它的组件只能通过聚合根的方法访问。这允许聚合根确保一致性。

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

因此,这就是您如何将其应用于您的情况。

如果您为微服务设计Person实体,您可能会发现它们没有相同的属性。例如,用户管理服务可能需要Person. 组织管理服务可能有其他属性,甚至可能根本没有,除了一个 id。

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

如果Person它完全由一项服务拥有,其他一切都只需要 id。在 Web 应用程序中,您可以(并且可能应该)只包含指向 person 资源的链接,并使用Person. 您也可以在后端执行此操作,但这是另一天的决定。

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

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

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

b) 当事件基础设施在一段时间内不可用时,您有一个同步信息的流程。

要维护的一个重要属性是每个属性仅由一项服务更改。如果您不坚持这一点,那么如果属性的值不同,那么很难找出哪个是正确的变体。


推荐阅读