应用程序端连接ORM的节点?

开始:我试过Loopback。 回送很好,但不允许跨多个REST数据服务的关系,而是调用初始数据服务,并传递查询参数来请求它执行连接的查询。

在我重新发明轮子并在Loopback的loopback-rest-connector上编写大量的包装器之前,我需要找出是否有任何现有的库或框架已经解决了这个问题。 到目前为止,我的广泛的谷歌search没有出现。

在真正的微服务环境中,每个数据库都有一个服务。

http://microservices.io/patterns/data/database-per-service.html

从这篇文章:

实现连接现在在多个数据库中的数据的查询是具有挑战性的。 有各种解决scheme:

  • 应用程序端连接 – 应用程序执行连接而不是数据库。 例如,服务(或API网关)可以通过首先从客户服务中检索客户,然后查询订单服务以返回客户的最近订单来检索客户及其订单。

  • 命令查询责任分离(CQRS) – 维护一个或多个包含来自多个服务的数据的物化视图。 这些视图由订阅每个服务在更新其数据时发布的事件的服务保存。 例如,在线商店可以通过维护join客户和订单的视图来实现查询特定地区的客户及其近期订单的查询。 该视图由订阅客户和订单事件的服务更新。

例:

我有2个数据微服务:

GET / pets – 返回一个对象

{ "name":"ugly", "type":"dog", "owner":"chris" } 

和完全不同的微服务….

GET /所有者/ {OWNER_NAME} – 返回所有者信息

  { "owner":"chris", "address":"under a bridge", "phone":"123-456-7890" } 

我有一个API级别的微服务将要调用这两个数据服务。 这是我将应用于此的微服务。

我希望能够build立一个宠物模型,这样,当我查询宠物,GET /宠物的成功回应,它将与所有者“join”(发送GET /所有者/ {OWNERS_NAME}所有的回应)和用户,只需返回包含其所有者数据的宠物列表。

所以GET /宠物(也许像Pets.find())会返回

 { "name":"ugly", "type":"dog", "owner": "chris", "address": "under a bridge", "phone": "123-456-7890" } 

在您的API网关上应用任何模型/域的逻辑是不好的决定,并被认为是不好的做法。 API网关应该只做你的系统的CAS(依靠Auth服务来保存逻辑),并将input的外部请求转换成内部的系统请求(不同的头/请求者有效载荷数据)和代理格式化的请求到任何其他工作的服务,接收它们关心封装错误,并以适当的外部forms呈现每个响应。

还有一点,如果应用程序核心stream(validation/范围等)所需的两个模型之间有很多连接,那么也许您应该重新考虑您的模型/服务绑定到哪个Business Domain。 如果是同一个BD,也许他们应该在一起。 领域驱动devise的原理帮助我理解微服务之间的真正界限。

如果你使用loopback(像我们一样面对同样的问题,我们面临的问题 – 环回没有适当的联接实现),你可以有单独的报告/组合数据服务,只有一个人可以访问所有的服务数据库,为了读取目的 – 即查询。 为它提供单独设置的对数据库的只读访问 – 而不是只有一个数据源被设置(单个数据库),它应该能够从该查询范围内的所有数据库中读取 – 连接数据库用户。

这样的服务应该能够从configuration类似json的loopback模型(这是我在相同情况下做的)产生预期的输出模式的正确连接。 一旦抽象完成,用任何复杂的连接构build/添加任何equery都是非常简单的。 它很干净,很容易推理。 另外,它是DBA友好的。 对我来说,这种方法到目前为止效果很好