深入分析JAVA_WEB技术内幕


第一章 深入WEB请求过程

1.1 B/S网络架构概述

不管网络架构如何变化,始终有一些固定的原则需要遵守.
1. 互联网上所有资源都要用一个独一无二的URL.
2. 必须基于HTTP与服务端交互.
3. 数据必须在浏览器中运行.

1.2 如何发起一个请求

发起一个HTTP请求和建立一个Socket连接区别不大.
1.根据地址栏输入的URL的域名DNS解析出IP地址.
2.根据这个IP地址和默认的80端口与远程服务器建立Socket连接.
3.浏览器根据URL组装一个get类型的HTTP请求,通过outputStream.write发送到目标服务器,服务器等待inputStream.read返回数据,断开连接.

1.3 HTTP解析

B/S网络架构的核心是HTTP.
常见的HTTP请求头
请求头 说明
Accept-Charset 用于指定客户端接受的字符集
Accept-Encoding 用于指定可接受的内容编码,如 Accept-Encoding:gzip.deflate
Accept-Language 用于指定一种自然语言,如 Accept-Language:zh-cn
Host 用于指定被请求资源的Internet主机和端口号,如 Host:wwww.taobao.com
User-Agent 客户端将它的操作系统,浏览器,和其他属性告诉服务器
Connection 当前连接是否继续保持,如 Connextion:Kepp-Alive
常见的HTTP响应头
请求头 说明
Server 使用的服务器名称,如 Server:Apache/1.3.6(Unix)
Content-Type 用来指明发送给接收者的实体正文的媒体类型,如 Content-Type:text/html;charset=GBK
Content-Encoding 与请求报头的Accept-Encoding对应,告诉浏览器服务端采用的是什么压缩编码
Content-Language 描述了资源所用的自然语言,与Accept-Language对应
Content-Length 指明实体正文的长度,用以字节方式存储的十进制数字来表示
Keep-Alive 保持连接时间,如 Keep-Alive:timeout=5,max=120
常见的HTTP状态码
请求头 说明
200 客户端请求成功
302 临时跳转,跳转的地址通过Location指定
400 客户端请求有语法错误,不能被服务器识别
403 客户端收到请求,但是拒绝提供服务
404 请求的资源不存在
500 服务器发送不可预期的错误

1.3.2 浏览器缓存机制

使用Ctrl + F5可以清除缓存的刷新页面,原理是通过在HTTP的请求头中增加一些请求头,这些请求头会告诉服务端要获取最新的数据而不是缓存.
Cache-Control/Pragma
这个HTTP Head字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令,不仅仅可以控制浏览器,还可以控制和HTTP相关的缓存或代理服务器.
Cache-Control字段的可选值
可选值 说明
Public 所有内容都被缓存,在响应头中设置
Private 内容只缓存到私有缓存中,在响应头中设置
no-cache 所有内容都不会被缓存,在请求头和响应头中设置
no-store 所有内容都不会被缓存到缓存或Internet临时文件中,在响应头中设置
must-revalidation/proxy-revalidation 如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证,在请求头中设置
max-age=xxx 缓存的内容将在xxx秒后失效,这个选项只在HTTP1.1中可用,和Last-Modified一起使用时优先级较高,在响应头中设置
  • Cache-Control请求字段被各个浏览器支持较好,且优先级较高,和其他请求字段(如Expires)同时出现时,它会覆盖其他字段.
  • Pragma字段的作用类似,最常用:Pragma:no-cache.
  • Expires常用格式Sat,25 Feb 2012 12:22:17 GMT,超过这个时间值,缓存的内容将失效.
  • Last-Modified字段表示一个服务器上的资源的最后修改时间.
  • Etag的作用是让服务端给每个页面分配一个唯一的编号,然后通过这个编号来区分这个页面是否是最新的.

1.4 DNS域名解析

  • 互联网都是通过URL来发布和请求资源的,而URL中的域名需要解析成IP地址才能与远程主机建立连接.

1.4.1 DNS域名解析过程

1.当用户在浏览器输入域名并按下回车后,浏览器会检查缓存中有没有改域名对应的街写过的的IP地址,若缓存中有,则解析过程结束.(浏览器缓存域名是有限制的,不仅大小有限制,域名被缓存的时间通过TTL属性来设置.通常情况下为几分钟到几小时)
2.若浏览器缓存中没有,浏览器会在操作系统中(hosts文件)查找是否有这个域名对应的DNS解析结果.
3.如果1,2步无法解析,操作系统会将这个域名发送给LDNS.也就是本区域的域名服务器.(电信等)这个专门的域名解析服务器性能都比较好,大约80%的域名解析都到这里就已经完成了,所以LDNS主要承担了域名的解析工作.
4.若LDNS没有解析成功,就直接到Root Server域名服务器请求解析.
5.根域名服务器返回本地域名服务器一个查询域的主域名服务器(gTLD Server)地址.gTLD是国际顶级域名服务器,如.com,.cn,.org等,全球只有13台左右.
6.本地域名服务器(Local DNS Server)再向上一步返回的gTLD服务器发送请求.
7.接受请求的gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器.
8.Name Server域名服务器会查询存储的域名和IP的映射关系表,在正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给DNS Server域名服务器.
9.返回该域名对应的IP和TTL值,Local DNS Server会缓存这个域名和IP的对应关系,缓存的时间由TTL值控制.
10.把缓存的结果返回给用户,用户根据TTL值缓存在本地系统中,域名解析过程结束.

1.4.3 清除缓存的域名

一般指清除本机缓存.
1.Windows执行ipconfig/flushdns命令刷新缓存.
2.Linux下通过/etc/init.d/nscd restart来清除缓存.
3.重启
4.Java应用中JVM也会缓存DNS的解析结果,在InetAdress类中完成.
清除缓存时,修改%JAVA_HOME%\lib\security\java.security配置文件.
另外,使用InetAddress类解析域名时,必须是单例模式.不然,每次创建InetAdress实例,都需要进行一次完整的域名解析,过于耗时.

1.4.4 几种域名解析方式

域名解析记录主要分为A记录,MX记录,CNAME记录,NS记录和TXT记录.
A记录
A代表Adress,用于指定域名对应的IP地址,如将wwww.baidu.com指定到115.238.23.XXX.
A记录可以将多个域名解析到同一个IP地址,但不能讲一个域名解析到多个IP地址.
MX记录
MX表示的是Mail Exchange.可以将某个域名下的邮件服务器指向自己的Mail Server,
如如果你设置A记录是指向123.12.123.123,而MX记录你设置是指向222.22.222.222,那么你的DNS服务器接收到别人的邮件路由请求时就将会将它的请求解释到222.22.222.222上去!而别人访问你的网页的时候仍然是访问123.12.123.123.
CNAME记录
全称是Canonical Name(别名解析).它可以将你注册的不同域名统统转到一个主域名上去!
与A记录不同的是,CNAME别名记录设置的可以是一个域名的描述而不一定是IP地址.
NS记录
为某个域名指定DNS解析服务器,也就是该域名有指定的IP地址的DNS服务器去解析.
TXT记录
为某个主机名或域名设置说明,如可以为baidu.com设置TXT记录为"百度一下,你就知道".
URL转发
URL转发可以转发到某一个目录下,甚至某一个文件上.
而CNAME是不可以,这就是URL转发和CNAME的主要区别所在.

1.5 CDN工作机制

CDN = 镜像(Mirror) + 缓存(Cache) + 整体负载均衡(GSLB)

1.5.2 负载均衡

1. 链路负载均衡
    通过DNS Service解析成不同的IP,然后用户根据这个IP去访问不同的目标服务器.
2. 集群负载均衡
    2.1 硬件负载均衡
    2.2 软件负载均衡
3. 操作系统负载均衡

第二章 深入分析Java I/O的工作机制

Java的I/O类库的基本架构

  • 基于字节操作的I/O接口:InputStream和OutputStream
  • 基于字符操作的I/O接口:Writer和Reader

  • 基于磁盘操作的I/O接口:File

  • 基于网络操作的I/O接口:Socket

    前两组主要是传输数据的数据格式,后两组主要是传输数据的方式.
    不管是磁盘还是网络传输.最小的存储单元都是字节.

2.1.1 基于字节的I/O操作接口

1.操作数据的方式可以组合使用
OutputStream out = new BufferedOutputStream(new ObjectOutputStream(new FileoutStream("fileName")));
2.必须指定流最终写到什么地方,要么写到磁盘,要么写到网络中.

2.1.2 基于字符的I/O操作接口

1.不管是Writer还是Reader类,它们都只定义了读取或写入的数据方式的方式,但是并没有规定数据要写到哪里.
2.字符-->字节 编码
  字节-->字符 解码

2.2 磁盘I/O工作机制

1.操作系统为了加速I/O访问,在内核空间使用缓存机制.

2.2.1 几种访问文件的方式

1.标准访问文件的方式
read():操作系统先检查在内核的高速缓存中有木有需要的数据,若没有,则从磁盘中读取,然后缓存在操作系统的缓存中.
writer():将数据从用户地址复制到内核空间的缓存中.什么时候写到磁盘中由操作系统决定,除非显式地调用了sync同步命令.

2.直接I/O的方式
应用程序直接访问磁盘数据,而不经过操作系统内核数据缓存区,可以减少一次从内核缓存区到用户程序缓存的数据复制.

3.同步访问文件的方式
数据的读取和写入是同步操作的.

4.异步访问文件的方式
当访问数据的线程发出请求后,线程会接着去处理其他事情,而不是阻塞等待,当等待的数据返回后继续处理下面的操作.

5.内存映射的方式
操作系统将内存中的某一块区域与磁盘中的文件关联起来.目的是减少数据从内核空间缓存到用户空间的数据复制操作.

2.2.3 Java序列化技术

将一个对象转化成一串二进制表示的字节数组,通过保存或转移这些字节数据来达成持久化的目的.

2.3.3 Java Socket的工作机制

Socket描述计算机之间完成相互通信的一种抽象对象.
建立Socket连接必须由底层TCP/IP来建立连接.
建立TCP连接需要底层IP来寻址网络中的主机.
同时,通过TCP或UDP的地址也就是端口号来指定通信的应用程序.

2.3.5 数据传输

当连接建立成功,服务端和客户端都有一个Socket实例.每个Socket都有一个InputStream和OutputStream,并通过两个对象交换数据.同时,网络I/O都是以字节流传输的,在创建Socket时,操作系统会为InputStream和OutputStream分配一定大小的缓存区.此时,就有可能会发生阻塞.另外,在两边同时传送数据可能会产生死锁,可以通过NIO来避免这种情况.
BIO:阻塞IO

2.4 NIO的工作机制

三大概念
1:Selector:调度器
2.Channel:通信信道
3.Buffer:缓冲器

2.5 I/O调优

2.5.1 磁盘I/O优化

1.增加缓存,减少磁盘访问次数
2.优化磁盘管理系统
3.设计合理的磁盘存储数据块,比如索引
4.合理的RAID策略

2.5.2 TCP网络参数优化

2.5.3 网络I/O优化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容