【问题标题】:Shared entity/table design for microservices微服务的共享实体/表设计
【发布时间】:2017-06-15 23:18:50
【问题描述】:
我们正在将一个大型的单体电子商务应用程序分解为微服务。 (我们计划使用 Java、Spring、Hibernate)我们在我们的单体应用程序中有实现项和持久项的概念。我们的计划是将履行项目 CRUD 操作和持久项目 CRUD 操作分解为两个独立的 API。但是我们有一些共同的实体/表,这两个 API 最终都需要。处理这种情况的最佳方法是什么?
目前在表上打开的选项之一是让一个微服务拥有实体/表,并在其他微服务中拥有一个只读对象引用。这有什么缺点吗?
【问题讨论】:
标签:
java
spring
hibernate
microservices
【解决方案1】:
很大程度上取决于您的部署策略。如果您要将两个 API 捆绑/打包成一个,那么如果它们共享相同的实体就可以了(事实上您不应该复制实体)。我宁愿将所有实体和存储库/DAO 放入一个通用的包/包中,只是为了公开各种 API 用于 crud 操作(没有任何其他业务逻辑)。然后我的其他组件将使用这些 API 并具有业务逻辑。
【解决方案2】:
除了微服务无法在最终一致性下运行的情况外,确实没有太大的缺点。即使在这些情况下,您也可以随时为您的非通用微服务添加一个依赖项,以了解如何在必要时查询通用微服务以获取相关更新,尽管这不太理想。
不过,您可能不得不为您的用例引入某种形式的中介机制。像 JMS 代理这样的东西是一个理想的选择,它允许一个微服务通知其他感兴趣的微服务发生了什么事,以便他们每个人都能以自己的方式处理事件。
例如,CustomerMessage 可能包含客户的 id、姓名、地址,也许还有信用额度,一个微服务可能只关心 id 和名称,而另一个微服务可能也对地址感兴趣和信用额度。