我们在单独的机器中有微服务,这些机器目前使用配置中的IP地址通过REST进行通信。还有为这些机器定义的域名。
使用IP地址进行通信是一种良好的做法,还是在IP地址发生变化时应该使用域名?
他们之间的利弊是什么?
发布于 2021-11-13 17:31:51
我会用DNS。
只要这些IP地址在您管理IP地址分配的私有子网上,使用IP地址就很好。他们不会随意改变--你在分配地址。
然而,IP地址可能很难记住。这是不明显的服务,一个给定的地址有关。这会增加部署或维护系统时出现错误配置的风险。
DNS非常好,因为DNS允许您为您的服务提供很好的助记符名称。你可以拥有db.invoicing-service.cluster2.internal.example.com。这比10.0.37.129好。虽然在这里它可能与此无关,但是使用域名可以在同一台机器上部署多个HTTP服务。
许多管理服务的工具都内置了DNS,例如Kubernetes。
使用DNS的缺点是,这会带来额外的复杂性,也可能导致配置错误。太多时候,问题是DNS吗?必须用“是”来回答。特别有趣的是DNS数据库中陈旧的数据,例如当服务被关闭但DNS条目仍然保留时。在评论中,您会对DNS请求引起的额外延迟表示关注,但这通常不是数据中心内部的问题,特别是在DNS结果是本地缓存的情况下。
发布于 2021-11-13 20:54:34
IP地址可能会更改,DNS名称更改的频率要小得多。
直接使用IP地址的唯一“优点”是,您不需要进行DNS查找,这在第一个请求之后从本地缓存中非常快。
如前所述,IP地址也更难记住(尽管一些公司的内部DNS名称有极其繁琐的方案,但这并没有帮助)。
发布于 2021-11-14 09:08:09
当真正的问题是微服务体系结构互连时,每个人都专注于DNS和IP。
也就是说,没有公开的互联网地址
因此,您可能永远不需要DNS记录来让微服务进行通信,因为它们可能驻留在同一个域中,因此强制DNS在不需要它的地方会增加不必要的复杂性。
微服务通常在本地IP地址范围内进行通信,如果它们离开主机的话。许多答案中包括容器,这意味着通信甚至可能永远不会离开服务器主机(从不遍历网络电缆),甚至连一个具有多个端口的Kubernetes节点也不例外,与其他答案相反,DNS在Kubernetes中是完全可选的。
不用说,即使在一个实际的网络上进行通信时,它也可能永远不会穿越互联网。
即使在使用DNS时,无论网络环境如何,如果服务器IP地址是静态的,DNS记录也没有什么好处。
那么,问问自己,服务器是静态的吗?
微服务通过网络进行通信吗?
在网上?
DNS记录管理是否通过因特网路由?
是否应该使用公共互联网可访问的DNS记录来访问微服务?
DNS记录是否在内部DNS解析器上管理?如果微服务必须仍然无法从internet访问,这是DNS选项的一个要求。
使用一个IP的多个服务不需要使用DNS,这只是缺乏对其他答案的理解。Kubernetes节点是一个单一主机,1个IP,即使不使用DNS,也可以从这1个主机和单个IP响应,因为容器使用网络覆盖是可寻址的(与您在家里的NAT路由器相似的概念允许许多设备在ISP给您的一个IP地址之后工作)。
在TLS通信中也有SNI的概念,它将帮助您在一个IP之后运行许多服务,因为TLS使用的是TCI/ IP,它已经不知道DNS,但是它可以工作(因为SNI,而不是DNS)。
服务网格和反向代理(如负载均衡器)是其他选项,有时可以使用DNS,但也可以在同一个IP地址或单个域上使用URL路径,但后面有许多微服务。
https://softwareengineering.stackexchange.com/questions/433511
复制相似问题