我仍然试图理解微服务架构。
分离不同应用程序(包括数据库)的想法让我感到兴奋。但是,如果有两个微服务,我仍然感到困惑,例如产品和用户。产品和用户分别在其数据库中拥有表产品和用户。根据微服务的最佳实践,我们只能从服务中访问数据库。
问题是,我们假设我们的产品表有user_id列。我们想做搜索产品,它也返回创建产品的用户的名字。这需要在产品微服务中的产品表和用户微服务中的用户表之间进行连接。你怎么处理这个?
答案 0 :(得分:8)
虽然我认为按照Jan建议的方式做到这一点并没有什么不妥,我想补充说,差异微服务应该添加到你的系统是不同的性质。
上述服务隔离是我们在SOA世界中经常看到的,并且在没有提供太多价值的情况下,它变得太复杂了。
如果你,我理解它只是一个例子,需要查询连接到产品的用户 - 为什么要拆分服务?你最终为每个db-entity设计一个服务,而不是查看给定的需求,在我看来有限的上下文。
-Lars
答案 1 :(得分:6)
您必须打电话给每个微服务并手动进行加入或将相关的用户ID传递给每个服务。
UserMicroservice:
SELECT * FROM Users WHERE some condition is true
获取用户列表,包括他们的id
。
ProductMicroserivce:
SELECT * FROM Products WHERE some condition is true AND userId IN (.........)
因此用户和产品仍然可以在两个不同的数据库中,产品只需要具有userId的概念。
反过来也可以,ProductMicroserivce:
SELECT * FROM Products WHERE some condition is true
提取所有UserIds,然后调用UserMicroservice:
SELECT * FROM Users WHERE some condition is true AND id IN (.........)
答案 2 :(得分:2)
此类方案的最佳答案是CQRS。保持用户和产品关系的物化视图。物化视图可以是任何在NoSql DB等读取时提供低延迟的视图。每当Command通过其微服务更新用户或产品时,应生成相应的事件并由管理此物化视图的其他服务捕获。此服务将用于获取您感兴趣的查询。 永远记住,微服务架构相信最终的一致性,这绝对不是一件坏事:)。希望这能回答你的问题。