微服务 - 如何找到 DNS IP?
Microservices - how to find DNS IP?
在微服务世界中,端点不应该(绝不能)被硬编码。最好的方法之一是拥有一个 DNS 并让每个微服务在启动时注册。通过在微服务 A 想要与微服务 B 通信时执行此操作,它只向 DNS 询问 B 当前侦听的端点。
我不明白的是:微服务如何知道 DNS 所在的位置?
基本上 DNS 只是一项 'special' 服务,我可以拥有它的一个或多个实例,对吧?所以我也不应该硬编码它的端点,或者我应该吗?假设我这样做了——如果 DNS 实例被移动到不同的位置怎么办?我必须手动更改它在配置中的位置吗?
有没有人碰巧知道如何设计这个? (或者任何人都可以指点我解释这个的任何文档,因为尽管有很多关于微服务和 dns 的信息,但我无法在任何地方找到这个特定的信息 - 也许它太微不足道了,我是唯一一个不明白的人)
已知主机名解决方案。 固定部分为服务域名,例如xservice.com
。您可以使用标准 DNS 工具 查询 此主机(例如, shell 中的 dig
等)。
最后,在绑定到 xservice.com
的 DNS 中,您然后添加一个包含更多详细信息的 SRV
记录。
一条SRV
记录列出了所有的服务详情,包括:
- 符号服务名称;
- 提供服务的机器的规范主机名;
- 服务可用的 TCP(或 UDP)端口。
还有很多其他信息。请参阅 Wikipedia 以获取完整列表。
请记住这是一个有点静态的解决方案。如果您正在寻找更动态的答案,那么 Oswin 答案可能更合适:-)
DHCP 解决了这个问题。当主机启动时,它会发送广播 DHCP 消息。 DHCP 服务器响应许多值,其中之一是 DNS 服务器的位置。
在微服务的情况下,主机 OS(或容器主机)将通过 DHCP 配置 DNS。微服务代码使用 OS DNS 函数来解析地址。
https://en.m.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
如其他答案所述,可以手动设置 DNS,但我建议使用在所有方面都支持服务发现的基础架构。例如,kubernetes 内置了 DNS 支持,可以很容易地公开一个可以包含任意数量 Pods 的服务。
像 kubernetes 这样的基础设施技术也将使微服务架构风格的许多其他方面更容易实现,包括高可用性和可扩展性。
请参阅官方docs了解更多信息。
您可以使用您的本地网络通过 Dhcp 和诸如此类的东西来发现服务。但这要求所有服务都已经 "registered" 在该 DNS 服务器中。
微服务可以通过服务发现、服务器端或客户端找到彼此。如果您选择客户端服务发现,您可以使用像 Consul 这样的工具,它提供了很多很棒的功能。其中之一是 DNS 端点,它允许通过具有 <serviceName>.consul.service
个域名的 SRV
条记录进行查询。
Consul 有自己的 DNS 端点,您可以配置您的服务以使用它(通常在本地端口 8600 上,作为本地的 Consul 代理 运行)。
但是您也可以配置一个实际的 DNS 服务器来将问题转发给 Consul,这样您就可以轻松地将 Consul 的服务发现驱动与 Bind
实例或类似实例中的手动设置服务混合使用...
在微服务世界中,端点不应该(绝不能)被硬编码。最好的方法之一是拥有一个 DNS 并让每个微服务在启动时注册。通过在微服务 A 想要与微服务 B 通信时执行此操作,它只向 DNS 询问 B 当前侦听的端点。
我不明白的是:微服务如何知道 DNS 所在的位置?
基本上 DNS 只是一项 'special' 服务,我可以拥有它的一个或多个实例,对吧?所以我也不应该硬编码它的端点,或者我应该吗?假设我这样做了——如果 DNS 实例被移动到不同的位置怎么办?我必须手动更改它在配置中的位置吗?
有没有人碰巧知道如何设计这个? (或者任何人都可以指点我解释这个的任何文档,因为尽管有很多关于微服务和 dns 的信息,但我无法在任何地方找到这个特定的信息 - 也许它太微不足道了,我是唯一一个不明白的人)
已知主机名解决方案。 固定部分为服务域名,例如xservice.com
。您可以使用标准 DNS 工具 查询 此主机(例如, shell 中的 dig
等)。
最后,在绑定到 xservice.com
的 DNS 中,您然后添加一个包含更多详细信息的 SRV
记录。
一条SRV
记录列出了所有的服务详情,包括:
- 符号服务名称;
- 提供服务的机器的规范主机名;
- 服务可用的 TCP(或 UDP)端口。
还有很多其他信息。请参阅 Wikipedia 以获取完整列表。
请记住这是一个有点静态的解决方案。如果您正在寻找更动态的答案,那么 Oswin 答案可能更合适:-)
DHCP 解决了这个问题。当主机启动时,它会发送广播 DHCP 消息。 DHCP 服务器响应许多值,其中之一是 DNS 服务器的位置。
在微服务的情况下,主机 OS(或容器主机)将通过 DHCP 配置 DNS。微服务代码使用 OS DNS 函数来解析地址。
https://en.m.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol
如其他答案所述,可以手动设置 DNS,但我建议使用在所有方面都支持服务发现的基础架构。例如,kubernetes 内置了 DNS 支持,可以很容易地公开一个可以包含任意数量 Pods 的服务。
像 kubernetes 这样的基础设施技术也将使微服务架构风格的许多其他方面更容易实现,包括高可用性和可扩展性。
请参阅官方docs了解更多信息。
您可以使用您的本地网络通过 Dhcp 和诸如此类的东西来发现服务。但这要求所有服务都已经 "registered" 在该 DNS 服务器中。
微服务可以通过服务发现、服务器端或客户端找到彼此。如果您选择客户端服务发现,您可以使用像 Consul 这样的工具,它提供了很多很棒的功能。其中之一是 DNS 端点,它允许通过具有 <serviceName>.consul.service
个域名的 SRV
条记录进行查询。
Consul 有自己的 DNS 端点,您可以配置您的服务以使用它(通常在本地端口 8600 上,作为本地的 Consul 代理 运行)。
但是您也可以配置一个实际的 DNS 服务器来将问题转发给 Consul,这样您就可以轻松地将 Consul 的服务发现驱动与 Bind
实例或类似实例中的手动设置服务混合使用...