浅谈cdn

在学习webpack打包的时候,深度接触了cdn这个服务概念,原因是本地开发环境中使用npm包比较方便,而在生产环境中则尽量把包引入的方式替换成cdn。这样可以增加用户在实际使用中的体验。

在前端项目开发中,在难免会对一些比较常用的包进行调用,例如bootstrap, axios, lodash等, 在一开始的学习中,就是在script标签中添加一段url,这样在写js代码的时候就可以通过这个库暴露出来的全局变量名来引用。但一直这样使用却没有思考过到底什么是cdn.

cdn全称是Content Delivery Network, 字面上讲就是一种提供内容传输的服务, 为什么需要它呢,一个项目上线,会包含很多静态资源,如果项目的服务器在澳大利亚,而访问者在中国,用户拿数据的时候总会从澳大利亚的服务器上拿数据,这样会很影响用户体验,但如果有一种方式,能将静态资源数据放到离用户比较近的地方,那么用户体验就大大提升,而cdn服务就是解决这一问题, cdn厂商会在各个地区架设cdn服务器,并设立一个总资源服务器,开发者将静态资源上传到总资源服务器上,当用户在北京访问资源的时候,用户就会在离它最近的cdn服务器上拿到资源,而不需要从澳大利亚的服务器上拿,如果最近的cdn服务器上没有资源,那么cdn服务器会去总服务器上拉取对应的资源信息,从而存储到自己的服务器上,这样也最大化的解决了空间里利用率问题,因为如果在资源上传后,每个cdn服务器上都同步数据,倘若美国的用户从来不访问这些静态资源,那么部署在美国的cdn服务器则会白白浪费这些空间,如果美国用户需要访问,那么美国cdn的服务器再去总机房获取就行了。那么还有一个问题,所有用户最终拿到的部署在cdn服务上的url都是一样的,在请求这些资源的时候,怎么就能从离自己最近的cdn服务器拿到数据呢?所以就需要dns服务器来做中间层进行分发。

例如我们操作系统默认使用的dns服务器可能是1.1.1.1公共递归服务器,当浏览器第一次访问一个域名的时候,如果本地没有缓存,那么就会去离自己最近的1.1.1.1这个dns递归服务器上拿,如果服务器上没有缓存,这个dns递归服务器会去对应的根服务器获取,根服务器返回顶级服务器ip地址,之后再去顶级服务器查询,比如.com顶级dns服务器,顶级dns服务器则会查询内部记录,告诉递归服务器这个域名的权威dns服务器的ip地址(并没有直接储存域名对应的ip地址),递归拿到url对应的权威dns服务器ip地址(这些权威服务器通常是域名商架设的,里面储存了用户从域名商这里注册的域名信息),从而从权威服务器拿到域名对应的ip地址,这时回到cdn加速服务,cdn服务商一般也有自己的权威服务器, 当收到来自递归dns服务器上的查询,cdn服务商的权威服务器会判断dns服务器的ip地址,返回一个离这个dns服务器物理上最近的cdn服务器的ip地址,这样递归服务器拿到这个ip地址,把ip地址返回给用户,最终用户拿到的也是离自己最近的cdn服务器的ip地址,从而实现了cdn加速(我简化了这个过程,实际步骤要复杂许多,因为通过单纯的dns服务器的ip来判断并不能最大化的进行cdn加速,dns服务器的覆盖率可能没有cdn的服务器覆盖率广,例如在中国,新疆和海南的用户访问1.1.1.1最终使用的cdn服务器是同一个,所以用到了ECS技术,可以写到用户的实际网段信息,来更加精确的定位用户的实际位置)。

文章列表

技术:

生活: