Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

nodejs dns 模块的 lookup 与 resolve

  说起 node 的域名解析,我以前一直都用 dns.lookup 来做。至少 node 内部的 net 也是基于这个方法来解析域名的。虽然 node 的 dns.lookup 从命名来看长得和系统的 nslookup 类似,但 dns.lookup 工作原理和系统的 nslookup 完全不同。
  如果希望不考虑 /etc/hosts 的配置,直接访问 DNS 服务器去解析一个域名应该使用 resolve* 这组方法。比如一般的 IP4 解析就使用 dns.resolve4 这个方法。
  但是 resolve* 方法也有一些需要注意的地方。lookup 的定义是得到第一个解析的结果,而 resolve* 不是,它得到的是一个数组。因为一个域名是可以解析出多个结果的,或者说 DNS 解析设置中同名同类型的记录可以设置多条(DNS 轮询实现负载均衡就是基于对应到多个 IP 的域名解析),并且设置优先级。所以我们只要从这个数组中取出任意一项即可。
  resolve* 和 lookup 还有一个区别就是 lookup 可以直接接受一个 IP,解析就得到这个 IP。基本上终端能 ping 的东西就能 lookup(因为它们底层调用同一个系统 API)。而 resolve4 则不行,resolve4 必须要丢一个 DNS 服务器可解析的域名过去,否则出错。所以如果无法确保参数是一个域名就应该先正则匹配一下,确定不是 IP 后再在去调 resolve4。
  最后还有个坑,resolve* 总是要向 DNS 服务器发起查询,所以是很慢的。如果程序不提供查询结果缓存而直接用于高访问量的机房就可能会把机房的局域网 DNS 服务器搞挂(如果局域网 DNS 服务器很烂的话)。总之尽可能地使用 lookup,避免使用 resolve。
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^