【发布时间】:2020-09-12 12:56:33
【问题描述】:
我研究微服务架构已经有一段时间了。但我有几个问题。
如果你需要举个例子,他们是 订单服务 客户服务 产品-服务
假设上面有 3 个微服务。他们正在使用关系数据库。
我在订单服务中列出订单。但我也必须在这里提取客户信息。
如果这是一个单声道结构,我可以用 join 来处理它。但是我如何在微服务架构中做到这一点。
注意:我没有做任何项目。我的目标只是了解微服务架构。
【问题讨论】:
我研究微服务架构已经有一段时间了。但我有几个问题。
如果你需要举个例子,他们是 订单服务 客户服务 产品-服务
假设上面有 3 个微服务。他们正在使用关系数据库。
我在订单服务中列出订单。但我也必须在这里提取客户信息。
如果这是一个单声道结构,我可以用 join 来处理它。但是我如何在微服务架构中做到这一点。
注意:我没有做任何项目。我的目标只是了解微服务架构。
【问题讨论】:
选项:
限制 orderservice 和 customerservice 之间的依赖关系:通常订单是一个自包含对象,其中包含所有客户数据(从订购时开始)。
如果仍需要订单,则应保存客户的 ID,然后任何想要访问最近客户数据的 UI 或逻辑都需要使用客户服务的“公共 api”。 “公共 api”通常可以是任何东西——它甚至可以是定义的共享存储(如数据库)。然而,大多数团队决定不允许直接访问技术存储以避免紧密耦合。这就是为什么大多数时候服务使用 Rest(或 GRPC)来处理同步用例或使用某种形式的消息传递来进行异步交互
但是 - 决定为什么要拆分它 - 您是否期望开发人员基础不断增长且复杂性更高?如果不是为您的情况构建一个整体可能会更便宜..
【讨论】:
但是我如何在微服务架构中做到这一点。
只需调用另一个微服务并询问所需的附加信息即可。
如您所见,通常微服务不共享数据库。
如果你有这样的课程Order
class Order
{
OrderId;
ItemName;
UserName;
}
还有一个像这样返回订单GetOrder(id)的方法
GetOrder(orderId)
{
item = ItemMicroserice.GetItem();
user = UserMicroservice.GetUser();
result = new Order()
{
OrderId = orderId,
ItemName = item.Name,
UserName = user.Name
}
return result;
}
您可以注意到有两个对其他微服务的调用将返回数据以构造Order 对象。
认为您可以看到它在性能方面可能略微不是最佳的。因此,有时微服务确实存储重复信息以便能够更快地构造对象(消除对其他微服务的调用)。例如,如果Users 微服务更新数据,它会向Orders 微服务发送一个事件,以便它可以更新来自其他微服务的缓存数据。
【讨论】: