首页 > 解决方案 > 在微服务之间共享 DTO

问题描述

我们有大约 15 个微服务,它们相互通信并相互交换 DTO。在我们的项目中,一个 DTO 用于多个微服务是很常见的。所以我们问自己如何定义 DTO。第一种方法当然是在每个微服务中相互独立地定义 DTO。这种方法非常简单,但有几个缺点。每次我们想在一个服务中更改 DTO 时,我们也必须在另一个服务中更改它。

我们的第二种方法如下:我们创建了几个 Maven 项目。这个 maven 项目只包含 DTO,它们在服务之间共享。因此,假设我们有服务 1、2、3、4、5 和 DTO A、B 和 C。假设 DTO A 在服务 1 和 2 之间共享。DTO B 和 C 在服务 3、4 和 5 之间共享。在这种情况下,我们将创建两个 maven 依赖项,第一个具有 DTO A,将包含在服务 1 和 2 中。第二个依赖项将包含 DTO B 和 C,并将包含在服务 3、4、5 中。

这种方法减少了代码重复,因为如果我们更新一个 DTO,我们只需要更新相应的 maven 依赖项的版本号。另一方面,我们仍然需要接触每个服务来更新依赖关系。

另一个缺点可能如下。首先我们认为,服务 1 和服务 2 将只使用 DTO A。经过一段时间添加了新要求,现在 DTO A 应该依赖于 DTO B。所以让我们想象 DTO A 是具有字段(品牌、建筑年份)和 DTO 的车辆B 是带磁场的电机(功率)。因此,假设电机 DTO 在服务 2 和 3 之间交换。车辆 DTO 在服务 1 和 2 之间交换。一段时间后,我们收到一个要求,即车辆 DTO 应该获得一个新的现场电机。所以现在我们有两个选择:

选项 1:我们让车辆 DTO 依赖于电机 DTO。选项 2:我们创建另一个电机 DTO (Motor2),它包含在车辆 DTO 中,因此我们有两个电机 DTO,并且车辆不依赖于初始电机 DTO。

选项 1 的优点是,我们没有任何代码重复。缺点是,这两个 dto 都在单独的 maven 项目中,并且很难维护它们。因为如果我们更改一个 dto,我们必须更新依赖的版本。

选项 2 的优点是 dto 彼此独立。但是如果有变化,我们就得摸几个地方。当然,在两个服务中更改一个 DTO 很容易。但是,如果更改影响了少数 DTO,它们在四到五个服务之间进行交换,那可能会非常烦人。尤其是在项目开始时,需求变化非常快是很常见的。

那么您在微服务/系统之间交换 DTO 的经验是什么?您遵循哪种方法,您的方法有哪些优点或缺点?

标签: mavenmicroservicesdto

解决方案


推荐阅读