一、cdn是什么
CDN,全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
举个例子,我们在一个园区内工作,而直接访问网络的端口带宽被限定为了2M,这也就意味着如果要下载一个蓝光视频,比如说《阿凡达》,那么将是一个十分糟糕的体验。这时,假设园区网内部使用了缓存设备,可以做到当发现很多人都在用2M的带宽龟速下载同一个热门的资源的话,它就会把它缓存下来,那么,大家就可以用内网中远远高于2M的带宽来进行下载了,而且也不用占用访问外网的带宽。
通过以上的例子,不难得知,其实CDN的本质就是,将媒体资源,动静态图片(Flash),HTML,CSS,JS等等内容缓存到距离你更近的IDC(互联网数据中心,Internet Data Center),从而让用户进行共享资源,实现缩减站点间的响应时间等等需求,如下图所示:
二、探讨cdn的工作原理
CDN应用广泛,支持多种行业、多种场景内容加速,例如:图片小文件、大文件下载、视音频点播、直播流媒体、全站加速、安全加速。我们借助阿里云官网的例子,可以来简单介绍CDN的工作原理。以下是为阿里云CDN的产品架构图,通过调度系统、链路质量系统、缓存系统和支撑系统这四大系统组成。
当终端用户发起访问请求时,用户的访问请求会先进行域名DNS解析,取得阿里云CDN调度系统的IP地址,然后通过阿里云CDN的调度系统处理用户的解析请求,而链路质量探测系统会实时监测缓存系统中的所有节点和链路的实时负载以及健康状况,并将结果反馈给调度系统,调度系统根据用户请求中携带的IP地址解析用户的运营商和区域归属,然后综合链路质量信息为用户分配一个最佳接入节点,最后用户通过收到的最佳接入节点访问对应的缓存节点,如果节点已经缓存了用户请求的资源,会直接将资源返回给用户;如果L1(边缘节点)和L2(汇聚节点)节点都没有缓存户请求的资源,此时会返回源站去获取资源并缓存到缓存系统,供后续用户访问,避免重复回源。
举个例子,假设要加速的域名为www.aliyundoc.com,接入CDN开始加速服务后,当终端用户在北京发起HTTP请求时,处理流程如下图所示。
- 当终端用户向www.aliyundoc.com下的指定资源发起请求时,首先向Local DNS(本地DNS)发起请求域名www.aliyundoc.com对应的IP。
- Local DNS检查缓存中是否有www.aliyundoc.com的IP地址记录。如果有,则直接返回给终端用户;如果没有,则向网站授权DNS请求域名www.aliyundoc.com的解析记录。
- 当网站授权DNS解析www.aliyundoc.com后,返回域名的CNAME www.aliyundoc.com.example.com。
- Local DNS向阿里云CDN的DNS调度系统请求域名www.aliyundoc.com.example.com的解析记录,阿里云CDN的DNS调度系统将为其分配最佳节点IP地址。
- Local DNS获取阿里云CDN的DNS调度系统返回的最佳节点IP地址。
- Local DNS将最佳节点IP地址返回给用户,用户获取到最佳节点IP地址。
- 用户向最佳节点IP地址发起对该资源的访问请求。
- 如果该最佳节点已缓存该资源,则会将请求的资源直接返回给用户(步骤8),此时请求结束。
- 如果该最佳节点未缓存该资源或者缓存的资源已经失效,则节点将会向源站发起对该资源的请求。获取源站资源后结合用户自定义配置的缓存策略,将资源缓存到CDN节点并返回给用户(步骤8),此时请求结束。
三、在SPA应用中使用外部cdn
当我们在浏览器的地址栏中输入一个URL,到这个页面呈现出来,返回的html内容一般都会包含有图片,视频,音频等资源。而我们往往开发的是单页面应用(SPA),绕不开的一个问题就是首页加载东西过多,加载时间过长,所以提升网站的访问速度 至关重要。
网站的访问速度,只基于一点,那就是页面包含的内容传输到用户电脑的速度,如果用户到服务器的链路之间有一段比较缓慢的话,整体速度会被拉的十分差劲,因此,通过提取第三方库,使用CDN加速不失为一种优化手段。
以React17的外部cdn引入为例,上面的地址是七牛开放cdn的链接地址,通过放置在creact-react-app初始化工程时创建的index.html中。那么用户在读取网页内容的时候,就会去距离用户IP最近的七牛云的服务器上获取React库。这样做的好处呢,第一,一般来说,访问速度有保障,稳定性也有保障;第二,也可以省下资源服务器的一部分资源负担,节省空间,节省流量。
原创文章,作者:优速盾-小U,如若转载,请注明出处:https://www.cdnb.net/bbs/archives/31434