大家好,我是小林。
我写技术文章画的图片是保存到 GitHub 的,没别的原因,就是因为免费,但是 GitHub 访问的速度大家都懂的,访问的速度很慢。所以我会用 CDN 来加速图片的访问,也就是我的图床的方案是 GitHub + jsdelivr CDN,使用很简单,只需要把域名地址替换一下就行。那为什么访问 GitHub 会很慢呢?GitHub 离国内就近的服务器是在新加波,距离我这有 2600 公里,也就是说,访问 GitHub 上的一张图片,一个数据包就要走 2600 公里这么远!
而且,互联网从逻辑上看是一张大网,但实际上是由许多小网络组成的,每个网络络中还存在许多的路由器、网关,数据每经过一个节点,都要处理一下,在二层、三层解析转发,这也会消耗一定的时间,带来延迟。把这些因素再放到全球来看,地理距离、运营商网络、路由转发的影响就会成倍增加,也就是访问 GitHub 慢的一个原因。那我是怎么知道 GitHub 服务器在哪的呢?很简单,ping www.github.com 后,就会显示出服务器的 ip 地址,然后把 ip 地址用百度搜索,就能查到该服务器是在哪里的了
图片资源是静态资源,所以要解决访问慢的问题,就可以用 CDN 加速。在我加上 jsdelivr CDN 后,GitHub 的图片就会被缓存到 CDN 服务器上,而深圳正好就有一台 jsdelivr 的 CDN 服务器。这样我访问 GitHub 图片不用再大老远跑去新加波的服务器,而是遵循就近访问原则,直接访问离深圳的这台 CDN 服务器,大大加快了访问速度。这次,我们就来好好聊一聊 CDN。开车啦!
什么是 CDN?
CDN 的全称叫 Content Delivery Network,中文名叫「内容分发网络」,它是解决由于长距离而网络访问速度慢的问题。
怎么做到的呢?
简单来说,CDN 将内容资源分发到位于多个地理位置机房中的服务器上,这样我们在访问内容资源的时候,不用访问源服务器。而是直接访问离我们最近的 CDN 节点 ,这样一来就省去了长途跋涉的时间成本,从而实现了网络加速。
CDN 能加速什么类型的内容?
CDN 加速的是内容资源是静态资源。所谓的「静态资源」是指数据内容静态不变,任何时候来访问都是一样的,比如图片、音频。与之相反的「动态资源」,是指数据内容是动态变化的,每次访问都不一样,比如用户信息等。不过,动态资源如果也想被缓存加速,就要使用动态 CDN,其中一种方式就是将数据的逻辑计算放在 CDN 节点来做,这种方式就被称为边缘计算。
CDN 是怎么从源服务器获取资源的呢?
CDN 加速策略有两种方式,分别是「推模式」和「拉模式」。大部分 CDN 加速策略采用的是「拉模式」,当用户就近访问的 CDN 节点没有缓存请求的数据时,CDN 会主动从源服务器下载数据,并更新到这个 CDN 节点的缓存中。可以看出,拉模式属于被动缓存的方式,与之相反的 「推模式」就属于主动缓存的方式。如果想要把资源在还没有用户访问前缓存到 CDN 节点,则可以采用「推模式」,这种方式也叫 CDN 预热。通过 CDN 服务提供的 API 接口,把需要预热的资源地址和需要预热的区域等信息提交上去,CDN 收到后,就会触发这些区域的 CDN 节点进行回源来实现资源预热。
如何找到离用户最近的 CDN 节点 ?
找到离用户最近的 CDN 节点是由 CDN 的全局负载均衡器(Global Sever Load Balance,GSLB)负责的。那 GSLB 是在什么时候起作用的呢?在回答这个问题前,我们先来看看在没有 CDN 的情况下,访问域名时发生的事情。在没有 CDN 的情况下,当我们访问域名时,DNS 服务器最终会返回源服务器的地址。比如,当我们在浏览器输入 www.xiaolin.com 域名后,在本地 host 文件找不到域名时,客户端就会访问本地 DNS 服务器。
这时候:
- 如果本地 DNS 服务器有缓存该网站的地址,则直接返回网站的地址;
- 如果没有就通过递归查询的方式,先请求根 DNS,根 DNS 返回顶级 DNS(.com)的地址;再请求 .com 顶级 DNS 得到 xiaolin.com 的域名服务器地址,再从 xiaolin.com 的域名服务器中查询到 www.xiaolin.com 对应的 IP 地址,然后返回这个 IP 地址,同时本地 DNS 缓存该 IP 地址,这样下一次的解析同一个域名就不需要做 DNS 的迭代查询了。
但加入 CDN 后就不一样了。
会在 xiaolin.com 这个 DNS 服务器上,设置一个 CNAME 别名,指向另外一个域名 www.xiaolin.cdn.com,返回给本地 DNS 服务器。接着继续解析该域名,这个时候访问的就是 xiaolin.cdn.com 这台 CDN 专用的 DNS 服务器,在这个服务器上,又会设置一个 CNAME,指向另外一个域名,这次指向的就是 CDN 的 GSLB。接着,本地 DNS 服务器去请求 CDN 的 GSLB 的域名,GSLB 就会为用户选择一台合适的 CDN 节点提供服务,选择的依据主要有以下几点:
- 看用户的 IP 地址,查表得知地理位置,找相对最近的 CDN 节点;
- 看用户所在的运营商网络,找相同网络的 CDN 节点;
- 看用户请求 URL,判断哪一台服务器上有用户所请求的资源;
- 查询 CDN 节点的负载情况,找负载较轻的节点;
GSLB 会基于以上的条件进行综合分析后,找出一台最合适的 CDN 节点,并返回该 CDN 节点的 IP 地址给本地 DNS 服务器,然后本地 DNS 服务器缓存该 IP 地址,并将 IP 返回给客户端,客户端去访问这个 CDN 节点,下载资源。
这次就说到这啦,我们下次见!