动静分离
动态资源静态化和这个不是一回事,动态资源静态化使用Freemark做的
- 什么是网站的动静分离架构模式
网站的动静分离就是将动态资源与静态资源相分离。动静分离也是属于高并发解决方案的一种。
- 动态资源和静态资源的区别?
- 静态资源:当用户多次访问这个资源的时候,资源的代码永远不会改变的资源。
- 动态资源:当用户多次访问这个资源的时候,资源的源代码可能会发生改变。
- 注意:这里并不是页面是变化的就是动态的,而是代码经常发生改变是动态资源。
- 什么是动静分离?
- 动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来(动态资源和静态资源不会部署在一台服务器上,将其分开部署,分开保存),动静分离资源做好了拆分之后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路
- 传统网站的架构模式是将动态资源与静态资源都放在同一台服务器上。
-
动静分离简单的概括是:动态文件与静态文件的分离
-
为什么我们要用动静分离?
在我们的软件开发中,有些请求是需要进行后台处理的(如:jsp等),有些请求是不需要经过后台处理的,(如:CSS,HTML,JPG,CSS等),这些不需要进行后台处理的文件称为静态文件,否则就是动态文件。因此我们后台处理忽略了静态文件。但是即使我们忽略了静态文件,但是依旧会使后台的请求次数增加了,在我们对资源的响应速度有要求的时候,我们应该使用这种动静分离的策略去解决。
- 一般高并发的场景中会使用动静分离
- 动静分离将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用的访问,这里我们将静态资源放在了Nginx中,动态资源转发到Tomcat服务器中。因此,动态资源转发到tomcat服务器我们就使用到了Nginx的反向代理功能。
- 动静分离就相当于是静态资源放到一个服务器,动态资源放到一个服务器中
- 网站的动静分离的搭建就是静态资源直接获取,动态资源访问服务器。一般使用Nginx实现静态服务器,Tomcat实现动态服务器,Nginx实现的静态服务器比Tomcat实现的动态服务器效率会高很多。
- Nginx通常用来当做静态资源的服务器
- 如何区分动态资源请求和静态资源请求?
- 通常使用域名区分动态资源请求和静态资源请求,如果域名是static开头的,如:static.itmayiedu.com(二级域名)为静态资源请求,www,itmayiedu.com(一级域名)为动态资源请求。
- 画图演示:
搭建动静分离的架构模式
(1)搭建一个Nginx做静态资源服务器
(2)修改nginx.conf的配置文件
###静态资源访问
server {
listen 80;
server_name static.itmayiedu.com;
location /static/imgs {
root F:/;
index index.html index.htm;
}
}
###动态资源访问
server {
listen 80;
server_name www.itmayiedu.com;
location / {
proxy_pass http://127.0.0.1:8080;
index index.html index.htm;
}
}
- 我们通过location对url进行了匹配,通过域名进行了区分。可以发现如果是请求静态资源(url是/static/images,我们就会走本地F盘,如上面配置找的是本地F://static/imgs目录下的资源),如果我们请求的是其他的动态资源,访问127.0.0.1:8080的服务器
动静分离与前后端分离
- 动静分离实际上是动态资源和静态资源的分离,不会部署在同一台服务器上。
- 前后端分离是一种网站的架构模式,微服务开发基于SOA面向于服务的开发。前后分离就是将一个项目进行分离,前端的控制和后端的接口分离,使用RPC调用,视图层和业务层分开(Controller和Service层分开变为两个项目,例如SOA面向服务开发)
浏览器的时间戳
- 我们每次访问的时候,会在请求后面加上时间戳,我们其实不加时间戳也是可以访问的,这里加时间戳的目的是控制项目上线的时候,静态资源与老的浏览器缓存的静态资源避免冲突,其实说白了就是避免浏览器用缓存的静态资源,不用新的静态资源,避免浏览器缓存
- 时间戳的规范:t=项目的上线时间(转为毫秒数)
304状态码
- 一般请求会有响应的状态码,Http是基于请求与响应的过程
- 200:表示请求成功
- 304:304状态码表示的是返回的是本地缓存的结果。
- 304状态码的原理:
(1)客户端发送请求给服务器
(2)若是第一次发送请求过去则不会存在浏览器缓存,第一次请求静态资源的时候,我们会返回一个带有最后修改时间的资源给客户端
(3)浏览器会缓存第一次请求的资源(默认缓存的时间是7天)
(4)当第二次访问相同资源的时候,判断客户端上一次修改的时间是否需要返回200还是304(其实就是说判断缓存是否过期,如果没过期直接返回304取缓存,否则就再次请求,将请求的资源放入缓存中)。
(5)关键的一步:如果服务器上的index.js最后一次的修改时间大于了客户端上最后一次修改时间,表示了我们的静态资源发生了改变,需要重新请求服务器资源,所以此时返回的应该是200,重新请求。如果服务器端最后一次修改时间小于客户端最后修改的时间返回304,走本地缓存。
总结:动静分离 前后分离 区别
- 动静分离:动态资源(jsp,ftl,thymeleaf)与静态资源(js,css,img)分开部署
- 前后分离:接口与视图层分开部署,前端写前端的代码,后端写接口就行。前端与后端项目独立部署