在您引用的SO问题中,各种人都声明服务可以访问其他服务数据,因此Order服务可以具有GetAllWithCustomer功能,该功能将返回所有订单以及该订单的客户详细信息。
此外,我的这个问题可能会有所帮助:
https://softwareengineering.stackexchange.com/questions/115958/is-it-bad-practice-for-services-to-share-a-database-in-soa
在这种情况下,“服务”的定义原则之一是它绝对拥有它负责的区域中的数据,以及对该数据的操作。
通过复制或任何其他机制复制数据会使该责任失去作用。您也可以复制业务规则,或者您最终会遇到需要更新其他服务以更改内部规则的情况。
使用单一数据服务只是“不做SOA”;如果你有一个管理所有数据的地方,你没有独立的服务,你只有一个服务。
相反,我建议使用第三种方法:使用组合将数据放在一起,完全避免数据库级JOIN操作。
不考虑需要在数据库中将这两个值连接在一起,而是考虑如何在边缘将它们组合在一起:
当您为客户呈现HTML页面时,您可以从多个服务提供HTML并以可视方式将它们组合在一起:客户详细信息来自客户服务,订单详细信息来自订单服务。
同样,发票电子邮件:可视化地组合从多个服务提供的数据,而无需数据库内连接。
这有两个好处:一,您不需要加入数据库,甚至需要将数据存储在同一类型的数据库中。现在,每个服务都可以使用最适合其需求的数据存储。
二,您可以更轻松地更改应用程序的外部。如果您有小巧的可组合部件,您可以轻松添加以新方式重新排列部件。
指导原则是可以缓存不可变数据 这意味着来自客户实体的简单不可变数据可以存在于订单服务中,并且无需在每次需要信息时都转到客户服务。将所有内容分解为隔离的服务,然后始终进行这些远程过程调用忽略了 分布式计算的谬误 。 如果您有广泛的报告需求,则需要创建其他服务。我称之为聚合报告服务,它再次获取用于报告目的的只读数据。你可以看到一篇文章 我为InfoQ写过这篇文章 几年前