LearnJava
  • Summary
    • Introduction
    • MyResume
  • 开发
    • 小程序
      • 小程序开发问题总结
      • 小程序bug
    • 环境搭建
      • Linux搭建git服务器
      • Linux切换JDK版本
      • Mac搭建http服务器
      • Ubuntu搭建C++开发环境
      • ProtoBuffer安装
      • Ubuntu开启Telnet
      • Linux搭建邮件服务器
    • 遇到的问题
      • Mac下eclipse问题
      • Mac下Github问题
      • Markdown解决方案实例
      • Spring问题
  • 编程语言
    • C++
      • C&C++框架汇总
      • C++Primer课后习题记录
      • C++疑问
      • C++与java的异同
      • C++内存模型
      • C++知识点
      • Make和Cmake
    • GO
      • Go语言简介
      • Go语言知识点
    • XML
      • XML知识点
  • 技术学习
    • JavaIO
      • AIO通信
      • IO和NIO
      • 阻塞式IO通信
      • 非阻塞式IO通信
    • 计算机网络
      • CDN
      • HTTPS协议入门
      • HTTP_POST请求的数据格式
      • HTTP错误码和出现场景
      • HTTP协议入门
      • TCP/IP协议入门
      • Wireshark抓包
      • 域名解析过程
    • 计算机原理
      • 整型计算
      • GPU
      • Swap内存
    • 架构学习
      • 分布式锁
      • 分布式系统的CAP理论
      • IaaS,PaaS,SaaS的区别
      • Web框架
      • 康威定律
      • 秒杀系统设计
      • 数据异构
      • 微服务架构入门
      • 协程
      • MQ推拉模式对比
      • UML图
      • 缓存穿透击穿和雪崩
    • 前端学习
      • 安装使用VUE
      • 搭建VUE项目
    • 大数据
      • Hadoop之HBASE
      • Hadoop之HDFS
      • Hadoop之MapReduce
      • Hadoop简介
    • 数据结构
      • 二叉树
      • 图
      • 跳表
      • Bitmap
    • 算法
      • 排序算法
        • 插入排序
        • 归并排序
        • 计数排序
        • 快速排序
        • 冒泡排序
        • 选择排序
      • Hash算法
      • MD5介绍
      • 一致性Hash算法
      • 数字全排列
      • MD5介绍
      • 储水量
      • 最大子序列
    • Java多线程
      • AQS原理
      • AtomicInteger原理
      • Condition
      • Fork/Join框架
      • happens-before
      • Java锁优化
      • Java线程池
      • Java中的阻塞队列
      • Java实现线程的三种方式
      • Lock
      • Lock的种类
      • ThreadLocal
      • 线程状态及其转换
    • Java设计模式
      • Builder模式
      • 代理模式
      • 工厂和抽象工厂模式
      • 观察者模式
      • 设计模式概述
      • 职责链模式
      • 装饰者模式
      • Java实现单例的5种方式
    • Java学习
      • Java拓展学习
        • JavaSPI
      • Java序列化
      • Java异常
      • Java注解
      • 学习UML图
      • Java的Lambda表达式
      • Java集合之ArrayList
      • Java集合之HashMap
      • Java集合之LinkedList
      • List⤅&Set的操作和遍历
      • JavaP反编译命令
      • Servlet学习
    • JVM学习
      • 分层编译
      • Java进程内存占用
      • JVM参数
      • JVM常用工具
      • JVM的内存模型
      • 垃圾回收机制
      • 看懂gc日志
      • 类加载机制和双亲委派模型
      • 类的反射
      • 自己动手编译OPENJDK
      • ASM字节码增强技术
      • CodeCache
      • GC耗时案例
      • JVM性能调优
    • Linux学习
      • gdb调试定位
      • Linux常用命令
      • Linux工具
      • Linux进程通信的方式
      • Linux文件系统结构
      • Linux系统知识点
      • Linux小技巧
      • Shell学习
      • Vim常用命令
    • Java设计模式
      • 设计模式概述
      • 代理模式
      • 装饰者模式
    • Mysql
      • InnoDB介绍
      • Mac_mysql问题
      • mysql之group_concat函数
      • mysql事务
      • Mysql优化
      • Mysql实用命令
      • mysql慢查询
      • mysql文件
      • mysql视图
      • mysql锁
      • mysql索引
      • mysql约束
      • 存储过程和触发器
      • mysql常用语法
    • Spring
      • SpringCloud
        • 搭建Jenkins自动部署
        • SpringCloud介绍
        • SpringCloudBus
        • SpringCloudConfig
        • SpringCloudEureka
        • SpringCloudFeign
        • SpringCloudHystrix
        • SpringCloudRibbon
        • SpringCloudSleuth
        • SpringCloudStream
        • SpringCloudZuul
      • FactoryBean理解
      • MyBatis入门介绍
      • rose框架学习
      • SpringMVC的启动流程
      • SpringBean的生命周期
      • SpringBoot入门
      • Spring入门AOP和IOC
      • SpringMVC入门笔记
      • SpringMVC集成Log4j2
      • web.xml详解
    • web中间件学习
      • Redis
        • Redis入门
        • Redis持久化
        • Redis的数据类型
        • Redis特性
      • Gremlin入门
      • Elasticsearch安装使用
      • HugeGraph入门
      • jetty介绍
      • Kafka介绍使用
      • Maven安装配置
      • Netty介绍使用
      • Netty的编解码
      • Maven的pom介绍
      • Nginx介绍
      • Nginx配置详解
      • ProtocolBuffers学习笔记
      • Resin学习
      • RESTful入门
      • RocketMQ入门
      • RPC入门
      • Thrift介绍
      • Tomcat常用配置
      • Tomcat学习
      • Tomcat实现
      • zookeeper入门
      • Zookerper选举原理
  • 文档读后感
    • 除了写代码你还会干什么
  • 效率提升
    • Java诊断工具Arthas
    • Mac下安装多版本java
    • Mac下显示git分支
    • Mac中Clion快捷键
    • Mac中Eclipse快捷键
    • MacShell常用快捷键
    • PlantUML入门
    • Windows与Linux服务器传文件
    • Sublime技巧
    • 搜索引擎检索技巧
  • 总结
    • 2017工作总结
Powered by GitBook
On this page
  • 一、简介
  • 二、CDN架构
  • 三、负载均衡
  • 四、CDN动态加速
  • 疑问

Was this helpful?

  1. 技术学习
  2. 计算机网络

CDN

一、简介

CDN中文就是内容分发网络(Content Delivery Network)。其目的是在现有的网络中增加一层网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。有别于镜像,它比镜像更加智能,可以理解为:CDN=镜像(Mirror)+缓存(Cache)+整体负载均衡(GSLB)。

目前CDN都以缓存网站中的静态数据为主,如CSS、JS、图片和静态页面等数据。用户从主站服务器中请求到动态内容后,再从CDN上下载静态数据,从而加速网页数据内容的下载速度。

二、CDN架构

通常来说CDN要达到以下几个目标:

  • 可拓展性:性能可扩展性,应对新增的大量数据、用户和事务的拓展能力。成本可扩展性,用低廉的运营成本提供动态的服务能力和高质量的内容分发;

  • 安全性:强调提供物理设备、网络、软件、数据和服务过程的安全性,减少因为DDos攻击或者其他恶意行为;

  • 可靠性、响应和执行:服务可用性指能够处理可能的故障和用户体验下降的问题,通过负载均衡及时提供网络的容错机制。

访问拥有CDN的网站的静态资源流程:

一个用户访问某个静态文件,如CSS文件,首先向Local DNS服务器发起请求,一般经过迭代解析后回到这个域名的注册服务器去解析,这个域名最终会被指向CDN全局中的DNS负载均衡器,再由这个GTM来最终分配是哪个地方的访问用户,返回给离这个用户最近的CDN节点。用户拿到DNS解析结果就直接去这个CDN节点访问这个静态文件了。如果这个文件不存在,会回到源站去获取这个文件,并且CDN会本节点上缓存一份,方便下次用户来访问。

三、负载均衡

负载均衡就是将大量的请求通过一定的策略分摊到不同的服务节点。他可以提高服务器的影响速度及利用效率,避免软件或者硬件模块出现单点失效,解决网络拥塞问题,实现地理位置无关性,为用户提供较一致的访问质量。

通常有三种负载均衡架构:链路负载均衡、集群负载均衡和操作系统负载均衡。

  • 链路负载均衡:就是前面提到的CDN架构通过DNS解析成不同的IP,然后用保护根据这个IP来访问不同的目标服务器,链路负载均衡是由DNS的解析来完成的。

  • 集群负载均衡:一般分为硬件负载均衡和软件负载均衡。硬件负载均衡一般使用一台专门的硬件设备来转发请求,关键就是这台昂贵的设备,如F5,通常为了安全 需要一主一备,它的优点就是性能非常好,缺点就是非常贵,一般公司用不起,还有就是不支持动态扩容。软件负载均衡比较普遍,特点就是成本低,直接使用廉价的PC就可以搭建,缺点就是一般一次访问请求要经过多次代理服务器,会增加网络延时。

  • 操作系统负载均衡:利用操作系统级别的软件中断或者硬件中断来达到负载均衡,如可以设置多队列网卡等来实现。

四、CDN动态加速

CDN动态加速技术是当前比较流行的一种优化技术,它的技术原理是在CDN的DNS解析中通过动态的链路探测来寻找回源最好的一条路径,然后通过DNS的调度将所有请求调度到选定的这条路径上回源,从而加快用户访问的效率。

由于CDN节点是遍布全国的,所以用户接入一个CDN节点后,可以选择一条从离用户最近的CDN节点到源站链路最好的路径让用户走。判断最好的路径不一定把耗时当做唯一标准,有时也要考虑网络成本,还有其他网络链路的安全等因素也要综合考虑。

疑问

  1. 如果源站有静态文件更新,如何同步CDN节点?有什么策略?

  2. 主动刷新缓存:源站更新后主动刷新CDN缓存;

  3. 静态资源重命名:编译静态文件的时候文件名带上时间戳或者序列号,一旦更新,由于文件名不一样,那么CDN就会去源站拉取最新文件;

  4. 缓存时间:源站控制CDN的缓存时间,过期资源强制从源站重新拉取;

  5. 更改URL:设置CDN在缓存的时候,不忽略参数, 即,缓存的key为完整的URI,如果想要访问到最新的资源,可以通过在请求URI后面带上不同的参数,然后请求到CDN节点的时候会直接回源,拉取到最新的资源。

参考:

《深入分析Java Web技术内幕》

Previous计算机网络NextHTTPS协议入门

Last updated 4 years ago

Was this helpful?

CDN 如何保证数据节点的更新和同步?:

https://www.zhihu.com/question/39147728