应用程序端加入ORM for Node?

时间:2017-02-16 18:11:38

标签: node.js amazon-web-services orm microservices loopback

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

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

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

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

从这篇文章:

  

实现连接现在位于多个数据库中的数据的查询   很有挑战性。有各种解决方案:

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

  •   
  • 命令查询责任分离(CQRS) - 维护一个或多个   包含来自多个服务的数据的物化视图。观点   由订阅每个服务的事件的服务保留   在更新数据时发布。例如,在线商店   可以实现查找特定区域中的客户的查询   和他们最近的订单,保持一个加入客户和   命令。该视图由订阅客户的服务更新   并订购活动。

  •   

实施例

我有2个数据微服务:

GET / pets - 返回类似

的对象
{
   "name":"ugly",
   "type":"dog",
   "owner":"chris"
}

和一个完全不同的微服务......

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

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

我有一个API级别的微服务,它将调用这两个数据服务。这是我将在此处应用的微服务。

我希望能够为宠物建立一个模型,这样当我查询宠物时,一旦GET /宠物成功回复,它就会加入"与所有者(发送所有回复的GET /所有者/ {OWNERS_NAME}),并向用户返回包含其所有者数据的宠物列表。

所以GET / pets(可能像Pets.find()之类的东西)会返回

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

1 个答案:

答案 0 :(得分:0)

在API网关上应用任何模型/域逻辑都是错误的决定,并被认为是不好的做法。 API网关应该只执行系统的CAS(依赖于保存逻辑的Auth服务),并将传入的外部请求转换为内部系统请求(不同的头/请求者有效负载数据),并将代理格式化的请求转发给任何其他工作的服务,接收它们,关注封装错误,并以适当的外部形式呈现每个响应。

另一点,如果应用程序核心流程(验证/范围等)所需的两个模型之间存在大量连接,那么您可能应该重新考虑您的模型/服务绑定到哪个Business Domain。如果它是相同的BD也许他们应该在一起。 Domain-Driven-Design的原则帮助我了解微服务之间真正的界限。

如果您使用环回(就像我们面对同样的问题而面临的问题 - 环回没有正确的连接实现),您可以拥有单独的报告/组合数据服务,它只能访问所有服务数据库和它仅用于READ目的 - 即查询。为它提供单独设置的对数据库的只读宽访问 - 而不是只设置一个数据源(单个数据库)它应该能够读取此查询 - 连接数据库用户范围内的所有数据库

这样的服务应该能够从配置json中生成与预期输出模式的正确连接 - 就像回送模型一样(这就是我在相同的情况下所做的)。一旦完成抽象,使用任何复杂的连接构建/添加任何equery都非常简单。它很干净,很容易推理。此外,它是DBA友好的。对我来说,这种方法迄今为止运作良好。