JavaWeb技术内幕一:深入web请求过程

本文涉及的产品
云解析 DNS,旗舰版 1个月
传统型负载均衡 CLB,每月750个小时 15LCU
全局流量管理 GTM,标准版 1个月
简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/81409257 这位大侠,这是我的公众号:程序员江湖。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a724888/article/details/81409257

微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。(关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)

深入web请求过程

Web2.0时代到来,互联网架构从C/S升级到B/S架构

B/S架构的好处主要有两方面:

一是客户端统一采用浏览器,非常简单易用。

二是服务端基于统一的HTTP,与传统C/S架构采用自定义协议的方式不同,基于HTTP更加方便,降低成本。

B/S网络架构概述

前后端基于http协议进行交互,一次请求以后就可以断开,保证请求是无状态的,因为这样可以为更多用户同时提供服务,也不必担心状态存储的问题。

基本访问过程

1 用户在浏览器输入www.taobao.com这个url

2 它会请求DNS把这个域名解析成ip地址

3 然后根据这个IP找到对应主机,发送get请求。

4 服务器可能有多台,会进行负载均衡

5 数据可能存在缓存里,也可能是在数据库

6 当数据返回给浏览器时,解析数据可能发现还有一些静态资源,比如css和js,此时可能会再次发起http请求去CDN中请求这些数据,因为比起直接从服务器获取,从CDN访问静态资源要快得多。

不变应万变

1 URL是统一资源定位符。http服务通过url定位资源。

2 必须基于http协议进行前后端交互。

3 数据必须展示在浏览器,浏览器才知道怎么渲染页面。

如何发起一个请求

我们平时点一下链接其实就发起了一个请求了,但是这是浏览器帮你封装好的请求,实际上到底是怎么回事呢。如何不借助浏览器来发送http请求呢。

1 发起一个HTTP请求需要先建立socket连接。

只不过要求输入流和输出流的二进制数据格式要符合HTTP协议。

2 浏览器在建立socket连接之前,先用把url通过dns解析出ip地址,然后根据ip地址和默认的80端口建立起socket连接。

3 然后根据这个url(http请求头里有url,没有ip)组装成一个get类型的HTTP请求头(get请求没有请求体),然后通过输出流发送到目标服务器。浏览器收到输入流的读取结果后,就会断开连接。

4 不同浏览器对于这个socket连接有不同的处理方式。既然浏览器可以发送http请求,那么不通过浏览器是否也能自己实现http请求发送呢。

5 因为http请求本质上就是socket通信,所以我们基于socket进行请求发送,比如使用HttpClient,在Java环境中实现HTTP请求发送,它封装了实现细节。实际上我们也可以自己拼装http请求,只不过比较麻烦,而且要求你对HTTP协议非常熟悉。

6 除了HttpClient, Linux的curl命令也可以简单地发起HTTP请求。

HTTP解析

B/S架构的核心是HTTP,关键就在于理解HTTP协议。
其中最重要的就是HTTP header。
HTTP header控制着所有请求的传输,控制着用户浏览器的执行逻辑。比如渲染,状态码,缓存等等。

常见http请求头主要有

1 accept-encoding:接收编码内容
2 host:一般是url
3 connection:keep-alive保持连接,默认自动断开

常见响应头

1 server:服务器名称
2 content-type:实体正文的类型,比如text/html json等。
3 content-length:实体长度
4 keep-alive:保持连接的时间

常见状态码

1 200 请求成功
2 302 临时跳转
3 400 请求语法错误
4 403 服务器拒绝提供服务(可能是权限问题)
5 404 请求资源不存在
6 500 服务器内部错误

查看HTTP信息的工具

使用一些浏览器插件可以很好地查看请求内容和响应内容,比如firebug,自带调试工具等。

浏览器缓存机制

浏览器缓存是一个比较复杂的机制,在很多地方都可以做缓存。

1 首先在浏览器端,如果使用ctrl+f5刷新,则浏览器会直接发送请求,不会访问缓存。

2 其次,在应用服务器端,也可能会有缓存服务器,用户请求会先访问缓存服务器,所以为了不访问缓存,我们必须在http请求上做手脚。

3 使用ctrl+f5的组合键,实际上是组装了一个特别的http请求,其中请求头会增加两个字段,一个是pragma:no-cache,一个是cache-control:no-cahce。

4 cache-control/pragma字段要求整个http请求过程必须服从该指令,从而可以控制浏览器甚至服务端的缓存使用。

5 HTTP header有一些可选值,比如public,会让所有内容被缓存,是响应头的字段。
no-cache要求所有内容都不缓存,可以在请求头和响应头中设置。

6 cache-control的优先级很高,和expire这类字段同时出现时,会覆盖他们。pragma和这个类似。

7 expire表示缓存的过期时间,但是会被上述字段覆盖。

last-modified字段用于表示资源的最后修改时间,可以通过它来判断当前资源是否是最新的。这字段是响应头携带的,下次再请求该页面时,请求体会携带该字段,以便让服务器判断是否更新了这个资源,如果没有更新直接返回304即可,表示资源已是最新。

DNS域名解析

DNS解析过程

输入www.abc.com

1 浏览器检查缓存中是否有解析过该url,有的话结束解析。(可以设置缓存时间)

2 如果浏览器没有,则让操作系统在本地缓存中查找,这个过程是查找hosts文件。如果有的话,则直接返回即可。

有的黑客利用这个特点修改你的hosts文件来劫持域名。

3 如果在本机无法解析,则需要求助DNS服务器,本地局域网内一般会有一个DNS服务器,不会很远。

这个本地dns服务器也叫ldns,同样会缓存解析结果,可以处理80%的域名解析。

4 如果ldns没有命中,则需要到root server请求解析了。

5 rootserver是最高级的域名服务器,它会返回给我们一个主域名服务器的地址,主域名服务器一半对应.com,.cn,.org等。全球只有13台左右。

6 ldns请求主域名服务器解析域名

7 主域名服务器返回一个name server域名服务器,该服务器通常就是我们注册的域名服务器,比如我们注册了sina的微博,有一个带有sina的域名,这个域名解析就由sina域名提供商进行解析。

8 nameserver解析出url和ip的映射关系,然后返回ip和过期时间ttl。

9 ldns得到url和ip以后,会缓存这个解析结果,缓存时间就是
ttl。

10 把解析的结果返回给用户,缓存在本地系统中。

跟踪域名解析过程

linux和Windows都可以用nslookup来查询域名解析的结果

linux还可以用dig来查询dns的解析过程

清除缓存的域名

1 LDNS的缓存我们没办法请求,但是可以清除本机的缓存

2 Windows可以使用ipconfig/flushdns来刷新缓存

linux可以通过nscd restart来清除缓存

3 事实上JVM也会缓存DNS解析结果,是在InetAddress类中完成的。

这里要强调一点,如果要用InetAddress解析域名,必须使用单例模式,否则每次都会重新创建实例并且重新解析,非常耗时。

几种域名解析方式

域名解析主要分为A记录,MX记录,CNAME记录以及NS记录和TXT记录等。

1 A记录用来之定义域名对应的ip地址,可把多个域名解析到一个ip,但是不能把一个域名解析到多个ip

2 MX记录用于邮件服务器,略

3 CNAME记录全称是别名解析,可以把一个域名解析成多个别名,比如www.taobao.com别名设置为www.hellotb.com。

4 NS记录,为某个域名指定DNS服务器

5 TXT记录,为某个主机名或者域名设置说明,比如h2p.com设置TXT位“黄蓬龙的博客”

CDN工作机制

CDN就是内容分布网络,是一种先进的流量分布网络,为用户提供最近距离节点的快速响应服务。有别于镜像,CDN可以说是镜像+缓存+整体负载均衡的结合物。

CDN目前主要用于缓存静态数据为主,比如CSS,JS,图片等资源。http请求先响应动态结果,再来访问这些静态资源,速度飞快。

CDN架构

由于DNS请求最终会落到域名对应的服务器上,比如taobao.com最终会落在淘宝的dns服务器上,此时淘宝dns会cname解析到另外一个域名,一般会指向CDN的DNS负载均衡服务器,由该dns决定访问哪一个CDN节点,一般是离用户最近的。

负载均衡

负载均衡可以避免单点失效。解决网络拥堵。通常有三种负载均衡架构。同时一般分为软件负载均衡和硬件负载均衡。

1 链路负载均衡

2 集群负载均衡

3 操作系统负载均衡

CDN动态加速

相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
20天前
|
前端开发 JavaScript 搜索推荐
HTML与CSS在Web组件化中的核心作用及前端技术趋势
本文探讨了HTML与CSS在Web组件化中的核心作用及前端技术趋势。从结构定义、语义化到样式封装与布局控制,两者不仅提升了代码复用率和可维护性,还通过响应式设计、动态样式等技术增强了用户体验。面对兼容性、代码复杂度等挑战,文章提出了相应的解决策略,强调了持续创新的重要性,旨在构建高效、灵活的Web应用。
29 6
|
27天前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
40 3
|
1月前
|
SQL 负载均衡 安全
安全至上:Web应用防火墙技术深度剖析与实战
【10月更文挑战第29天】在数字化时代,Web应用防火墙(WAF)成为保护Web应用免受攻击的关键技术。本文深入解析WAF的工作原理和核心组件,如Envoy和Coraza,并提供实战指南,涵盖动态加载规则、集成威胁情报、高可用性配置等内容,帮助开发者和安全专家构建更安全的Web环境。
60 1
|
1月前
|
负载均衡 监控 算法
论负载均衡技术在Web系统中的应用
【11月更文挑战第4天】在当今高并发的互联网环境中,负载均衡技术已经成为提升Web系统性能不可或缺的一环。通过有效地将请求分发到多个服务器上,负载均衡不仅能够提高系统的响应速度和处理能力,还能增强系统的可扩展性和稳定性。本文将结合我参与的一个实际软件项目,从项目概述、负载均衡算法原理以及实际应用三个方面,深入探讨负载均衡技术在Web系统中的应用。
69 2
|
27天前
|
缓存 安全 前端开发
构建高效Web应用的五大关键技术
【10月更文挑战第42天】在数字化浪潮中,Web应用已成为企业与用户互动的重要桥梁。本文将深入探讨提升Web应用性能和用户体验的五项核心技术,包括前端优化、后端架构设计、数据库管理、安全性增强以及API开发的最佳实践。通过这些技术的应用,开发者可以构建出更快、更稳定且更安全的Web应用,满足现代网络环境的需求。
|
28天前
|
人工智能 安全 物联网
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
区块链技术的未来展望:去中心化金融(DeFi)与Web 3.0的融合
|
2月前
|
人工智能 前端开发
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
2024 川渝 Web 前端开发技术交流会「互联」:等你来报名!
|
2月前
|
存储 安全 数据库
后端技术在现代Web开发中的实践与创新
【10月更文挑战第13天】 本文将深入探讨后端技术在现代Web开发中的重要性,通过实际案例分析展示如何利用先进的后端技术提升用户体验和系统性能。我们将从基础架构设计、数据库优化、安全性保障等方面展开讨论,为读者提供清晰的指导和实用的技巧。无论是新手开发者还是经验丰富的技术人员,都能从中获得启发和帮助。
46 2
|
2月前
|
机器学习/深度学习 移动开发 JavaScript
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
Web实时通信的学习之旅:SSE(Server-Sent Events)的技术详解及简单示例演示
352 0
|
1月前
|
监控 前端开发 JavaScript
前端技术探索:构建高效、可维护的Web应用
【10月更文挑战第23天】前端技术探索:构建高效、可维护的Web应用
50 0