microservices - 获取所有具有关系的资源时如何显示来自另一个微服务的关系
问题描述
我只想在我的电子商务项目中实现微服务。如果我有 2 个微服务,即产品微服务和事务微服务在单独的项目和数据库和服务器中。db设计是这样的:
products table:
id
name
code
price
...
transactions table:
id
product_id
qty
price
...
问题是:如何制作与产品相关的 Get All 交易 API?因为产品在另一个项目和数据库中?我应该获取所有交易,循环并调用获取产品详细信息,然后将产品密钥一一设置为产品对象吗?或者有什么最好的解决方法吗?谢谢。
我想返回这样的东西,因为我希望这个 API 返回产品关系以在交易列表前端显示产品。
{
"transactions": [
{
"id": 1,
"product": {
"id": 1,
"name": "Bottle",
"code": "B1",
"price": 50000
},
"qty": 1,
"price": 50000
}, {
"id": 2,
"product": {
"id": 2,
"name": "Cable",
"code": "C1",
"price": 20000
},
"qty": 1,
"price": 20000
}
]
}
解决方案
在进行面向服务时,最难理解的事情之一是隔离和自治的好处是有代价的。这个成本就是数据复制。在微服务架构中避免数据重复是极其困难的。
然而,数据重复并不总是坏事。事实上,您可以争辩说数据重复是一个重要的推动因素。将数据重复视为好而不是坏,这违背了常识和传统的软件培训,但是您需要适应这种心态才能在微服务上取得成功。
在上面的模型中,如果您想在旁边显示带有一些产品数据的交易,那么您需要将该产品数据存储在与交易相同的数据库中,即交易服务数据库。
回答不可避免的问题“产品数据如何到达那里?” - 有必要在之前的某个时间添加产品数据,最好是在首次创建产品时。
如果我想更新产品,我是否也应该在交易服务上进行更改?
是的,这是正确的,但前提是您关心更改(从交易的角度来看)。如果产品上的某些内容发生了您在交易中不关心的更改,请不要更新。
我们如何知道哪个部分需要有重复数据/没有?
这是基于您对查看交易的要求。关键是:一旦你复制了你的产品,它实际上是一个与产品服务中的实体不同的实体,尽管它会共享一个标识符。因此,您可以在交易服务中改进产品模型,而不必担心产品服务中的产品模型。
推荐阅读
- vue.js - 无法阻止 v-select 组件的更改值
- jakarta-ee - WildFly Jakarta EE 和遗留项目
- python - 在遍历 html 表时抓取和附加数据
- reactjs - 数据变化时如何渲染子功能组件?
- android - 我应该在重新启动之前更改应用程序 ID
- java - RandomStringUtils 是否创建确定性或可重现的序列?
- node.js - 无需模块导出即可访问的 JSON 文件
- cassandra-2.0 - 如何检查 Cassandra 表未访问多长时间
- ios - 如何从 SwiftUI 中的图形样式 DatePicker 中删除侧边距?
- r - 最后使用 plotly() 时隐藏 scale_color_manual() 中的特定图例