7

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

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

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

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

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

ID、entityID、rel、relatedID

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

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

4

2 回答 2

11

基本步骤如下:

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

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

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

资源发现

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

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

如需更复杂的方法,请查看Netflix 的 Eureka 库,它基本上是一个服务注册表。此外,您可能想查看我们为此提供的Spring Cloud 集成。

使用链接增加资源

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

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

除此之外

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

于 2015-01-07T08:55:50.627 回答
0

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

希望是保持它足够抽象以基本上模仿多对多设置。

于 2015-01-07T18:12:09.610 回答