# DNS 在现代前端中扮演着怎样的角色

DNS 的全称是域名系统(Domain Name System)
它的主要功能就是将人们容易记住的域名转换成计算机能理解的 IP 地址,从而实现正确的网络连接,而执行这项转换任务的便是 DNS 服务器

DNS 服务器除了部署在互联网的各个角落,其实每一台终端设备都会内置本地 DNS 服务器
DNS 查询时,会依次经过应用程序,比如浏览器的缓存、本地 hosts、本地 DNS 服务器、根服务器、顶级域名服务器、权威服务器,最后得到真正的 IP 地址

作为开发者,我们通常会从域名服务商购买顶级域名,同时服务商也会提供域名解析服务

配置 DNS records,最重要的便是 A 记录和 CNAME 记录,A 记录保存最终要返回的 IP 地址,而 CNAME 则是将子域名映射到另一个域名,可以指向相同主域名也可以是其他主域名

这种在 A 记录上直接填写固定 IP 地址的方式,只适用于简单的单机部署网站
在大型应用中,应用服务器以分布式方式部署,IP 地址是动态变化的,因此,大型应用会采用动态解析 IP 地址的方式,将同一个域名,根据不同网络运营商、不同地区,解析到不同 IP 地址的服务器上。
在真实世界中,这些服务器大概率并非最终的应用服务器,而是具备反向代理能力的负载均衡(LB)服务器、WEB 应用防火墙(WAF)等等。而真正的应用服务器 IP 地址是不会暴露于公网环境的。

现代 DNS 服务器除了具备基本的域名解析功能外,还会提供安全插件(DNSSEC)、DNS 分析、利用边缘网络加速解析、DDos 防护这些功能。它们都是为了更快、更安全的为用户提供服务

前端熟知的内容分发网络(CDN)与 DNS 有着密切关系,当不同地区的用户访问前端静态资源时,会从不同的 CDN 节点下载数据,这归功于 DNS 系统的 CNAME 记录,DNS 服务器会根据用户所在地区,返回不同的 CNAME 域名,我们通常称之为 CDN 加速域名

假设我们的图片资源托管在 img.alicdn.com 上,如何知道用户实际上会访问到哪台 CDN 服务器呢
使用 nslookup 工具依次查询该域名的 CNAME 和 A 记录,最终我们会得到 CDN 服务器的 IP 地址,它的实际地理位置刚好就是用户所在地附近

真实世界中 DNS 解析并非一轮完成,它背后会经历多次反复查询,在没有任何缓存的情况下,它会非常慢,以至于显著影响到你的网站打开速度,因此,无论是 DNS 云服务商还是互联网上的基础设施,都会想尽办法加速 DNS 解析,诸如:

  • 使用高性能的 DNS 服务器
  • 配置 DNS 缓存
  • 增加 DNS 记录的缓存时间(TTL)等等

作为前端,我们也可以通过浏览器提供的 DNS 预取功能,来指定需要提前解析的域名,比如:

  • 通过在 HTML 中添加 dns-prefetch link 标签,可以让浏览器在解析完该标签后立即进行 DNS 查询,来提升用户后续访问该域名的速度。

  • 利用 DNS 查询原理,我们可以通过修改本地 hosts 的方式来给项目配置一个域名,而不是直接使用 localhost, 这能有效解决与服务端联调时,cookie 无法跨越传输的问题

  • 另外,如果项目依赖中硬编码了线上域名,通过修改本地 DNS 记录,可以在不改变代码的情况下,将线上域名映射到本地或者联调环境,方便问题验证和多环节联调