Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 微服务客户端循环依赖_Php_Node.js_Microservices - Fatal编程技术网

Php 微服务客户端循环依赖

Php 微服务客户端循环依赖,php,node.js,microservices,Php,Node.js,Microservices,在微服务体系结构中,使用客户机包在服务之间进行通信,我们遇到了一个问题,即两个客户机包相互依赖,从而创建了循环依赖关系 我们正在努力找出解决这一问题的最佳方案,我想知道是否有人能够帮助我们或为我们指明正确的方向 以下是场景: 两项服务,汽车和保险 两个客户包,CarClient和InsuranceClient 当任何服务需要与汽车服务进行通信时,都应该使用CarClient包进行通信。无论何时任何服务需要与保险服务通信,都应该使用InsuranceClient包 CarClient包有一个数

在微服务体系结构中,使用客户机包在服务之间进行通信,我们遇到了一个问题,即两个客户机包相互依赖,从而创建了循环依赖关系

我们正在努力找出解决这一问题的最佳方案,我想知道是否有人能够帮助我们或为我们指明正确的方向

以下是场景:

  • 两项服务,汽车和保险
  • 两个客户包,CarClient和InsuranceClient
当任何服务需要与汽车服务进行通信时,都应该使用CarClient包进行通信。无论何时任何服务需要与保险服务通信,都应该使用InsuranceClient包

CarClient包有一个数据传输对象(DTO)
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