我是微服务架构的新手,我有以下情况
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查看?考虑到我是新来的
答案 0 :(得分:0)
此类情况通常由位于UI问题和专用服务之间的组合服务处理。该组合服务将响应来自UI的查询,汇总来自各种服务的数据以构建完整的视图模型,然后将其发送回UI。
此服务可以采用多种形式,可以是客户端组合或服务器端组合。客户端组合的一个示例是SPA,其中组件将从多个API中提取,将数据投影到有用的东西中并进行渲染,而服务器端的示例可以是服务于视图的控制器。我在这里宽松地使用了“服务”一词,但是这个想法很笼统。
换一种方式来看,请删除所有托管API的概念,甚至删除数据库的知识。如果必须在代码中集成两个不同的库,那么合成函数将是什么样?它会调用一件事,做一些事情,调用第二件事,做更多事情,返回结果。
托管API等只会增加实现细节和复杂性,但是原理保持不变。
您对必须协调对不同服务的多次调用的性能影响提出了一些担忧,这当然是正确的。处理API调用而不是在数据库级别加入时,不仅性能而且瞬态错误处理和事务完整性都变得更加复杂。
一些要问自己的问题:
1.我的数据必须是最近的?您可以接受用户的缓存版本,并且要在应用程序中维护该缓存并使该缓存无效吗?
2.是否有经过API读取优化的版本已经为您完成了一些数据转换,并在它们的末端维护了积极的缓存?
3.是否正确绘制了组件周围的边界,还是应该以不同的方式合并或分割服务,以使彼此相关的数据生活得足够近,以至于延迟不会成为瓶颈?
4.是否可以将不同类型的数据存储策略应用于经常查询的那些组件,以便它们开始广播数据更改,然后使您能够构建自己的经过读取优化的数据存储(例如,事件源,发布订阅,那样的东西)
答案 1 :(得分:0)
您可以检查this article,其中提供了一些示例并进行了详细说明。
“这种根本的方法为我们带来了一个令人担忧的问题:
使用旧方法,简单的SQL连接将为我们带来 客户和交易信息。现在,我们需要依次调用两个SQL 得到相同的结果。新方法是否速度较慢,因为我们需要 进行两次SQL调用以收集相同的信息?答案是:
但是,将这些实体转变为服务的好处是:
- Deal表可以位于不同的数据库(或架构)中,而无需 扩展时影响单个数据库。
- 维护 只要每个表格都没有关系,每个服务都将轻松完成 还要别的吗。
- 您可以(如果在您的项目中可行)使用其他 持久性技术(例如NoSQL)。
松散地保持东西 夫妻和高凝聚力并不是那么简单,许多人争辩说。整体 的想法是在我们的问题域内设置边界并确保 相关行为在一个地方,并与其他地方交流 边界尽可能宽松。”