微服务客户端循环依赖
Microservice Clients Circular Dependency
在微服务架构中,使用客户端包在服务之间进行通信,我们 运行 遇到了一个问题,即两个客户端包相互依赖,造成循环依赖。
我们正在努力找出最佳解决方案,我想知道是否有人能够帮助我们或为我们指明正确的方向。
场景如下:
- 两项服务,Car 和 Insu运行ce
- 两个客户端包,CarClient 和 Insu运行ceClient。
每当任何服务需要与 Car 服务通信时,它都应该使用 CarClient 包来实现。每当任何服务需要与 Insu运行ce 服务通信时,它都应该使用 Insu运行ceClient 包。
CarClient 包有一个数据 t运行sfer 对象 (DTO) Car
,其中一个属性是 insurance
。 属性 的类型是 Insu运行ceClient 包中可用的 DTO,CarInsurance
。
问题是 CarInsurance
DTO 需要访问 CarClient 包 CarTypeEnum
中可用的枚举。现在我们有了两个相互依赖的包。
我能想到的可能的解决方案:
- 这是由于设计不当造成的。重新设计服务和包以防止这种循环依赖。
- 将枚举移动到单独的包中,因此,两个客户端都可以依赖这些包,但客户端不会相互依赖。
感谢任何帮助。
您不应该在服务之间共享任何代码,因为这违背了它们 100% 独立的全部目的。
在 MS 架构中,CarDTO 仅具有与汽车相关的属性。如果您需要有关保险的信息,可以单独调用保险服务来获取仅具有保险属性的 InsuranceDTO。
调用任一服务时,您将使用一些密钥将它们绑定在一起。 IE。您将使用从客户服务获得的 customerId 调用汽车服务,而您的 CarDTO 将具有 carId,然后您可以使用 customerId/carId 调用保险服务以获取 InsuranceDTO。
我阅读了之前回答的评论中的长篇对话,我想补充一点,以支持“在每个回购中复制它们”的想法。
如果您根据 DDD(域驱动设计)的思想设计服务,您可能会意识到相同的 concept/entity 在不同的域中可能意味着不同的东西。
这意味着 CarService 中的“保险”可能具有 - 取决于 domain/requirements - 与 InsuranceService 中的属性完全不同的属性。这就是为什么 CarService 中的保险概念应该有自己的 dto,它应该完全不受 InsuranceService 的保险定义的影响。
您可以不在保险服务中使用 CarTypeEnum。只需使用 CarId。当您需要知道类型时,只需向汽车服务询问该信息即可。
在微服务架构中,使用客户端包在服务之间进行通信,我们 运行 遇到了一个问题,即两个客户端包相互依赖,造成循环依赖。
我们正在努力找出最佳解决方案,我想知道是否有人能够帮助我们或为我们指明正确的方向。
场景如下:
- 两项服务,Car 和 Insu运行ce
- 两个客户端包,CarClient 和 Insu运行ceClient。
每当任何服务需要与 Car 服务通信时,它都应该使用 CarClient 包来实现。每当任何服务需要与 Insu运行ce 服务通信时,它都应该使用 Insu运行ceClient 包。
CarClient 包有一个数据 t运行sfer 对象 (DTO) Car
,其中一个属性是 insurance
。 属性 的类型是 Insu运行ceClient 包中可用的 DTO,CarInsurance
。
问题是 CarInsurance
DTO 需要访问 CarClient 包 CarTypeEnum
中可用的枚举。现在我们有了两个相互依赖的包。
我能想到的可能的解决方案:
- 这是由于设计不当造成的。重新设计服务和包以防止这种循环依赖。
- 将枚举移动到单独的包中,因此,两个客户端都可以依赖这些包,但客户端不会相互依赖。
感谢任何帮助。
您不应该在服务之间共享任何代码,因为这违背了它们 100% 独立的全部目的。
在 MS 架构中,CarDTO 仅具有与汽车相关的属性。如果您需要有关保险的信息,可以单独调用保险服务来获取仅具有保险属性的 InsuranceDTO。
调用任一服务时,您将使用一些密钥将它们绑定在一起。 IE。您将使用从客户服务获得的 customerId 调用汽车服务,而您的 CarDTO 将具有 carId,然后您可以使用 customerId/carId 调用保险服务以获取 InsuranceDTO。
我阅读了之前回答的评论中的长篇对话,我想补充一点,以支持“在每个回购中复制它们”的想法。
如果您根据 DDD(域驱动设计)的思想设计服务,您可能会意识到相同的 concept/entity 在不同的域中可能意味着不同的东西。
这意味着 CarService 中的“保险”可能具有 - 取决于 domain/requirements - 与 InsuranceService 中的属性完全不同的属性。这就是为什么 CarService 中的保险概念应该有自己的 dto,它应该完全不受 InsuranceService 的保险定义的影响。
您可以不在保险服务中使用 CarTypeEnum。只需使用 CarId。当您需要知道类型时,只需向汽车服务询问该信息即可。