Php 微服务客户端循环依赖
在微服务体系结构中,使用客户机包在服务之间进行通信,我们遇到了一个问题,即两个客户机包相互依赖,从而创建了循环依赖关系 我们正在努力找出解决这一问题的最佳方案,我想知道是否有人能够帮助我们或为我们指明正确的方向 以下是场景:Php 微服务客户端循环依赖,php,node.js,microservices,Php,Node.js,Microservices,在微服务体系结构中,使用客户机包在服务之间进行通信,我们遇到了一个问题,即两个客户机包相互依赖,从而创建了循环依赖关系 我们正在努力找出解决这一问题的最佳方案,我想知道是否有人能够帮助我们或为我们指明正确的方向 以下是场景: 两项服务,汽车和保险 两个客户包,CarClient和InsuranceClient 当任何服务需要与汽车服务进行通信时,都应该使用CarClient包进行通信。无论何时任何服务需要与保险服务通信,都应该使用InsuranceClient包 CarClient包有一个数
- 两项服务,汽车和保险
- 两个客户包,CarClient和InsuranceClient
Car
,其中一个属性是insurance
。此属性的类型是InsuranceClient包中可用的DTO,CarInsurance
问题是当CarInsurance
DTO需要访问CarClient包中可用的枚举时,CarTypeEnum
。现在我们有了两个相互依赖的包
我能想到的可能解决方案:
非常感谢您的帮助。您不应该在服务之间共享任何代码,因为这违背了它们100%独立的全部目的 在MS体系结构中,CarDTO仅具有与汽车相关的属性。如果您需要有关保险的信息,可以单独致电保险服务,以获得只有保险财产的保险
当您呼叫任一服务时,您将使用一些键将其连接在一起。也就是说,你会用从客户服务处获得的客户ID打电话给汽车服务部,你的CarDTO会有一个carId,然后,您可以通过customerId/carId致电保险服务,以获得保险。我阅读了前面答案中的评论中的长对话,我想补充一点,这有助于支持“在每次回购中复制它们”的想法 如果您基于DDD(域驱动设计)的思想设计服务,您可能会意识到相同的概念/实体在不同的域中可能意味着不同的东西
这意味着CarService中的“保险”可能具有与InsuranceService中不同的属性,具体取决于域/要求。这就是为什么CarService中的保险概念应该有自己的dto,它应该完全不受InsuranceService的保险定义的约束。您不能在保险服务中使用CarTypeEnum。只要用一个CarId。当您需要了解类型时,只需向汽车服务部门询问该信息。为什么汽车和保险是两个独立的客户/服务?你能把两者合并吗?我只是一个新手,我不知道你的应用程序的细节,但是如果这两个服务已经相互依赖,为什么不把所有的东西都放在一个屋檐下呢?保险服务做很多与汽车无关的任务,包括其他类型的保险(例如:家庭保险)。微服务的思想是将这些任务解耦到它们自己的repo(服务)中,以便我们能够更有效地编码和部署。然而,这是有代价的,因为它确实增加了一点复杂性?因为在这种情况下,为什么循环依赖是一个问题?您是否试图让您的服务过度工作?比如在一次电话中登记一辆汽车并为其添加保险计划?那么你可能想把这两个责任分开,一个是注册汽车,然后在其中添加保险计划,这只是一个例子,如果你能解释一下情况,我可能会给出更好的想法。我们正在获取保险服务以获得保险,但我们正在将该对象添加到汽车dto中的财产中。这就是为什么我们需要这种类型。但假设我们不这样做,我们如何处理枚举问题?保险服务需要知道它需要为哪种类型的汽车创建保险,因此,它将收到带有有效载荷的汽车类型id。这就是dto拥有该属性的原因。由于dto位于保险客户机中,因此该客户机依赖于汽车客户机来访问汽车类型枚举。如果我们不这样做,我们将需要在这些回购之间复制枚举。@crabbly,这正是您遇到问题的原因。您正试图将这两个服务紧密结合起来。DTO应完全分开。想象一下,如果您更改了一个共享类并引入了一个突破性的更改——现在您需要重建使用它的所有内容,并重新部署使用它的所有内容,您可能会错过一些东西。想象一下,如果你有1000项服务。对共享类的更改意味着重新部署所有内容。@Crably在MS中,您应该能够部署单个服务,而不破坏任何内容,或者必须重新部署该服务以外的任何内容。MS中的突破性更改是“不允许的”,您需要在设计服务时考虑“版本控制”。例如,我们在自己的网站上使用了内容类型协商,它工作得很好,但要想正确进行协商有点复杂。最终/cars/v1将拥有您当前的版本,/v2将拥有一个具有突破性更改的版本,并且服务可以根据需要迁移到v2。可以在MS中“复制并粘贴”DTO,毕竟这只是json。您可能无论如何都不想与客户机DTO共享服务器DTO,因为它们在现实世界中可能会有所不同(注释等)。当我们更改DTO时,我们正在更改Api契约,因此,无论发生什么情况,我们都应该期望事情会破裂。这就是我们进行版本控制的原因。T