Microservices 服务发现微服务是否打破了松耦合的概念?

Microservices 服务发现微服务是否打破了松耦合的概念?,microservices,service-discovery,Microservices,Service Discovery,作为一种将微服务连接在一起并使其工作的机制,通常建议使用API和服务发现。但它们通常作为自己的微服务工作,但这些微服务显然应该“硬编码”到其他微服务中,因为每个微服务都应该向它们注册并查询其他微服务的位置。这是否打破了松耦合的概念,因为发现服务的丢失意味着其他人无法通信?几乎是这样。如果一个微服务“知道”另一个微服务,这意味着它们是高度耦合的。关于其他服务的知识具体来自何处并不重要:硬编码、配置文件或某些服务发现,它仍然会导致高度耦合 需要了解的是,许多微服务传道者只是在鼓吹如何在Web API

作为一种将微服务连接在一起并使其工作的机制,通常建议使用API和服务发现。但它们通常作为自己的微服务工作,但这些微服务显然应该“硬编码”到其他微服务中,因为每个微服务都应该向它们注册并查询其他微服务的位置。这是否打破了松耦合的概念,因为发现服务的丢失意味着其他人无法通信?

几乎是这样。如果一个微服务“知道”另一个微服务,这意味着它们是高度耦合的。关于其他服务的知识具体来自何处并不重要:硬编码、配置文件或某些服务发现,它仍然会导致高度耦合

需要了解的是,许多微服务传道者只是在鼓吹如何在Web API之上构建单一应用程序。他们中的一些人可能认为他们使用的流行语越多越好。。。不太清楚为什么会发生这种情况。通过使用流行语沙拉而不是真正构建容错和水平可伸缩的应用程序,伪造一种语言并成为“专家”可能更容易

但还有另一种方式来看待服务发现:当服务客户(如SPA应用程序或应用程序)使用服务发现时,它可能非常有用。客户端和网关应该了解服务API,否则,整个事情就没有意义了。但他们可以使用注册表使其更加灵活/动态

因此,总结一下:

  • 如果服务使用发现来获取更多关于彼此的信息,这可能是一件坏事,也是一个设计缺陷(非常确定在某些情况下,这可能是一个有效的方案,如果您知道一些,请发表评论)
  • 如果应用程序的其他部分(如SPA或API网关)使用discovery,这可能会有用,但不一定总是有用

PS:为了避免高耦合,请考虑很好地阅读问题和可能的解决方案。

在分布式系统中,总是会有一定数量的耦合,你要做的是将耦合的各个方面降到最小。

我认为这与你如何设计你的服务地点无关。如果您的代码知道其他服务,即
OrderService.Send(submiterMessage)(其中“OrderService”是其他服务代理的实例)
与
transportAgent.Send(submiterMessage)相反(其中“transportAgent”是传输代理的实例,即队列服务/代理,队列的实际地址可以在您的配置中),这将减少耦合和业务逻辑代码(服务),并将路由委托给您的基础结构


有意义吗?

每个微服务在功能上都是独立的。为了与其他微服务交互,它应该只依赖RESTAPI调用。服务发现的作用是使服务之间保持相当松散的耦合。此外,由于服务URL的动态特性,硬依赖项也被删除。希望这有助于减少耦合或相当松散的耦合仍然有一个共同点;耦合。在我看来,当一个平台发展成为一个大型的分布式平台时,任何程度的耦合都会产生难以维护和排除故障的僵化通信模式。微服务背后的想法不是让消费者参与“无许可创新”吗?我建议,这只有通过分解为具有高内聚性和低耦合性的微服务,然后让消费者决定如何路由、协调或聚合才能实现

你建议如何在没有任何紧密耦合的情况下工作?对不起,差点忘了最重要的事情。。。刚刚更新了我的答案,其中有一篇文章的链接可能会有所帮助。但是你仍然应该有消息队列,服务应该知道,这有点违背了这个想法。我认为没有,因为松耦合假设仍然存在某种程度的耦合。通过消息队列和异步通信,您的服务将暂时解耦,这意味着一个服务的故障不会导致其他服务的级联故障。