我仍在努力理解微服务架构。
分离不同应用程序(包括数据库)的想法让我感到兴奋。但如果有两个微服务,例如产品和用户。它们都在各自的数据库中拥有产品和用户表。根据微服务的最佳实践,我们只能从服务访问数据库。
问题是,假设我们有一个产品表,其中包含user_id列。我们想要查找产品并返回创建该产品的用户的名称。这需要在产品微服务中的产品表和用户微服务中的用户表之间进行联接。你如何处理这个问题?
我仍在努力理解微服务架构。
分离不同应用程序(包括数据库)的想法让我感到兴奋。但如果有两个微服务,例如产品和用户。它们都在各自的数据库中拥有产品和用户表。根据微服务的最佳实践,我们只能从服务访问数据库。
问题是,假设我们有一个产品表,其中包含user_id列。我们想要查找产品并返回创建该产品的用户的名称。这需要在产品微服务中的产品表和用户微服务中的用户表之间进行联接。你如何处理这个问题?
你需要对每个微服务进行调用并手动执行连接操作,或将相关用户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
提取所有的用户ID,然后调用UserMicroservice:SELECT * FROM Users WHERE some condition is true AND id IN (.........)
虽然我认为采用Jan建议的方法没有问题,但我想补充一点,微服务应该给您的系统带来的差异是不同的。
上述服务的分离在SOA世界中很常见,但很快就变得过于复杂,而没有提供太多价值。
如果您(我理解这只是一个例子)需要查询与产品连接的用户-为什么要拆分服务?您最终会针对每个数据库实体设计一个服务,而不是查看给定的,对我来说似乎有界限的环境的要求是什么。
-Lars
在这种情况下,最好的解决方案是CQRS。维护用户和产品关系的物化视图。物化视图可以是提供低延迟读取的任何东西,如NoSql数据库。每当命令通过它们的微服务更新用户或产品时,相应的事件应该生成并被其他管理此物化视图的服务捕获。此服务将用于获取您感兴趣的查询。 请始终记住,微服务体系结构信奉“最终一致性”,这绝对不是坏事 :)。希望这个回答能够解答你的问题。