Service Discovery 微服务是否打破了松散耦合的想法?
Does Service Discovery microservice break idea of loose coupling?
作为一种将微服务连接在一起并使它们工作的机制,通常建议使用 API 和服务发现。但它们通常作为自己的微服务工作,但这些微服务显然应该 "hard-coded" 进入其他微服务,因为每个微服务都应该向它们注册并查询其他微服务的位置。这是否打破了松散耦合的想法,因为发现服务的丢失意味着其他人无法通信?
几乎是的。如果一个微服务 "knows" 关于另一个微服务——这意味着它们是高度耦合的。关于其他服务的这些知识具体来自何处并不重要:硬编码、配置文件或某些服务发现,它仍然会导致高耦合。
需要了解的重要一点是,许多微服务布道者只是在鼓吹如何在 Web API 之上构建单体应用程序。他们中的一些人可能认为他们使用的流行语越多越好......不太清楚为什么会这样。通过使用流行语沙拉而不是真正构建容错和水平可扩展的应用程序,伪造一种语言并成为 "expert" 可能更容易。
但是还有另一种方式来看待服务发现:当它被 SPA 应用程序或 API Gateway 等服务客户端使用时,它可能非常有用。客户端和网关应该知道服务 APIs,否则,整个事情就没有意义了。但是他们可以使用注册表来增加 flexible/dynamic。
所以,总结一下:
- 如果服务正在使用发现来获取更多关于彼此的信息——这可能是一件坏事和设计缺陷(很确定在极端情况下这可能是一个有效的场景,请 post 发表评论如果你知道一些)
- 如果发现被应用程序的其他部分使用,如 SPA 或 API 网关,这可能有用,但不一定总是有用。
PS:为避免高耦合,请考虑阅读 series of articles by Jeppe Cramon,它很好地说明了问题和可能的解决方案。
在分布式系统中,总会有一些耦合,你要做的就是将各方面的耦合降到最低。
我认为这与您设计服务地点的方式无关紧要。如果您的代码知道其他服务,即 OrderService.Send(SubmitOrderMessage);
(其中 'OrderService' 是其他服务代理的实例)
与 transportAgent.Send(SubmitOrderMessage);
相反(其中 'transportAgent' 是传输代理的实例,即排队 service/agent 和队列的实际地址可以在您的配置中),这减少了耦合和您的业务逻辑代码(服务)并将路由委托给您的基础设施。
有意义吗?
每个微服务都应在功能上独立。为了与其他微服务交互,它应该只依赖于 rest api 调用。服务发现的作用是保持服务之间相当松散的耦合。同样由于服务 url 的动态特性,硬依赖性被删除。希望这有帮助
减少耦合或相当松散的耦合仍然有一个共同点;耦合。在我看来,任何程度的耦合总是会产生僵化的通信模式,随着平台成长为大型分布式平台,这些模式难以维护且难以排除故障。微服务背后的想法不是让消费者参与吗 "Permissionless innovation?" 我建议这只能通过分解为具有高内聚和低耦合的微服务然后让消费者决定如何路由、编排或聚合来实现.
作为一种将微服务连接在一起并使它们工作的机制,通常建议使用 API 和服务发现。但它们通常作为自己的微服务工作,但这些微服务显然应该 "hard-coded" 进入其他微服务,因为每个微服务都应该向它们注册并查询其他微服务的位置。这是否打破了松散耦合的想法,因为发现服务的丢失意味着其他人无法通信?
几乎是的。如果一个微服务 "knows" 关于另一个微服务——这意味着它们是高度耦合的。关于其他服务的这些知识具体来自何处并不重要:硬编码、配置文件或某些服务发现,它仍然会导致高耦合。
需要了解的重要一点是,许多微服务布道者只是在鼓吹如何在 Web API 之上构建单体应用程序。他们中的一些人可能认为他们使用的流行语越多越好......不太清楚为什么会这样。通过使用流行语沙拉而不是真正构建容错和水平可扩展的应用程序,伪造一种语言并成为 "expert" 可能更容易。
但是还有另一种方式来看待服务发现:当它被 SPA 应用程序或 API Gateway 等服务客户端使用时,它可能非常有用。客户端和网关应该知道服务 APIs,否则,整个事情就没有意义了。但是他们可以使用注册表来增加 flexible/dynamic。
所以,总结一下:
- 如果服务正在使用发现来获取更多关于彼此的信息——这可能是一件坏事和设计缺陷(很确定在极端情况下这可能是一个有效的场景,请 post 发表评论如果你知道一些)
- 如果发现被应用程序的其他部分使用,如 SPA 或 API 网关,这可能有用,但不一定总是有用。
PS:为避免高耦合,请考虑阅读 series of articles by Jeppe Cramon,它很好地说明了问题和可能的解决方案。
在分布式系统中,总会有一些耦合,你要做的就是将各方面的耦合降到最低。
我认为这与您设计服务地点的方式无关紧要。如果您的代码知道其他服务,即 OrderService.Send(SubmitOrderMessage);
(其中 'OrderService' 是其他服务代理的实例)
与 transportAgent.Send(SubmitOrderMessage);
相反(其中 'transportAgent' 是传输代理的实例,即排队 service/agent 和队列的实际地址可以在您的配置中),这减少了耦合和您的业务逻辑代码(服务)并将路由委托给您的基础设施。
有意义吗?
每个微服务都应在功能上独立。为了与其他微服务交互,它应该只依赖于 rest api 调用。服务发现的作用是保持服务之间相当松散的耦合。同样由于服务 url 的动态特性,硬依赖性被删除。希望这有帮助
减少耦合或相当松散的耦合仍然有一个共同点;耦合。在我看来,任何程度的耦合总是会产生僵化的通信模式,随着平台成长为大型分布式平台,这些模式难以维护且难以排除故障。微服务背后的想法不是让消费者参与吗 "Permissionless innovation?" 我建议这只能通过分解为具有高内聚和低耦合的微服务然后让消费者决定如何路由、编排或聚合来实现.