没有硬编码的微服务发现的最佳实践?

时间:2016-07-31 19:01:30

标签: architecture microservices

这个问题让我烦恼了一段时间,如何编写一系列在不同位置的各种机器上运行的微服务,而无需对每个服务的各个位置进行硬编码?

比如说,例如我有服务A,它对json消息进行某种形式的验证。服务A在方框1,3,5上运行,随着需求的增长,可以提出更多实例。

现在说我有服务B,它看起来要求服务A,我如何与服务A所在的服务B进行通信?

我考虑过的可能的解决方案:

  • 硬编码服务B,其中包含服务A的“主”节点的位置,然后将任务委派给所有服务A的实例。

  • 利用消息队列? - 服务B写入一系列消息队列,服务A实例从设置的消息队列中读取,并将结果发送回服务B.

  • SSDP - 利用某种形式的简单服务发现协议来广播在一组网络上运行哪些服务并跟踪这些服务。

我对这种建筑风格很陌生,所以我希望我不会错过一些非常简单的东西?

2 个答案:

答案 0 :(得分:3)

使用service registry并在运行时查找其他服务的位置。以下是一些用于此的典型技术(还有其他技术)。

服务注册表必须存在于已知位置。此位置应始终是您的微服务中的可配置属性。从不硬编码!为了提高灵活性,通过DNS访问注册表端点非常典型。因此,您的服务会查找https://registry-1而不是特定的IP地址,这可能会发生变化。

根据您希望在系统中使用的通信机制,消息队列将帮助您的服务进行通信,但它无助于发现。在这种方法中,您仍然可以使用DNS和可配置属性来告诉每个微服务消息队列的位置。然后,各个服务将发布消息并将消息订阅到队列。微服务永远不会知道其他服务(没有发现),所有通信都将通过队列中的消息。

Sam Newman's book on microservices详细介绍了这些方法,并涵盖了您可能感兴趣的其他相关领域。

答案 1 :(得分:2)

一般来说,实现服务发现有两种方法:

  1. with reverse-proxy / api-gateway。此方法提供更快的更新传播。部署/重新部署/取消部署服务后,所有更改都可以通过反向代理立即处理,因此其配置始终反映您的微服务的状态。但是,存在性能影响 - 包括内部在内的所有请求都应通过反向代理组件。有关此方法的更多详细信息https://memz.co/api-gateway-microservices-docker-node-js/
  2. 使用DNS。这种方法提供较慢的更新,因为每个组件(实际上,用于调用可发现组件的每个http客户端)都需要重新验证其DNS缓存,这可能需要一些时间(可以使用相应DNS条目的TTL进行配置)。此外,它假定每个http客户端实现都将遵循该TTL值。作为第一个近似值,我们可以假设TTL可以设置为低至60秒,因此,配置更改生效所需的时间不会超过。有关此方法的更多详细信息https://memz.co/service-discovery-microservices-skydns-docker/