文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源:
- 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 《 Java 高并发 三部曲 》 面试必备 + 大厂必备 + 涨薪必备
- 疯狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
- 疯狂创客圈 经典图书 : 《SpringCloud、Nginx高并发核心编程》 面试必备 + 大厂必备 + 涨薪必备 加尼恩免费领
- 疯狂创客圈 资源宝库: Java 必备 百度网盘资源大合集 价值>1000元 【免费取 】
推荐:入大厂 、做架构、大力提升Java 内功 的 精彩博文
入大厂 、做架构、大力提升Java 内功 必备的精彩博文 | 2021 秋招涨薪1W + 必备的精彩博文 |
---|---|
1:Redis 分布式锁 (图解-秒懂-史上最全) | 2:Zookeeper 分布式锁 (图解-秒懂-史上最全) |
3: Redis与MySQL双写一致性如何保证? (面试必备) | 4: 面试必备:秒杀超卖 解决方案 (史上最全) |
5:面试必备之:Reactor模式 | 6: 10分钟看懂, Java NIO 底层原理 |
7:TCP/IP(图解+秒懂+史上最全) | 8:Feign原理 (图解) |
Java 面试题 30个专题 , 史上最全 , 面试必刷 | 阿里、京东、美团... 随意挑、横着走!!! |
---|---|
1: JVM面试题(史上最强、持续更新、吐血推荐) | 2:Java基础面试题(史上最全、持续更新、吐血推荐 |
3:架构设计面试题 (史上最全、持续更新、吐血推荐) | 4:设计模式面试题 (史上最全、持续更新、吐血推荐) |
17、分布式事务面试题 (史上最全、持续更新、吐血推荐) | 一致性协议 (史上最全) |
29、多线程面试题(史上最全) | 30、HR面经,过五关斩六将后,小心阴沟翻船! |
9.网络协议面试题(史上最全、持续更新、吐血推荐) | 更多专题, 请参见【 疯狂创客圈 高并发 总目录 】 |
SpringCloud 精彩博文 | |
---|---|
nacos 实战(史上最全) | sentinel (史上最全+入门教程) |
SpringCloud gateway (史上最全) | 更多专题, 请参见【 疯狂创客圈 高并发 总目录 】 |
前言:
CDN 实现了“网络加速” 的重要技术之一,本文为大家彻底介绍清楚 CDN的核心原理和使用。
为什么要有网络加速
互联网从逻辑上看是一张大网,但实际上是由许多小网络组成的,这其中就有小网络“互连互通”的问题,典型的就是各个电信运营商的网络,比如国内的电信、联通、移动三大家。
这些小网络内部的沟通很顺畅,但网络之间却只有很少的联通点。如果你在 A 网络,而网 站在 C 网络,那么就必须“跨网”传输,和成千上万的其他用户一起去“挤”连接点 的“独木桥”。而带宽终究是有限的,能抢到多少只能看你的运气。
另外,网络中还存在许多的路由器、网关,数据每经过一个节点,都要停顿一下,在二层、 三层解析转发,这也会消耗一定的时间,带来延迟。
最终结果就是,如果仅用现有的 HTTP 传输方式,大多数网站都会访问速度缓慢、用户体 验糟糕。
放到全球来看,物理距离非常大,你在北京,访问旧金山的网站,要跨越半个地球,地理位置距离远、运营商网络、路由转发的影响就会成倍增加。
什么是CDN?
CDN (全称 Content Delivery Network),即内容分发网络。
CDN构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
CDN 的关键技术主要有内容存储和分发技术,简单来讲,CDN就是根据用户位置分配最近的资源,于是,用户在上网的时候不用直接访问源站,而是访问离他“最近的”一个 CDN 节点(也叫做“边缘节点”、edge node),其实就是缓存了源站内容的代理服务器。
CDN的分发系统架构
全球有这么多的数据中心,无论在哪里上网,临近不远的地方基本上都有数据中心。是不是可以在这些数据中心里部署几台机器,形成一个缓存的集群来缓存部分数据,那么用户访问数据的时候,就可以就近访问了呢?
当然是可以的。这些分布在各个地方的各个数据中心的节点,术语叫“边缘节点”(edge node)。
由于边缘节点数目比较多,但是每个集群规模比较小,不可能缓存下来所有东西,因而可能无法命中, 这样就会在边缘节点之上。有区域节点,规模就要更大,缓存的数据会更多,命中的概率也就更大。在区域节点之上是中心节点,规模更大,缓存数据更多。如果还不命中,就只好回源网站访问了。
这就是CDN的分发系统的架构。CDN系统的缓存,也是一层一层的,能不访问后端真正的源,就不打扰它。这也是电商网站物流系统的思路,北京局找不到,找华北局,华北局找不到,再找北方局。
CDN的特点
1.CDN 的最核心原则是“就近访问”,如果用户能够在本地几十公里的距离之内获取到数据,那么时延就基本上变成 0 了。所以 CDN 厂商 投入了大笔资金,在全国、乃至全球的各个大枢纽城市都建立了机房,部署了大量拥有高存储高带宽的节点,构建了一个专用网络。
2.有了这个高速专用网,CDN就要分发源站的内容,利用缓存代理技术,把源站内容逐级缓存到网络的每一个节点上,这样用户上网就不用直接访问源站,而是访问离他“最近的”一个 CDN 节点,其实就是缓存了源站内容的代理服务器,这样一来就省去了“长途跋涉”的时间成本,实现了“网络加速”。
3.那么,CDN 都能加速什么样的“内容”呢? 静态资源,而不是动态资源。
在 CDN 领域里,“内容”其实就是 HTTP 协议里的“静态资源”,比如超文本、图片、视频、应用程序安装包等等。
名词解释:“静态资源”和“动态资源”: 所谓的“静态资源”是指数据内容“静态不变”,任何时候来访问都是一样的,比如图片、音频。所谓的“动态资源”是指数据内容是“动态变化”的,也就是由后台服务计算生成的,每次访问都不一样,比如商品的库存、微博的粉丝数等。
CDN的原理
内容分发网络(Content Delivery Network, CDN)其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络"边缘",使用户可以就近取得所需的内容,解决Internet网络拥塞状况,提高用户访问网站的响应速度。
从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等原因所造成的用户访问网站响应速度慢的问题。
CDN网络的组成
一个CDN网络主要由以下几部分组成:内容缓存设备、内容分发管理设备、本地负载均衡交换机、GSLB设备和CDN管理系统,其网络结构如下图所示:
其中:
内容缓存设备Cache:
用于缓存内容实体和对缓存内容进行组织和管理。当有用户访问该客户内容时,直接由各缓存服务器响应用户的请求。
内容分发管理设备:
主要负责核心Web服务器内容到CDN网络内缓存设备的内容推送、删除、校验以及内容的管理、同步。
GSLB设备:
则实现CDN全网各缓存节点之间的资源负载均衡,它与各节点的SLB设备保持通信,搜集各节点缓存设备的健康状态、性能、负载等,自动将用户指引到位于其地理区域中的最近服务器或者引导用户离开拥挤的网络和服务器。还可以通过使用多站点的内容和服务来提高容错性和可用性,防止因本地网或区域网络中断、断电或自然灾害而导致的故障。
不用CDN技术时,使用GSLB设备可以为用户选择最合适的服务器,但受Web服务器的负荷和传输距离等因素的影响,响应速度依然经常不能满足用户的需求。这一问题的解决方案就是在传输网络上利用缓存技术使得Web服务数据流能够就近访问。内容分发网络(CDN)正是这种思想的一个实现,CDN使用GSLB设备将用户引导到最合适的缓存节点(距离近,负载低),使得用户在访问静态内容时获得更好的体验。
CDN管理系统:
实现对全网设备的管理,对系统的配置。它不仅能对系统中的各个设备进行实时监控,对各种故障产生相应的告警,还能实时观测到系统中总的流量以及各节点的流量,并保存在系统的数据库中,作为统计分析的基础数据,并对日志文件进行管理、报告,作为计费的基础数据。
CDN工作流程
CDN网络结合了GSLB与缓存技术,其工作流程如下图所示:
用户访问某个站点的内容时,若该站点使用了CDN网络,则在用户会在域名解析时获得CDN网络GSLB设备的IP地址。GSLB设备根据其预设的选择策略(如,地理区域、用户时间等)为用户选择最合适的内容缓存节点,并且使用某种方式(如,基于DNS、基于HTTP重定向、基于IP欺骗的方式等)导引用户访问所选的内容缓存节点。
用户继续向缓存节点发出请求,若缓存中包含请求的内容,则直接返回给用户,否则从核心Web服务器中获取该内容,缓存后返回给用户。这样当用户再次访问相同内容或其他用户访问相同内容时,可以直接从缓存中读取,提高了效率。
在没有应用CDN时,我们使用域名访问某一个站点时的路径为
用户提交域名→浏览器对域名进行解释→DNS 解析得到目的主机的IP地址→根据IP地址访问发出请求→得到请求数据并回复
应用CDN后,DNS 返回的不再是 IP 地址,而是一个CNAME(Canonical Name ) 别名记录,指向 CDN的全局负载均衡 GSLB, GSLB实际上在域名解析的过程中承担了中间人(或者说代理)的角色,这是CDN实现的关键
CDN的全局负载均衡 GSLB
由于没有返回IP地址,于是本地DNS会向负载均衡系统再发送请求 ,则进入到CDN的全局负载均衡系统GSLB 进行智能调度:
-
看用户的 IP 地址,查表得知地理位置,找相对最近的边缘节点
-
看用户所在的运营商网络,找相同网络的边缘节点
-
检查边缘节点的负载情况,找负载较轻的节点
-
其他,比如节点的“健康状况”、服务能力、带宽、响应时间等
结合上面的因素,得到最合适的边缘节点,然后把这个节点返回给用户,用户就能够就近访问CDN的缓存代理
整体流程如下图:
图解:CDN工作流程的一个示例
还记得我们讲过的基于DNS的全局负载均衡吗? 如果不了解,请参阅下文:
这个负载均衡主要用来选择一个就近的同样运营商的服务器进行访问。你会发现,CDN分发网络也是一个分布在多个区域、多个运营商的分布式系统,也可以用相同的思路选择最合适的边缘节点。
下图,是CDN工作流程的一个示例:
在没有CDN的情况下,用户向浏览器输入www.web.com
这个域名,客户端访问本地DNS服务器的时候,如果本地DNS服务器有缓存,则返回网站的地址;如果没有,递归查询到网站的权威DNS服务器,这个权威DNS服务器是负责web.com的,它会返回网站的IP地址。
本地DNS服务器缓存下IP 地址,将IP地址返回,然后客户端直接访问这个IP地址,就访问到了这个网站。
然而有了 CDN之后,情况发生了变化。
在web.com这个权威DNS服务器上,会设置一个CNAME别名,指向另外一个域名www.web.cdn.com
,返回给本地DNS服务器。
当本地DNS服务器拿到这个新的域名时,需要继续解析这个新的域名。这个时候,再访问的就不是 web.com 的权威DNS服务器了,而是web.cdn.com的权威DNS服务器,这是CDN自己的权威 DNS 服务器。在这个服务器上,还是会设置一个CNAME,指向另外一个域名,也即CDN网络的全局负载均衡器。
接下来,本地DNS服务器去请求CDN的全局负载均衡器解析域名,全局负载均衡器会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:
- 根据用户IP地址,判断哪一台服务器距用户最近;
- 用户所处的运营商;
- 根据用户所请求的URL中携带的内容名称,判断哪一台服务器上有用户所需的内容;
- 查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。
基于以上这些条件,进行综合分析之后,全局负载均衡器会返回一台缓存服务器的IP地址。
本地DNS服务器缓存这个IP地址,然后将IP返回给客户端,客户端去访问这个边缘节点,下载资源。 缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。
缓存代理
缓存系统是 CDN的另一个关键组成部分,缓存系统会有选择地缓存那些最常用的那些资源
其中有两个衡量CDN服务质量的指标:
- 回源率:缓存里没有,必须用代理的方式回源站取,回源次数与所有访问次数之比
缓存系统也可以划分出层次,分成一级缓存节点和二级缓存节点。一级缓存配置高一些,直连源站,二级缓存配置低一些,直连用户
回源的时候二级缓存只找一级缓存,一级缓存没有才回源站,可以有效地减少真正的回源
- 命中率:用户访问的资源恰好在缓存系统里,可以直接返回给用户,命中次数与所有访问次数之比
现在的商业 CDN命中率都在 90% 以上,相当于把源站的服务能力放大了 10 倍以上
腾讯云cdn加速操作实战
以腾讯云为例说明如何部署cdn。
即使是再小的站,也要有一颗成长为大流量网站的雄心,正所谓“法乎其上,得乎其中”,网站流量要大,就需要有良好的体验,而打开速度快是用户体验最重要的指标(没有之一),现代人的耐性越来越差,如果1秒内还不能打开网站,很多人就直接离开了。
由于地域的限制,网络传输需要一定时间,对于小网站来说,不可能在各大节点部署服务器。此时,各大厂提供的cdn服务就派上用场了。我们可以将静态文件放到cdn上,用户访问网站时,cdn会智能分配最近的节点返回静态文件,减轻我们服务器压力的同时,也大大加快了网站响应速度。而且各大厂每月都有免费的cdn流量额度,个人网站基本够用了。
静态与动态内容用不同的域名区分
以网站zhiqiexing.com为例:
- 动态内容由主域名
www.zhiqiexing.com
提供, - 而静态内容为
code.zhiqiexing.com
提供 - 动态内容实时从服务器获取数据,静态内容就可以存放到cdn,实时更新即可
cdn配置
进入cdn控制台,按指引添加域名,提交后会分配一个cdn加速域名,必须将我们的域名用cname解析到分配的cdn域名,提交后部署大概五分钟即可
由于是不同的域名,可能会出现跨域问题,需要在cdn配置中将我们的域名加入到允许的列表
在缓存配置中可以设置缓存时间
需要手动刷新时,可以指定url进行刷新
参考文献
https://blog.csdn.net/weixin_44475093/article/details/117095143
https://blog.csdn.net/HZ___ZH/article/details/114660370
https://blog.csdn.net/weixin_44475093/article/details/117095143
https://blog.csdn.net/HZ___ZH/article/details/114660370
https://juejin.cn/post/6844903890706661389#heading-5
https://blog.csdn.net/lxx309707872/article/details/109078783
https://www.jianshu.com/p/ba104e941490
https://blog.csdn.net/aha_jasper/article/details/105575484
https://blog.csdn.net/weixin_44475093/article/details/117095143