之前,公司内部知识分享,讲了些关于 CDN
方面的知识,但是那两天都加班到很晚,精神有点不好,没有整理。今天梳理一下,做一点输出, 是个简单的内容。
CDN
能够加速请求,是因为能够将数据或是静态文件缓存起来,当请求到达并命中缓存时, 就能直接返回请求结果了。并且,CDN
服务商的节点通常是比较多的, 一般都会根据你的实际 IP
所在的位置来分配最近的节点,减少传输的节点,加速传输速度。
CDN 的原理:
- 用户请求指定域名。
- 通过
DNS
获取CNAME
记录。这个CNAME
记录指向的是CDN
服务商的DNS
服务器地址, 因此为了获取实际的IP
地址, 还要对CNAME
的域名再次解析,请求到达CDN
服务商的DNS
服务器时,CDN
服务商 会根据全局的负载均衡来返回 实际的IP
, 如根据地理位置,分配所在地最近的节点IP
。 - 用户根据返回的实际
IP
继续自己的请求。
CNAME
: 可以理解为域名的别名,一个域名,可以指定多个 CNAME
。例如在七牛,使用它的资源存储服务,是需要我们设置自己的域名的,我们的域名指向他的域名, 在域名解析中设置一个 CNAME
记录。例如,我们的域名为 mydomain.com
, 那么设置的CNAME
记录: 主机记录 images.mydomain.com
, 记录值 images.mydomain.com.qiniudns.com
,DNS
解析记录如下:
$ dig images.mydomain.com
; <<>> DiG 9.10.6 <<>> images.mydomain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64585
;; flags: qr rd ra; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;images.mydomain.com. IN A
;; ANSWER SECTION:
images.mydomain.com. 599 IN CNAME images.mydomain.com.qiniudns.com.
images.mydomain.com.qiniudns.com. 599 IN CNAME dt009.china.line.qiniudns.com.
dt009.china.line.qiniudns.com. 599 IN CNAME global.w.kunlunar.qiniudns.com.
global.w.kunlunar.qiniudns.com. 3599 IN CNAME globalcdnweb.qiniu.com.w.kunlunar.com.
globalcdnweb.qiniu.com.w.kunlunar.com. 179 IN A 59.63.233.232
globalcdnweb.qiniu.com.w.kunlunar.com. 179 IN A 218.77.65.132
globalcdnweb.qiniu.com.w.kunlunar.com. 179 IN A 59.63.233.228
globalcdnweb.qiniu.com.w.kunlunar.com. 179 IN A 59.63.233.231
globalcdnweb.qiniu.com.w.kunlunar.com. 179 IN A 59.63.233.226
globalcdnweb.qiniu.com.w.kunlunar.com. 179 IN A 59.63.233.227
globalcdnweb.qiniu.com.w.kunlunar.com. 179 IN A 59.63.233.229
globalcdnweb.qiniu.com.w.kunlunar.com. 179 IN A 59.63.233.230
globalcdnweb.qiniu.com.w.kunlunar.com. 179 IN A 59.63.233.233
;; Query time: 223 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Sun Jan 13 21:37:02 CST 2019
;; MSG SIZE rcvd: 351
动态资源
我们的资源,可能不是一般意义上的一个文件,可能是一个某一种特定格式的数据,如 json
数据。那么,我们就需要动态去设置 CDN
缓存了。如何命中,有多个维度:
- scheme:http、 https
- host
- url
- query params
- HEADER参数。 刚开是我以为就是以上这些,其实现在的服务商还会提供能够自定义的 HEADER参数.
以上,就能够覆盖我们很多的使用场景了。
更新 CDN 缓存资源
CDN
有多个节点,所以,想同时更新所有节点上的资源是很困难的,一般都有一定的时间间隔,因此,最好的方式,是加入版本的概念,如 v=xxxxx
, 这样, 在响应时,就会响应最新的数据了。
有错误请帮忙指正,谢谢。