如何在 Spring 数据 REST / Spring 基于 HATEOAS 的(微)服务之间建立关系?

How to establish relationships between Spring Data REST / Spring HATEOAS based (micro) services?

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

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

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

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

每个服务都有第二个 table,其中 OneToMany 是服务中的主要实体。 table 将具有以下字段:

ID, entityID, rel, relatedID

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

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

基本步骤如下:

  1. 该服务需要发现其他服务的资源。
  2. 该服务随后会在必要时向其呈现的资源添加 link。

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

执行步骤如下:

资源发现

在我的示例中,消费服务(即客户服务)使用 Spring HATEOAS' Traverson API 遍历一组 link 关系,直到找到一个link 名为 by-location。这是在 StoreIntegration. So all the client service needs to know is the root URI (taken from the environment in my case) and a set of link relations. It periodically checks the link 中使用 HEAD-请求完成的。

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

要了解更复杂的方法,请查看 Netflix' Eureka library which is basically a service registry. Also, you might wanna checkout the Spring Cloud integration 我们为此提供的方法。

使用 links

增加资源

Spring HATEOAS 提供 ResourceProcessor API Spring Data REST 利用。它允许您操作要渲染的 Resource 实例,例如添加 links 到它。可以找到客户服务的实现 here

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

除此之外

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

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

希望让它足够抽象,以便从本质上模仿多对多设置。