spring-boot - 如何在 Spring Boot 微服务中管理 JPA 实体?
问题描述
我有两个带有共享数据库的微服务。比如用户管理服务和组织管理服务。这两种服务都有自己的实体。
现在的问题是我必须管理组织和用户之间的一对多关系,我几乎没有怀疑的解决方案。
解决方案:
我可以在两个服务中复制实体(但如果实体有任何变化,如添加或删除属性,我必须注意所有服务)。
我可以为实体创建一个共享 jar(但如果实体发生变化,我必须重新启动这两个服务)
我可以触发纯
SQL
查询。
任何其他建议或帮助都会节省我的时间。
请给我一个更好的解决方案!!
解决方案
您似乎尝试遵循(好的)建议,即微服务应维护自己的数据并尽可能独立于其他服务。以此为前提,领域驱动设计提供了有用的建议。
您的微服务管理一个(或一组)聚合。聚合是一组实例,它们
- 始终保持一致(在对聚合根的方法调用中除外)
- 从持久性存储中以原子方式存储和加载。
每个聚合只有一个聚合根。它的组件只能通过聚合根的方法访问。这允许聚合根确保一致性。
聚合的组合只是最终一致的,即它们可能在给定的时间点不一致,但最终会变得一致。这允许保持聚合简单,因为它们不需要为其他聚合的状态而烦恼。为了允许聚合仅通过 id 相互引用。
因此,这就是您如何将其应用于您的情况。
如果您为微服务设计Person
实体,您可能会发现它们没有相同的属性。例如,用户管理服务可能需要Person
. 组织管理服务可能有其他属性,甚至可能根本没有,除了一个 id。
因此,您应该为这些设置单独的类。现在有不同的方法来组合这两个聚合,具体取决于它们的设计方式。让我们从最简单的开始:
如果Person
它完全由一项服务拥有,其他一切都只需要 id。在 Web 应用程序中,您可以(并且可能应该)只包含指向 person 资源的链接,并使用Person
. 您也可以在后端执行此操作,但这是另一天的决定。
如果两个服务都有共同的属性(例如,您可能希望name
在组织管理服务中包含基本信息,以便即使在其他服务不可用时也可以显示人类可读的内容。在这种情况下,您可以使用事件来通知服务他们需要应用到他们的实体版本的更改。
请注意,您希望将任何事件处理与其他服务分离,以便。
a) 事件基础结构中的问题不会导致尝试发布事件的服务出现问题。
b) 当事件基础设施在一段时间内不可用时,您有一个同步信息的流程。
要维护的一个重要属性是每个属性仅由一项服务更改。如果您不坚持这一点,那么如果属性的值不同,那么很难找出哪个是正确的变体。
推荐阅读
- macos - OSX 上的未签名框架
- amazon-web-services - 从服务器迁移到 aws teamcity。我使用服务器移动还是导入?
- tensorflow-probability - 如何制作自定义张量流概率层?
- javascript - JavaScript中requestAnimationFrame中的frame是什么意思?
- python - 您如何处理这个特定程序中的(意外缩进)语法?
- ios - Flutter build ios 错误:为设备构建时遇到错误
- datetime - 如何使用 Moment 显示自定义日期和时间
- perl - 在连接 (.) 或字符串中使用未初始化的值 $login_output
- git - 来自差异排序差异的异常合并冲突?
- python - ODBC 使用托管标识连接到 SQL Server