我是微服务架构的新手, 例如,我们在隔离机器和两个sql数据库中有两个独立的服务 Location.Service有一个如下所示的数据库
Locations:
[
{Id: key, Name: string}
]
Product.Service有一个类似下面的数据库
Products:
[
{Id: key, Name: string, LocationId: key}
]
这两个服务可以使用基于事件的消息协议(如AMQP)正常工作,一切听起来都很不错。 但我在UI中列出产品存在问题
ProductId(ok), ProductName(ok), ProductLocationId(ok), ProductLocationName(???)
我怎么能有一个解决方案来列出产品的位置名称? 在简单的整体应用程序中,我们可以轻松地在这些表之间进行连接,但问题会在多个数据库中引发? Solution1:查询应该嵌套for locationName,例如在ORM工具中
var products = productService.select(p => new ProductDto{
ProductId= p.Id,
ProductName= p.Name,
LocationId= p.LocationId,
LocationName= locationService.getNameById(p.LocationId)
}).ToList();
可能这种方式不合理
解决方案2:像这样更改ProductService的数据库设计
Products
[
{Id: key, Name: string, LocationId: key, LocationName: string}
]
通过这种方式,如果使用locationService的位置名称已更改,我应该更新所有产品的位置名称(使用事件消息)
所以,我认为这种方式应该会引起项目结构的一些混乱
解决方案3:这两项服务应该在同一个服务中!
所以在敏捷项目中,我们无法估计未来,所以我们必须为一项服务提供所有服务,显然不推荐!
解决此问题的最佳方法是什么?
答案 0 :(得分:0)
假设您基于某些因素提出了产品和位置微服务。由于您需要在这两个数据集之间进行关联,因此必须在另一个负责此操作的微服务中完成。这项新服务将与这两项服务互动以完成工作
答案 1 :(得分:0)
每个微服务都应该有一个责任。这使他们 micro 。因此,Product MS
负责执行产品的业务规则,Location MS
负责执行有关位置的业务规则。
另一方面,您有第三个责任:以人类可读的方式列出所有/部分产品及其位置。为此,您需要另一个负有此责任的微服务。第三个微服务应该监听来自其他微服务的事件,并保持与其位置连接的最终一致的产品列表。
BTW:没有一个微服务应该知道/关心其他人有sql
或nosql
或内部使用的任何数据库,这是针对微服务架构的。