【问题标题】:How to establish relationships between Spring Data REST / Spring HATEOAS based (micro) services?如何在基于 Spring Data REST / Spring HATEOAS 的(微)服务之间建立关系?
【发布时间】:2015-03-03 15:53:43
【问题描述】:

在使用基于 Spring Data Rest 或 HATEOAS 的基于超媒体的微服务时,尝试找出如何处理关系的模式。

如果您有服务 A(讲师)和服务 B(课程),每个都作为独立的应用程序存在。

在两个服务之间建立关系的首选方法是什么。以一种不需要外部服务 ID 列的方式。每个服务可能有许多其他服务需要在同一个庄园中进行通信。

可能的解决方案(不确定路径是否正确)

每个服务都有一个带有 OneToMany 的第二个表,其中包含服务内的主要实体。该表将包含以下字段:

ID、entityID、rel、relatedID

然后在使用 Spring Data Rest 的相反服务中设置一个 find 查询连接表以查找匹配的记录。

我想要实现的主要目标是任何服务都可以与任何数量的其他服务建立关系,而无需了解其他服务。

【问题讨论】:

  • 我认为,一旦您拥有每个 API 的不同版本,就会对每个 API 产生一些依赖性。也就是说,通过保存 API 引用并使用 SDR 使用这些引用 ID 构造指向其他 API 的链接来连接 API 并不是一个坏主意。
  • @Stackee007 我可能想错了,我的意图并不是真正需要 API 的版本。由于它的核心是 HATEOAS,因此客户将通过任何更改了解它需要什么。当然在合理范围内。至于关于保存参考的评论。你觉得有第二个表来保存 rel 是可以的吗?

标签: spring-data-rest hateoas spring-cloud microservices


【解决方案1】:

就我而言,我只能从服务本身获取相关项目。我的目标是将相关项目抽象到任何数量的服务都可以与服务相关并且只需要查找 ID 或链接的程度。一种想法是与服务实体 ID 的连接相关的 @ElementCollection 命名。然后在@Embedded 中有一个relLink 字段和一个relatedID 字段。然后在存储库中做一个 findby 以找到 relLink 和 relatedID。

希望将其保持足够抽象,以基本上模仿多对多设置。

【讨论】:

    【解决方案2】:

    基本步骤如下:

    1. 该服务需要发现其他服务的资源。
    2. 然后,该服务会在必要时添加指向其呈现的资源的链接。

    我在this repository 中有一个关于这些步骤的非常基本的示例。该示例包含两个服务:一个为商店提供地理空间搜索的服务。第二项服务是一些基本的客户管理,如果当前可用的话,可以选择与商店服务集成。

    以下是这些步骤的实施方式:

    资源发现

    在我的示例中,消费服务(即客户服务)使用 Spring HATEOAS 的 Traverson API 遍历一组链接关系,直到找到名为 by-location 的链接。这是在StoreIntegration 中完成的。所以所有客户端服务需要知道的是根 URI(在我的例子中取自环境)和一组链接关系。它使用HEAD-request 来保证periodically checks the link 的存在。

    这当然可以以更复杂的方式完成:将基本 URI 硬连接到客户端服务可能被认为不是最理想的,但如果您仍然使用 DNS,它实际上工作得很好(这样您就可以交换实际的主机在硬编码的 URI 后面)。尽管如此,这是一种不错的实用方法,如果它更改 URI,仍然会重新发现其他服务,不需要额外的库。

    要了解更复杂的方法,请查看Netflix' Eureka library,它基本上是一个服务注册表。此外,您可能想查看我们为此提供的Spring Cloud integration

    通过链接增加资源

    Spring HATEOAS 提供了 Spring Data REST 利用的 ResourceProcessor API。它允许您操作即将呈现的 Resource 实例,例如添加链接。客户服务的实现可以在here找到。

    它基本上采用上述步骤中刚刚发现的链接,并使用众所周知的参数对其进行扩展,从而允许客户只需点击该链接即可触发商店地理搜索。

    除此之外

    您可以在 Spring Cloud 的示例项目中找到此示例的更复杂变体。它采用相同的示例,但切换到 Spring Cloud 组件,例如 Eureka 集成、收集指标、添加 UI 等。

    【讨论】:

    • P.S.最后的示例还用 Hystrix 断路器代替了定期链路检查。
    • 我基本上是在处理商店示例。问题出在客户/商店示例中。相关商店由 Google 通过 Google API 提供。
    • @Oliver 我同意(在某种程度上 - 即使在链接其他服务可能会关闭之后)发现其他服务。但是,如果我们需要链接到其他服务的特定资源,他需要存储参考 ID,然后像 CustomerResourceProcessor 一样使用 ResourceProcessor 建立到其他资源的链接。现在的问题是如果碰巧有多个版本的其他服务(例如商店)如何决定链接哪个版本?
    猜你喜欢
    • 2015-04-26
    • 2019-12-25
    • 2013-10-31
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2019-01-07
    • 2014-07-05
    • 2014-08-16
    相关资源
    最近更新 更多