如何处理微服务中的表联接

时间:2018-07-04 10:25:54

标签: c# .net-core asp.net-core-webapi

我是微服务架构的新手,我有以下情况

Database1 - tbl_users (userid | user_name)

Users Api - returns all users in the table tbl_users

Database2 - tbl_orders (Orderid | order_name | user_id (FK))

Orders Api - returns all orders in the table tbl_orders

在整体方法中,我将加入订单api并显示已下订单的用户,但是在微服务方法中,当我必须在一个视图中显示用户和订单时,如何处理这种情况从订单api查看?考虑到我是新来的

2 个答案:

答案 0 :(得分:0)

此类情况通常由位于UI问题和专用服务之间的组合服务处理。该组合服务将响应来自UI的查询,汇总来自各种服务的数据以构建完整的视图模型,然后将其发送回UI。

此服务可以采用多种形式,可以是客户端组合或服务器端组合。客户端组合的一个示例是SPA,其中组件将从多个API中提取,将数据投影到有用的东西中并进行渲染,而服务器端的示例可以是服务于视图的控制器。我在这里宽松地使用了“服务”一词,但是这个想法很笼统。

换一种方式来看,请删除所有托管API的概念,甚至删除数据库的知识。如果必须在代码中集成两个不同的库,那么合成函数将是什么样?它会调用一件事,做一些事情,调用第二件事,做更多事情,返回结果。

托管API等只会增加实现细节和复杂性,但是原理保持不变。

您对必须协调对不同服务的多次调用的性能影响提出了一些担忧,这当然是正确的。处理API调用而不是在数据库级别加入时,不仅性能而且瞬态错误处理和事务完整性都变得更加复杂。

一些要问自己的问题:
1.我的数据必须是最近的?您可以接受用户的缓存版本,并且要在应用程序中维护该缓存并使该缓存无效吗?
2.是否有经过API读取优化的版本已经为您完成了一些数据转换,并在它们的末端维护了积极的缓存?
3.是否正确绘制了组件周围的边界,还是应该以不同的方式合并或分割服务,以使彼此相关的数据生活得足够近,以至于延迟不会成为瓶颈? 4.是否可以将不同类型的数据存储策略应用于经常查询的那些组件,以便它们开始广播数据更改,然后使您能够构建自己的经过读取优化的数据存储(例如,事件源,发布订阅,那样的东西)

答案 1 :(得分:0)

您可以检查this article,其中提供了一些示例并进行了详细说明。

enter image description here

  

“这种根本的方法为我们带来了一个令人担忧的问题:

     

使用旧方法,简单的SQL连接将为我们带来   客户和交易信息。现在,我们需要依次调用两个SQL   得到相同的结果。新方法是否速度较慢,因为我们需要   进行两次SQL调用以收集相同的信息?答案是:

     

但是,将这些实体转变为服务的好处是:

     
      
  • Deal表可以位于不同的数据库(或架构)中,而无需   扩展时影响单个数据库。
  •   
  • 维护   只要每个表格都没有关系,每个服务都将轻松完成   还要别的吗。
  •   
  • 您可以(如果在您的项目中可行)使用其他   持久性技术(例如NoSQL)。
  •   
     

松散地保持东西   夫妻和高凝聚力并不是那么简单,许多人争辩说。整体   的想法是在我们的问题域内设置边界并确保   相关行为在一个地方,并与其他地方交流   边界尽可能宽松。”