Architecture 无需硬编码的微服务发现最佳实践?

Architecture 无需硬编码的微服务发现最佳实践?,architecture,microservices,Architecture,Microservices,这是一个困扰了我一段时间的问题,如何编写一系列在不同位置的不同机器上运行的微服务,而不需要对每个服务进行硬编码 比如说,我有一个服务,它对json消息进行某种形式的验证。服务A在框1、3、5上运行,随着需求的增长,可以提供更多实例 现在假设我有服务B,它看起来调用服务A,我将如何与我的服务A所在的服务B通信 我考虑过的可能解决方案: 使用服务a的“主”节点位置对服务B进行硬编码,然后将任务委派给服务a的所有实例 消息队列的利用率?-服务B写入一系列消息队列,服务a实例从设置的消息队列读取,并将

这是一个困扰了我一段时间的问题,如何编写一系列在不同位置的不同机器上运行的微服务,而不需要对每个服务进行硬编码

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

现在假设我有服务B,它看起来调用服务A,我将如何与我的服务A所在的服务B通信

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

  • 使用服务a的“主”节点位置对服务B进行硬编码,然后将任务委派给服务a的所有实例

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

  • SSDP-利用某种形式的简单服务发现协议来广播哪些服务正在集合网络的何处运行,并跟踪这些服务


我对这种体系结构风格还很陌生,所以我希望我没有错过一些非常简单的东西?

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

  • 使用反向代理/api网关。这种方法提供了更快的更新传播。部署/重新部署/取消部署服务时,反向代理可以立即处理所有更改,因此其配置始终反映微服务的状态。但是,这会影响性能—所有请求(包括内部请求)都应该通过反向代理组件。有关此方法的更多详细信息
  • 使用DNS。这种方法提供较慢的更新,因为每个组件(基本上是用于调用可发现组件的每个http客户端)都需要重新验证其DNS缓存,这可能需要一些时间(可以使用相应DNS条目的TTL进行配置)。此外,它假设每个http客户机实现都将尊重该TTL值。作为第一个近似值,我们可以假设TTL可以设置为低至60秒,因此,配置更改生效所需的时间不会超过60秒。有关此方法的更多详细信息
  • 使用并在运行时查找其他服务的位置。这里有一些用于此的典型技术(还有其他技术)

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

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

    详细介绍这些方法,并涵盖您可能感兴趣的其他领域