一、Web基本概念
Web的基本结构:
1.客户端的概述
1.1. 客户端的作用
与用户进行交互,用于接收用户的输入(操作)、展示服务器端的数据以及向服务器传递数据
1.2. 常见的客户端
PC端网页:
移动端:
Iot设备:
2. 服务器的概述
“服务器”是一个非常宽泛的概念,从硬件而言: 服务器是计算机的一种,它比普通计算机运行更快、负载更高、价格更贵。服务器在网络中为其它客户机(如PC机、智能手机、ATM等终端甚至是火车系统等大型设备)提供计算或者应用服务。从软件而言: 服务器其实就是安装在计算机上的一个软件,根据其作用的不同又可以分为各种不同的服务器,例如应用服务器、数据库服务器、Redis服务器、DNS服务器、ftp服务器等等
综上所述: 用我们自己的话来总结的话,服务器其实就是一台(或者一个集群)安装了服务器软件的高性能计算机。
2.1. 服务器的作用
与客户端进行交互,接收客户端的数据、处理具体的业务逻辑、传递给客户端其需要的数据。
2.2. 常见的服务器硬件设备
刀片服务器:
塔式服务器:
机房:
2.3. 常见的服务器操作系统
服务器是一台计算机,它必须安装操作系统之后才能够安装使用服务器软件
Linux系统: 使用最多的服务器系统,安全稳定、性能强劲、开源免费(或少许费用)。
Unix系统: 和硬件服务器捆绑销售,版权不公开,用法和Linux一样。
Windows Server系统: 源代码不开放,费用高昂,漏洞较多,性能较差,运维成本高。
2.4. 常见的服务器软件
硬件服务器装好系统,就可以安装应用软件了,像我们熟知的Tomcat、MySQL、Redis、FastDFS、ElasticSearch等等都是服务器应用软件。它们分别提供自己特定的服务器功能。如果一台服务器上安装了Tomcat,我们会就会把这台服务器叫做Tomcat服务器;如果装了MySQL,就叫做MySQL服务器。很显然,开发过程中需要很多这样的服务器。
2.5. 弹性云(虚拟)服务器
使用弹性云服务器最大的好处就是弹性伸缩。什么是弹性伸缩呢?我现在的服务器是20G内存,因为访问量暴涨我需要把内存扩容到80G,要是物理的硬件服务器就需要买来新的内存条插入主板上的内存插槽。而弹性云服务器只需要改一下内存容量的参数就行了,非常方便。等访问量下降了,再把内存容量调回来就可以,不仅方便,而且可以精准的在访问高峰期提高服务器配置而不是一直维持高配,节约成本。
2.6. 服务器端应用程序
服务器端应用程序就是运行在应用服务器软件上,用于处理具体业务功能的一个应用程序,而我们学习JavaEE开发的目的就是编写服务器端应用程序。例如: 淘宝、滴滴、京东等等项目都是服务器端应用程序
3. Web项目的构成
3.1. 请求响应对
请求:请求是从客户端发送给服务器,主要用于将客户端的数据传递给服务器
响应:响应是从服务器发送给客户端,主要用于将服务器的数据传递给客户端
请求响应对是构成项目的最基本的逻辑单元,一个项目是由非常非常多的请求响应对构成的
举例:点超链接跳转到注册页面
3.2. 功能:一个功能包含多个请求响应对
举例:注册用户功能请求1:点超链接跳转到注册页面
请求2:发送请求获取短信验证码
请求3:检查用户名是否可用
请求4:提交表单完成注册
3.3. 模块:一个模块包含很多功能
举例:用户信息管理模块
功能1:用户注册功能
功能2:用户登录功能
功能3:个人中心——账户安全功能
功能4:个人中心——账户绑定功能
功能5:个人中心——收货地址功能
功能6:个人中心——我的银行卡功能
3.4. 子系统
根据项目规模的不同,子系统这层逻辑概念可能有也可能没有。如果设置了子系统,那么子系统中也必然包含很多模块。其实庞大项目的子系统已经相当于一个项目了,甚至比小型项目整个都大。我们来引入一下分布式的概念,可以先简单的了解一下。现在很多项目都是采用分布式进行开发,分布式就是将一个大型项目拆分成多个小型项目,每个小型项目都可以独立运行,而各个小型项目之间通常都是通过远程调用的方式进行通信,好处是避免了A子系统崩溃时影响了整个项目运行,A系统崩了就让他的替身A1进行服务,这个A1跟A互为替身,这是集群的概念,集群可以让A系统血条加厚,而如果替身都崩了,也就是B调用A时呼叫不到他,那此时B也可以将异常记录下来,等到A上线后再执行这些操作。这样整个系统的健壮性都得到提升了,这就是为什么分布式成为了主流。当然并不是所有的项目都要用到分布式,如果只是一个学生管理系统,单体架构便可以了,因为访问量本身就不大并且即使服务挂了一段时间也不会产生多大的经济损失,而一些商城平台一旦挂掉了分分钟可能损失巨大,所以对系统的健壮性要求就非常高了,这就是为什么分布式开发成了主流,分布式下项目就是有各个子系统组成的。
举例:认证中心子系统
模块1:用户信息管理模块
模块2:权限管理模块
模块3:授权管理模块
模块4:权限检查模块
3.5. 项目
为了解决现实生活中的实际问题开发一个项目,这个项目就是为这个需求提供的一整套解决方案。
举例:电商项目子系统1:认证中心子系统
子系统2:商品管理子系统
子系统3:购物车子系统
子系统4:仓储子系统
子系统5:物流子系统
子系统6:订单子系统
二、Web项目架构
1. 架构的概念
『架构』其实就是项目的『结构』。只不过『结构』这个词太小了,不适合用来描述项目这么大的东西,所以换了另一个更大的词:架构。所以当我们聊一个项目的架构时,我们聊的是项目是由哪些部分组成的、每部分的作用、以及各个部分之间是怎么联系(通讯)、以及这些部分是怎么共同组成一个系统(项目)
2. 架构的演进过程
2.1. 单一架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。我们现在的JavaWeb阶段、SSM阶段都是学习单一架构开发技术。
单一架构优点:
架构简单,前期开发成本低、开发周期短,适合小型项目(OA、CRM、ERP 企业内部应用)。
单一架构缺点:
全部功能集成在一个工程中
1)业务代码耦合度高,不易维护。
2)维护成本高,不易拓展
3)并发量大,不易解决
4)技术栈受限,只能使用一种语言开发。
2.2. 垂直架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。
垂直架构优点:
1)业务代码相对解耦
2)维护成本相对易于拓展(修改一个功能,可以直接修改一个项目,单独部署)
3)并发量大相对易于解决(搭建集群)
4)技术栈可扩展(不同的系统可以用不同的编程语言编写)。
架构缺点:
1)功能集中在一个项目中,不利于开发、扩展、维护。粒度不够细
2)代码之间存在数据、方法的冗余
2.3. 分布式架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。
架构优点:
1)业务代码完全解耦,并可实现通用
2)维护成本易于拓展(修改一个功能,可以直接修改一个项目,单独部署)
3)并发量大易于解决(搭建集群)
4)技术栈完全扩展(不同的系统可以用不同的编程语言编写)。
架构缺点:
缺少统一管理资源调度的框架
2.4. 流动计算架构(SOA)
服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
资源调度和治理中心的框架:dubbo、spring cloud
架构优点:
1)业务代码完全解耦,并可实现通用
2)维护成本易于拓展(修改一个功能,可以直接修改一个项目,单独部署)
3)并发量大易于解决(搭建集群)
4)技术栈完全扩展(不同的系统可以用不同的编程语言编写)
5)框架实现了服务治理,不去担心集群的使用情况(失败会尝试其它服务…)
3. 多层架构(最经典的单一架构)
视图层:用户的操作界面+数据的动态显示
- 前端技术:HTML/CSS/JavaScript/vue
- 异步交互:Ajax、Axios
- 服务器端页面模板技术:Thymeleaf
控制层:处理请求+跳转页面
- 服务器:Tomcat
- 控制器:Servlet
- 域对象:request、session、servletContext
- 过滤器:Filter
- 监听器:Listener
业务逻辑层:业务逻辑代码(Services)的编写,就是处理具体的功能
持久化层:操作数据库(Data Access Object, DAO)、JDBC、连接池、DBUtils、MySQL
三、HTTP协议
1. HTTP协议概念
什么是HTTP协议?
HTTP:Hyper Text Transfer Protocol 超文本传输协议。
HTTP协议的作用:
HTTP最大的作用就是确定了请求和响应数据的格式。浏览器发送给服务器的数据:请求报文;服务器返回给浏览器的数据:响应报文。
HTTP协议的组成:
HTTP协议由请求和响应两部分构成,请求是由客户端往服务器传输数据,响应是由服务器往客户端传输数据。
2. 请求报文
请求报文的三个部分:
2.1. 请求行
作用: 展示当前请求的最基本信息
POST /dynamic/target.jsp HTTP/1.1
1)请求方式
2)访问地址
3)HTTP协议的版本
2.2. 请求消息头
- 向服务端告知当前客户端的某些参数,用于服务端返回合适的数据。
作用: 通过具体的参数对本次请求进行详细的说明
格式: 键值对,键和值之间使用冒号隔开
相对比较重要的请求消息头:
名称 | 功能 |
---|---|
Host | 服务器的主机地址 |
Accept | 声明当前请求能够接受的『媒体类型』 |
Referer | 当前请求来源页面的地址 |
Content-Length | 请求体内容的长度 |
Content-Type | 请求体的内容类型,这一项的具体值是媒体类型中的某一种 |
Cookie | 浏览器访问服务器时携带的Cookie数据 |
2.3. 请求体
作用:作为请求的主体,发送数据给服务器。具体来说其实就是POST请求方式下的请求参数。
格式:
1. form data(表单提交数据)
含义:当前请求体是一个表单提交的请求参数。
查看源码后,发现格式如下:
username=tom&password=123456
- 每一组请求参数是一个键值对
- 键和值中间是等号
- 键值对之间是&号
2. Request Payload(在异步请求中会学习到)
含义:整个请求体以某种特定格式来组织数据,例如JSON格式。
2.4. 请求方式
HTTP1.1中共定义了八种请求方式:
1)GET:从服务器端获取数据
- 特征1:没有请求体
- 特征2:请求参数附着在URL地址后面
- 特征3:请求参数在浏览器地址栏能够直接被看到,存在安全隐患
- 特征4:在URL地址后面携带请求参数,数据容量非常有限。如果数据量大,那么超出容量的数据会丢失
- 特征5:从报文角度分析,请求参数是在请求行中携带的,因为访问地址在请求行
2)POST:将数据保存到服务器端
- 特征1:有请求体
- 特征2:请求参数放在请求体中
- 特征3:请求体发送数据的大小没有限制
- 特征4:可以发送各种不同类型的数据
- 特征5:从报文角度分析,请求参数是在请求体中携带的
- 特征6:由于请求参数是放在请求体中,所以浏览器地址栏看不到,所以相对来说安全一点点
3)PUT:命令服务器对数据执行更新
4)DELETE:命令服务器删除数据
5)HEAD
6)CONNECT
7)OPTIONS
8)TRACE
PUT和DELETE请求方式可以让POST和GET替代,使用这种方式进行更新和删除操作主要是在使用框架时其能实现Restful定义的对资源的操作,增删改查统一使用同一个请求路径,而区分不同的操作就是根据这些请求方式进行的,例如增—>POST,删—>DELETE,改—>PUT,查—>GET
3. 响应报文
3.1. 响应状态行
HTTP/1.1 200 OK
1)HTTP协议版本
2)响应状态码
3)响应状态的说明文字
3.2. 响应消息头
1)响应体的说明书
2)服务器端对浏览器端设置数据,例如:服务器端返回Cookie信息
名称 | 功能 |
---|---|
Content-Type | 响应体的内容类型 |
Content-Length | 响应体的内容长度 |
Set-Cookie | 服务器返回新的Cookie信息给浏览器 |
location | 在重定向的情况下,告诉浏览器访问下一个资源的地址 |
3.3. 响应体
服务器返回的数据主体,有可能是各种数据类型。
1)HTML页面
2)图片
3)视频
4)以下载形式返回的文件
5)CSS文件
6)JavaScript文件
3.4. 响应状态码
作用:以编码的形式告诉浏览器当前请求处理的结果
状态码 | 含义 |
---|---|
200 | 服务器成功处理了当前请求,成功返回响应 |
302 | 重定向 |
304 | 从缓存中获取数据 |
400 | [SpringMVC特定环境]请求参数问题 |
403 | 服务器接收到了客户端的请求,但是检查到客户端没有权限,所以拒绝处理请求 |
404 | 找不到目标资源 |
405 | [SpringMVC特定环境]请求方式和服务器端对应的处理方式不一致 |
406 | [SpringMVC特定环境]请求扩展名和实际返回的响应体类型不一致 |
50X | 服务器端内部错误,通常都是服务器端抛异常了 |
404产生的具体原因:
1)访问地址写错了,确实是没有这个资源
2)访问了WEB-INF目录下的资源
3)Web应用启动的时候,控制台已经抛出异常,导致整个Web应用不可用,访问任何资源都是404