与JavaWeb有关的故事(web请求与Java I/O) (2)

Tips:
win下使用nslookup,linux使用dig查询解析过程。 两个缓存地方LDS和本地机器,可用命令刷新,JVM也会缓存DNS结果,使用InetAddress时,注意使用单例模式,避免性能问题。

CDN工作机制

Content Delivery Network(内容分布网络)类似镜像+缓存+整体LB,通常缓存静态资源,用户主站取动态数据,CDN下载静态数据。目标:可扩展,安全性,可靠性。

CDN架构

与JavaWeb有关的故事(web请求与Java I/O)

看图说话,通过域名解析,通常会CNAME到CDN全局中的DNS负载均衡服务器,在通过这个GTM(广域网流量管理)分配到离用户最近的CDN节点。用户就可以到这个节点访问静态文件了。

负载均衡

负载均衡,分为链路LB(DNS解析成不同IP)、集群LB(分为硬件和软件,硬件贵,性能好,但不能动态扩容,如F5;软件LB,如LVS)、操作系统LB(软中断和硬件中断,如多队列网卡)。

CDN动态加速

总结为,通过CDN的DNS解析中通过动态的链路探测寻找回源最佳路径,然后通过DNS调度将所有请求调度到选定的路径上回源,加速用户访问效率

与JavaWeb有关的故事(web请求与Java I/O)

Java I/O的工作机制 Java I/O类库的基本架构

IO问题是人机交互的核心问题,是获取和交换信息的渠道,向来是应用系统的瓶颈,Java也在持续优化,如1.4版本引入了NIO。整个java.io包几十个类,有些概念不再详细介绍了(如字节流、字符流、io包继承结构),总体上看IO大体分为:

基于字节操作的io接口:InputStream和OutputStream

基于字符操作的io接口:Writer和Reader

基于磁盘操作的io接口:File

基于网络操作的io接口:Socket(也算是IO)

字节和字符的转化

首先,数据持久化或网络传输都是以字节进行的,这就涉及一个字符和字节转化的问题,其中最重要的就是字符集编码问题,否则很容易出现常见的乱码问题,字符解码类图如下:

与JavaWeb有关的故事(web请求与Java I/O)

其中InputStreamReader类是从字节到字符转化桥梁,过程中要指定字符集,否则使用操作系统默认。
补充个UML知识,上图中使用的是组合,是整体与部分的关系,代码实现就是成员变量,如下

与JavaWeb有关的故事(web请求与Java I/O)

UML参考

读的时候,字节流转化为字符,要解码(StreamDecoder),同样道理,写入是从字符到字节,需要编码(StreamEncoder)

磁盘IO工作机制 几种访问文件方式

访问文件,读取和写入是调用操作系统的IO接口,因为磁盘是由操作系统管理。而只要是系统调用就会存在内核空间和用户空间切换问题,这本身是操作系统保护本身运行安全的机制,这就会出现一个问题,内核空间和用户空间的数据复制,由于内核空间访问快,用户空间访问慢,所以,出现了缓存。这是基本原理,几种访问文件方式如下:

标准访问文件方式(实际上读写都是和内核空间缓存打交道,什么时候刷新到磁盘由操作系统决定)

直接IO方式(内核不缓存,直接和磁盘IO打交道,慢,通常结合异步IO提升性能)

同步访问文件(和标准访问类似,但是等缓存数据刷新到磁盘,才返回给应用)

异步访问方式(访问发出后,不阻塞,异步返回)

内存映射方式(把内核空间和磁盘文件关联,共享数据,减少数据复制操作)

Java访问磁盘文件

File对象是个虚拟的描述,解码类StreamDecoder、真正的文件描述类FileDescriptor,一图胜万言,如下,

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzfyg.html