没有硬编码的微服务发现的最佳实践?
Best Practices for Microservices discovery without Hard Coding?
这个问题让我烦恼了一段时间,如何编写一系列 运行 在不同位置的不同机器上运行的微服务,而不需要对每个服务的单独位置进行硬编码?
比如我有服务 A,它对 json 消息进行某种形式的验证。方框 1、3、5 上的服务 A 运行 以及更多实例可以随着需求的增长而启动。
现在假设我有服务 B,它希望调用服务 A,我将如何与服务 A 所在的服务 B 通信?
我考虑过的可能解决方案:
使用服务 A 的 'master' 节点的位置对服务 B 进行硬编码,然后将任务委托给服务 A 的所有实例。
消息队列的利用? - 服务 B 写入一系列消息队列,服务 A 实例从设置的消息队列中读取并将结果发送回服务 B。
SSDP - 利用某种形式的简单服务发现协议来广播哪些服务正在运行设置网络上的哪个位置并跟踪这些服务。
我对这种架构风格很陌生,所以我希望我没有错过一些非常简单的东西?
一般来说,有两种实现服务发现的方法:
- 带反向代理/api-网关。这种方法提供了更快的更新传播。当您的服务部署/重新部署/取消部署时,所有更改都可以立即由反向代理处理,因此其配置始终反映您的微服务状态。然而,这对性能有影响——所有请求,包括内部请求都应该通过反向代理组件。有关此方法的更多详细信息 https://memz.co/api-gateway-microservices-docker-node-js/
- 使用 DNS。这种方法提供较慢的更新,因为每个组件(本质上,每个用于调用可发现组件的 http 客户端)都需要重新验证其 DNS 缓存,这可能需要一些时间(它可以配置相应 DNS 条目的 TTL)。此外,它假定每个 http 客户端实现都将遵守该 TTL 值。作为第一个近似值,我们可以假设 TTL 可以设置为低至 60 秒,因此,配置更改生效所需的时间不会超过 60 秒。有关此方法的更多详细信息 https://memz.co/service-discovery-microservices-skydns-docker/
使用 service registry 并在 运行 时间查找其他服务的位置。以下是用于此的一些典型技术(还有其他技术)。
服务注册表必须存在于已知位置。此位置在您的微服务中应始终是可配置的 属性。从不硬编码!为了提高灵活性,通常通过 DNS 访问注册表端点。因此,您的服务会寻找 https://registry-1
而不是特定的 IP 地址,后者可能会发生变化。
根据您希望在系统中使用的通信机制,消息队列将帮助您的服务进行通信,但对发现没有帮助。在这种方法中,您仍然会使用 DNS 和可配置属性来告知每个微服务消息队列的位置。然后,各个服务将向队列发布和订阅消息。微服务永远不会知道其他服务(没有发现),所有通信都将通过队列中的消息进行。
Sam Newman's book on microservices 更详细地介绍了这些方法并涵盖了您可能感兴趣的其他关注领域。
这个问题让我烦恼了一段时间,如何编写一系列 运行 在不同位置的不同机器上运行的微服务,而不需要对每个服务的单独位置进行硬编码?
比如我有服务 A,它对 json 消息进行某种形式的验证。方框 1、3、5 上的服务 A 运行 以及更多实例可以随着需求的增长而启动。
现在假设我有服务 B,它希望调用服务 A,我将如何与服务 A 所在的服务 B 通信?
我考虑过的可能解决方案:
使用服务 A 的 'master' 节点的位置对服务 B 进行硬编码,然后将任务委托给服务 A 的所有实例。
消息队列的利用? - 服务 B 写入一系列消息队列,服务 A 实例从设置的消息队列中读取并将结果发送回服务 B。
SSDP - 利用某种形式的简单服务发现协议来广播哪些服务正在运行设置网络上的哪个位置并跟踪这些服务。
我对这种架构风格很陌生,所以我希望我没有错过一些非常简单的东西?
一般来说,有两种实现服务发现的方法:
- 带反向代理/api-网关。这种方法提供了更快的更新传播。当您的服务部署/重新部署/取消部署时,所有更改都可以立即由反向代理处理,因此其配置始终反映您的微服务状态。然而,这对性能有影响——所有请求,包括内部请求都应该通过反向代理组件。有关此方法的更多详细信息 https://memz.co/api-gateway-microservices-docker-node-js/
- 使用 DNS。这种方法提供较慢的更新,因为每个组件(本质上,每个用于调用可发现组件的 http 客户端)都需要重新验证其 DNS 缓存,这可能需要一些时间(它可以配置相应 DNS 条目的 TTL)。此外,它假定每个 http 客户端实现都将遵守该 TTL 值。作为第一个近似值,我们可以假设 TTL 可以设置为低至 60 秒,因此,配置更改生效所需的时间不会超过 60 秒。有关此方法的更多详细信息 https://memz.co/service-discovery-microservices-skydns-docker/
使用 service registry 并在 运行 时间查找其他服务的位置。以下是用于此的一些典型技术(还有其他技术)。
服务注册表必须存在于已知位置。此位置在您的微服务中应始终是可配置的 属性。从不硬编码!为了提高灵活性,通常通过 DNS 访问注册表端点。因此,您的服务会寻找 https://registry-1
而不是特定的 IP 地址,后者可能会发生变化。
根据您希望在系统中使用的通信机制,消息队列将帮助您的服务进行通信,但对发现没有帮助。在这种方法中,您仍然会使用 DNS 和可配置属性来告知每个微服务消息队列的位置。然后,各个服务将向队列发布和订阅消息。微服务永远不会知道其他服务(没有发现),所有通信都将通过队列中的消息进行。
Sam Newman's book on microservices 更详细地介绍了这些方法并涵盖了您可能感兴趣的其他关注领域。