【问题标题】:Use DB Relationships in spring boot micro services在 Spring Boot 微服务中使用 DB 关系
【发布时间】:2019-02-05 21:11:30
【问题描述】:

我想在微服务架构中使用多对一和其他数据库关系。在单体架构中,我们可以轻松地创建实体关系,因为它们属于同一个项目,但在微服务架构中,我们如何实现相同的目标。

示例:

有一个 userDeutil 服务,另一个是 productDetail 服务。现在有第三个服务,称为 orderDetail,订单将具有与之关联的 userID 和 ProductID。那么我们如何管理“用户和订单”和“订单和产品”之间的关系。

我在网上搜索过,但没能得到公平的想法。另一个线程有相同的查询,但没有明确的答案。 Link

【问题讨论】:

  • 每个微服务都应该有自己的数据库模式,并且尽可能少地依赖其他服务。如果您考虑微服务的关系,那么您的限界上下文是错误的,或者微服务不是适合您要求的架构
  • @SimonMartinelli 这也是我在网上搜索后发现的。您能否建议我们如何实现问题中提出的问题陈述......或者我们无法通过微服务架构实现这一目标?
  • 你应该先阅读微服务,然后想想它是否能解决你的需求martinfowler.com/articles/microservices.html

标签: spring-boot foreign-keys microservices entity-relationship


【解决方案1】:

在我看来,您的案例是关于如何指定服务,尤其是如何定义每个服务的有界上下文!

根据上述情况,我看不出产品服务有什么理由应该知道有关订单的任何信息(即使它只是 order-id)和倒退。我在这种情况下看到的另一个问题:如果一项服务不可用,您的服务将无法工作(例如,当产品服务不在线时,您的订单服务将无法工作,因为他需要来自产品服务的产品详细信息...)。

我认为您应该重新考虑微服务的有界上下文。你应该记住:

  • 确保微服务的松散耦合
  • 即使其他微服务不可用,微服务也始终可以正常工作(弹性/可靠性)。

DDD(领域驱动设计)范式及其工具为您提供了极大的帮助,在您的服务定义过程中,您鼓励这些品质。

因此,以下只是一个想法(这不是建议,您应该查看它是否对您的业务案例重要):

  • “订单”流程似乎是您的核心业务领域。所以你必须专注于它。
  • 用户服务(我希望您在这里指的是客户,而不是身份验证/授权方面的用户)只负责管理客户,可能是他们的地址、银行会计等。它不应该知道关于您的订单或产品的任何信息。
  • 同样适用于产品服务。它只拥有有关产品的数据。它既与客户无关,也与订单服务无关。
  • 订单服务本身只处理订单,并且应该只拥有属于订单的数据(如发货地址和有关订购的产品项目的一些信息)。我认为客户 ID 在这里也很重要,以保持订单和客户之间的关系。通过这种方式,您可以获得例如由某个客户 ID 发出的所有订单....

【讨论】:

  • 我明白你的意思...但是我们将如何管理一个条件来检查给定的订单服务用户 ID 是否有效?与给定的productID是否有效??在这种情况下,我可以从各自的微服务中获取用户或产品的状态,但如果其中任何一个出现故障,我们将无法下订单??是正确的设计理念吗??
  • 在分布式系统中保持数据的一致性始终是一个挑战。同时,在微服务领域,有一些很好的模式可以帮助解决与数据管理/一致性相关的问题。描述模式的好网站是例如microservices.io/patterns/index.html)
  • 一些已知的模式是例如 SAGA 和 API-Composition。在您的情况下,最后一个可能就足够了:您应该有一个组件(API 网关)来封装和编排对您的微服务的所有调用。例如在下单过程中,它首先调用用户和产品服务来检查用户和产品是否有效。只有在这种情况下,它才会调用订单服务来下订单。这样可以确保数据(至少在订单创建期间)是一致的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 2018-04-06
  • 2021-12-30
相关资源
最近更新 更多