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

cod*_*ode 7 hateoas spring-data-rest microservices spring-cloud

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

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

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

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

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

ID,entityID,rel,relatedID

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

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

Oli*_*ohm 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等.