spring-data-rest – 如何在Spring Data REST/Spring HATEOAS(微)服务之间建立关系?

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

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

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

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

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

ID,entityID,rel,relatedID

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

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

最佳答案
基本步骤如下:

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

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

以下是步骤的实现方式:

资源发现

在我的例子中,消费服务(即客户服务)使用Spring HATEOAS的Traverson API遍历一组链接关系,直到找到一个名为by-location的链接.这是在StoreIntegration完成的.因此,所有客户端服务需要知道的是根URI(取自我的环境)和一组链接关系.它使用HEAD请求存在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等.

转载注明原文:spring-data-rest – 如何在Spring Data REST/Spring HATEOAS(微)服务之间建立关系? - 代码日志