在使用基于Spring数据Rest或HATEOAS的基于超媒体的微服务时,试图找出如何处理关系的模式。
如果您有服务A(讲师)和服务B(课程),每一个存在作为一个独立的应用程序。
在这两个服务之间建立关系的首选方法是什么。以不需要外接服务In的列的方式。每个服务都有可能有许多其他服务需要在同一个庄园中进行通信。
可能的解决方案(不确定正确的路径)
每个服务都有一个带有OneToMany的第二个表,其中包含服务中的主实体。该表将包含以下字段:
ID,entityID,rel,relatedID
然后,在相反的服务中,使用设置查询联接表以找到匹配的记录。
我想要实现的主要目标是,任何服务都可以与任意数量的其他服务建立关系,而不必了解其他服务。
发布于 2015-01-07 08:55:50
基本步骤如下:
我在this repository中有一个关于这些步骤的非常基本的例子。该示例包含两个服务:一个为商店提供地理空间搜索的服务。第二个服务是一些基本的客户管理,如果目前可用的话,可以选择与商店服务集成。
以下是这些步骤的实现方式:
资源发现
在我的示例中,消费服务(即客户服务)使用Spring的Traverson API遍历一组链接关系,直到找到一个名为by-location的链接。这是在StoreIntegration中完成的。因此,客户端服务需要知道的只有根URI (在我的例子中是从环境中获取的)和一组链接关系。它使用periodically checks the link HEAD-request来证明其存在。
当然,这可以以一种更复杂的方式完成:将基本URI硬连接到客户端服务可能被认为是次优的,但是如果您无论如何都在使用DNS (这样您就可以在URI硬编码后交换实际的主机)。尽管如此,它仍然是一种很好的实用方法,如果它改变URI,仍然会重新发现其他服务,而不需要额外的库。
对于更复杂的方法,请看一下Netflix' Eureka library,它基本上是一个服务注册中心。另外,您可能需要查看我们拥有的Spring Cloud integration。
用链接增加资源
Spring提供了Spring利用的ResourceProcessor API。它允许您操作即将呈现的Resource实例,例如向其添加链接。客户服务的实现可以找到here。
它基本上采用上述步骤中刚刚发现的链接,并使用众所周知的参数对其进行扩展,从而允许客户端只需遵循链接就可以触发存储地理搜索。
除此之外
您可以在Spring Cloud的示例项目中找到这个示例的一个更复杂的变体。它采用了相同的示例,但切换到Spring组件,如Eureka集成、收集度量、添加UI等。
发布于 2015-01-07 18:12:09
在我的例子中,我只能从服务本身派生相关的项目。我的目标是将相关项抽象为任意数量的服务可以与服务相关,只需要查找ID或链接。其中一个想法是命名为与服务实体ID的联接相关的@ElementCollection。然后在@Embedded中有一个relLink字段和一个relatedID字段。然后在存储库中执行一个findby来查找relLink和relatedID。
希望保持它的抽象程度,从本质上模仿许多设置。
https://stackoverflow.com/questions/27790905
复制相似问题