这个问题让我烦恼了一段时间,如何编写一系列在不同位置的各种机器上运行的微服务,而无需对每个服务的各个位置进行硬编码?
比如说,例如我有服务A,它对json消息进行某种形式的验证。服务A在方框1,3,5上运行,随着需求的增长,可以提出更多实例。
现在说我有服务B,它看起来要求服务A,我如何与服务A所在的服务B进行通信?
我考虑过的可能的解决方案:
硬编码服务B,其中包含服务A的“主”节点的位置,然后将任务委派给所有服务A的实例。
利用消息队列? - 服务B写入一系列消息队列,服务A实例从设置的消息队列中读取,并将结果发送回服务B.
SSDP - 利用某种形式的简单服务发现协议来广播在一组网络上运行哪些服务并跟踪这些服务。
我对这种建筑风格很陌生,所以我希望我不会错过一些非常简单的东西?
答案 0 :(得分:3)
使用service registry并在运行时查找其他服务的位置。以下是一些用于此的典型技术(还有其他技术)。
服务注册表必须存在于已知位置。此位置应始终是您的微服务中的可配置属性。从不硬编码!为了提高灵活性,通过DNS访问注册表端点非常典型。因此,您的服务会查找https://registry-1
而不是特定的IP地址,这可能会发生变化。
根据您希望在系统中使用的通信机制,消息队列将帮助您的服务进行通信,但它无助于发现。在这种方法中,您仍然可以使用DNS和可配置属性来告诉每个微服务消息队列的位置。然后,各个服务将发布消息并将消息订阅到队列。微服务永远不会知道其他服务(没有发现),所有通信都将通过队列中的消息。
Sam Newman's book on microservices详细介绍了这些方法,并涵盖了您可能感兴趣的其他相关领域。
答案 1 :(得分:2)
一般来说,实现服务发现有两种方法: