【问题标题】:Microservices - how to find DNS IP?微服务 - 如何找到 DNS IP?
【发布时间】:2017-04-29 22:05:25
【问题描述】:

在微服务的世界中,端点不应该(绝不能)被硬编码。最好的方法之一是拥有一个 DNS 并让每个微服务在启动时注册。每当微服务 A 想要与微服务 B 通信时,它都会这样做,它只会向 DNS 询问 B 当前正在侦听的端点。

我不明白的是:微服务如何知道 DNS 所在的位置?

基本上,DNS 只是一种“特殊”服务,我可以拥有一个或多个实例,对吗?所以我也不应该硬编码它的端点,还是应该?假设我这样做了——如果 DNS 实例移动到不同的位置怎么办?我必须在配置中手动更改它的位置吗?

有人碰巧知道如何设计这个吗? (或者任何人都可以将我指向任何解释这一点的文档,因为尽管有很多关于微服务和 dns 的信息,但我无法在任何地方找到这些特定信息 - 也许它太琐碎了,我是唯一一个不明白的人)

【问题讨论】:

    标签: dns microservices service-discovery


    【解决方案1】:

    如其他答案所述,可以手动设置 DNS,但我建议使用在所有方面都支持服务发现的基础架构。例如,kubernetes 内置了 DNS 支持,并且可以很容易地公开可以由任意数量的 Pod 组成的服务。

    像 kubernetes 这样的基础设施技术还将使微服务架构风格的许多其他方面更容易实现,包括高可用性和可扩展性。

    更多信息请查看官方docs

    【讨论】:

    • 完全同意服务发现在许多方面胜过 DNS。
    【解决方案2】:

    DHCP 解决了这个问题。当主机启动时,它会发送广播 DHCP 消息。 DHCP 服务器响应许多值,其中之一是 DNS 服务器的位置。

    在微服务的情况下,主机操作系统(或容器主机)将通过 DHCP 配置为 DNS。微服务代码使用 OS DNS 函数来解析地址。

    https://en.m.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol

    【讨论】:

      【解决方案3】:

      您可以使用本地网络通过 Dhcp 等方式发现服务。但这要求所有服务都已在该 DNS 服务器中“注册”。

      微服务可以通过服务发现、服务器端或客户端找到彼此。如果你选择客户端服务发现,你可以使用像Consul 这样的工具,它提供了很多很棒的功能。其中之一是一个 DNS 端点,它允许通过 SRV 记录与 <serviceName>.consul.service 域名进行查询。

      Consul 有自己的 DNS 端点,您可以配置您的服务以使用它(通常在本地端口 8600 上,因为 Consul 代理在本地运行)。

      但您也可以配置一个实际的 DNS 服务器来将问题转发给 Consul,这样您就可以轻松地将 Consul 的服务发现驱动与在 Bind 实例或类似实例中手动设置服务混合...

      【讨论】:

        【解决方案4】:

        已知主机名解决方案固定部分是服务域名,例如xservice.com。你可以查询这个主机使用标准的 DNS 工具(例如,dig 在你的 shell 等)。

        最后,在绑定到 xservice.com 的 DNS 中,添加一条带有更多详细信息的 SRV 记录。

        SRV 记录列出了所有服务详情,包括:

        • 符号服务名;
        • 提供服务的机器的规范主机名;
        • 服务可用的 TCP(或 UDP)端口。

        还有许多其他信息。完整列表请参见Wikipedia


        请记住,这是一个有点静态的解决方案。如果您正在寻找更动态的答案,那么 Oswin 答案可能更合适:-)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-01-12
          • 2010-09-08
          • 1970-01-01
          • 2014-09-21
          • 2016-09-11
          • 2013-08-10
          • 2011-05-12
          • 2018-01-11
          相关资源
          最近更新 更多