《深入分析Java Web技术内幕》学习(一)

来源:互联网 发布:网络大电影编号 编辑:程序博客网 时间:2024/05/28 23:11

写在开始

  大学生一枚,一开始是因为在学习Java Web开发,为了提升自己选择了这本书来看,因为基础较为薄弱,看了一章发现自己不了解的东西,每一个不懂的名词都需要慢慢百度,所以写下这些学习记录,为了加深理解,同时也给自己一个目标,争取在一个半月内读完并读懂这本书。(额……..快到一个半月了,发现这本书可以扩展的地方很多,这个flag立的有点僵硬)


本章概览

  这一章讲了Web请求的过程,大概就是在用户输入网址并回车到服务器返回内容的这一段过程。对应的就是B/S网络架构,Http定义其中的请求头,发起一个请求,通过DNS解析域名,请求目标服务器返回数据,最后通过CDN服务器返回数据到用户。


B/S网络架构概述

  B/S网络架构有两方面的好处:
- 客户端采用统一的浏览器,不需要特殊配置,用户使用简便。
- 服务器基于统一的http协议,为服务提供商简化开发模式,节省成本。

目前的B/S网络架构大都采用如下图说是的架构设计
B/S网络架构 -w150

如何通过Http发起一个请求

  这里指的不是简单的在浏览器输入url然后回车,这个Http请求就发起了,而是自己模拟浏览器组装一个Http请求,搞懂它由什么部分组成。
  本书中提到一句话,发起一个Http请求的过程就是建立一个Socket通信的过程
  首先通过url域名DNS解析出ip地址,再根据这个IP地址和默认80端口与远程服务器建立Socket连接,然后根据这个url组装成一个get类型的http请求头,通过outputStream.write发送到目标服务器,服务器等待inputStream.read返回数据,最后断开连接。
  当然,我们也不用一点一点靠自己写,书中介绍了Java中有一个开源工具包HttpClient可以通过程序处理Http请求,但是OkHttp成了时下最火的HTTP框架(我没用过,但是之前写了一个抓取教务网站课程表的Demo,了解到它相比HttpClient更加专注于性能以及易用性)。
  
官网描述:

  OkHttp是一款优秀的HTTP框架,它支持get请求和post请求,支持基于Http的文件上传和下载,支持加载图片,支持下载文件透明的GZIP压缩,支持响应缓存避免重复的网络请求,支持使用连接池来降低响应延迟问题。

 
 我就贴一段简单的get url的代码(最后str打印的是www.baidu.com的HTML代码)

import java.io.IOException;import okhttp3.OkHttpClient;import okhttp3.Request;public class HttpTest {    public static void main(String[] args){        String URL = "https://www.baidu.com";        OkHttpClient client = new OkHttpClient();        okhttp3.Response response;        Request request;        try {            request = new Request.Builder()                      .url(URL)                      .build();            response = client.newCall(request).execute();            String str = response.body().string();            System.out.println(str);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

 具体使用方式也可以在OkHttp官网以及OkHttp GitHub中查看。


Http协议解析

  掌握Http协议对一个从事互联网工作的程序员来说非常重要。
  而要理解Http协议,最重要的就是要熟悉Http协议中的Http Header,Http Header控制着用户浏览器的渲染行为和服务器的执行逻辑。我们有时会看到404页面,就是因为用户请求的资源不存在。
  书中也展示了一些常见的Http请求头、响应头、状态码。
  Http请求头
  Http响应头
  Http状态码
  

  如何查看当前请求的详细Http协议信息呢,作者给了一些建议。

浏览器 工具 Firefox Firebug Chrome Google自带工具 IE 7.0+ F12打开自带开发工具 鄙人推荐 HttpWatch

浏览器缓存机制

  浏览器缓存是一个比较复杂但是又比较重要的机制,在我们浏览一个页面发现有异常时,就会考虑到缓存,所以需要Ctrl+F5组合键重新请求页面。而这个过程我们请求到的是最新的页面,是因为在Http请求头添加了两个请求项Pragma:no-cache和 Cache-Control:no-cache。
  其所属的Http head字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令,如果知道该页面是否为缓存,不仅可以控制浏览器,还可以控制和HTTP协议相关的缓存或代理服务器。HTTP Head 字段有一些可选值,如下:
  HTTP Head 字段的可选值
  
  还有Expires(有效期),通用格式为Expires: Sat, 25 Feb 2012 12:22:17 GMT,后面跟着一个日期和时间,如果超过这个时间,缓存的内容就会失效。
  Last-Modifird/Etag表示一个服务器上资源的最后修改时间,可以是静态或者动态,通过这个时间也可以判断资源是否为最新。
  


DNS域名解析

DNS域名解析

  DNS解析大致的过程就是:
1. 输入Url
2. 检查浏览器缓存(缓存大小与时间都有限制)有没有对应解析过的IP,没有;
3. 检查操作系统缓存中有没有指定ip(Windows中可以通过C:\Windows\System32\drivers\etc\hosts来设置,早期容易导致域名被劫持),没有;
4. 配置好DNS服务器地址,发送该域名到本地域名服务器,进行解析,没有;
5. 本地域名服务器向上发送请求到gTLD服务器(通用顶级域名服务器);
6. 接受请求的gTLD服务器查找并返回此域名对应的Name Server(指的是申请域名时的域名服务提供商);
7. Name Server查询存储域名对应得IP,连同一个TTL值(时间限制)返回给域名服务器;
8. 本地域名服务器缓存该域名并且缓存时间由TTL值控制;
9. 将解析结果返回用户,并根据TTL值缓存在本地系统缓存,结束。

  当然本机缓存我们也可以通过ipconfig /flushdns(Windows)、/etc/init.d/nscd restart(Linux)来清除缓存。


CDN工作机制

  CDN,内容分布网络(Content Delivery Network),尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。(这是我从知乎找到的更容易理解的解释)
  CDN都以缓存网站中的静态数据为主,如CSS、JS、图片和静态页面等数据。用户在主站服务器请求到动态内容后再从CDN上下载静态数据,从而加速网页数据内加载。
  
  通常CDN架构如图所示
  这其实就是和之前域名解析联合起来的整个用户发起web请求的过程。
  CDN架构
  


负载均衡

  负载均衡(Load Balance)是一种服务器或网络设备的集群技术。负载均衡将特定的业务(网络服务、网络流量等)分担给多个服务器或网络设备,从而提高了业务处理能力,保证了业务的高可用性。负载均衡基本概念有:实服务、实服务组、虚服务、调度算法、持续性等,书中也提到了三种常用负载均衡架构,分别是链路负载均衡集群负载均衡操作系统负载均衡
  链路负载均衡也就是之前提到的通过DNS解析成不同的IP,然后用户根据这个IP来访问不同的目标服务器。集群负载均衡是另外一种常见的负载均衡方式,一般分为硬件负载均衡和软件负载均衡。硬件负载均衡的关键在于一台非常昂贵的设备(名为F5),性能好但非常贵,且当访问量陡然增大超出极限,无法动态扩容。软件负载均衡是最普遍的一种方式,成本低容易搭建,缺点也很明显,一般一次访问请求要经过多次代理服务器,增加网络延时。最后一种就是操作系统负载均衡,利用操作系统级别的软中断或硬件中断来达到负载均衡。


总结

  其实说起来也没有什么好总结的,整个发起web请求到返回内容的过程本章讲得很详细了,只要搞懂上一个图中每个服务器的作用,将他们的功能串起来就能理解本章所有的内容。

原创粉丝点击