商品详情页的处理:FreeMarker+nginx
大型的电商网站商品数量都是几十万甚至几百万,对应的商品详情页会更多。如果用户每次去访问商品详情页的话,那么每次页面的数据都要从数据库去查询,这样加载速度就会很慢,访问量过大的话,就会对我们的数据库造成很大的压力,遇到高并发的场景,也会对我们的服务器造成很大的压力。
我们都知道:
静态页面内容稳定,加载速度快。
但是静态网页如果没有数据库的支持,那么在网站制作和维护方面的工作量都会很大。静态网页的交互性大,有很大的局限性。
动态网页呢,交互性好。
读取数据都要从数据库读取,每打开一个页面都需要去访问数据库,如果访问量过多的话,会对服务器造成压力,从而会影响网站的运行速度。
通过以上对比,想要提升网站的性能,让我们的网页既能有动态网页的交互性,又能有静态网站的加载速度。我们可以采用把动态页面静态化。把页面静态化的目的,就是降低http请求的个数,从而降低对数据库的操作,从而提高网站的运行速度。这样用户在访问的时候就是一个提前生成好的一个静态页面。
FreeMarker可以帮我们实现这样的需求。
下面我简单介绍一个FreeMarker。
他是基于java语言开发的模板引擎。一种将模板与数据进行整合并输出文本的通用工具。
实现原理:
将页面中所需要的样式写入到FreeMarker模板文件中。
将页面中所需要的数据进行动态绑定并放入到Map中。
通过FreeMarker的模板解析类process()方法完成静态页面的生成。
它有自己的一套api规范。
有自己的一些指令:
- list指令:迭代输出的指令,用于迭代输出数据模型中的集合。
- assign指令:给变量赋值
- if指令:类似于java中的if
- Include指令:用于模板文件的嵌套
…
它还有自己的一些内建函数,访问他们必须使用“?”
Object?Length
Object?Size
…
注:使用FreeMarker要求所有的标签都是闭合的。
考虑到一个问题,就是我们的网站访问量过大的情况.我们选择一个高性能的web服务器nginx来代替tomcat。
Tomcat支持的并发量是,500,而我们nginx支持的最高并发是50000,它是一个多核多线程的,而且nginx它占用的内存特别小,10个才占150M的内存,他还有完善的健康监测机制。
对于像商品详情页,用户的访问量肯定是很大的。所以在这里我们也是为了实现对服务器的降压分流,我们采用nginx,它能够处理http请求,可以作正向代理,反向代理,作负载均衡,也可以用作静态资源服务器。我们在这里用到的是他的可以用做静态资源服务器。
实现思路:
通过FreeMarker模板引擎写好一个商品详情页的模板,把所有审核的商品通过模板引擎变成一个个的静态页面,存放在一个专门的文件夹下面。
所有访问静态页的请求不通过tomcat访问。
搭建一个新的服务器nginx更改一些配置,把他的访问路径设置到存放静态页面的文件夹的路径下。对外提供访问详情页的路径时提供的就是nginx的访问路径。
具体业务的实现(服务器的搭建+代码的实现):
第一步:先搭建一个nginx服务器,在Windows系统下,直接把nginx下载下来就可以使用。
其他步骤:创建一个nginx去访问的文件夹,专门用于存放生成的商品详情页。
更改nginx里面的配置文件,把请求的路径指向存放生成的商品详情页的文件夹。
做完配置后,启动nginx。
第二步:
首先要了解我们的商品详情页的商城是在什么时候触发的?
当我们商家在后台添加一个商品提交给运营商后台进行审核的时候,运营商审核商品通过了,我们就触发这个生成商品详情页的操作。
了解这个背景,因为我们做的是分布式的项目,用的是SpringMVC的框架,所以我们要专门搭建一个生成静态页面的服务。
搭建完服务之后,对外提供dubbo服务。
因为我们要使用FreeMarker,所以我们要在pom中引入Freemarker的依赖。后台写一个生成详情页的方法(根据商品的id生成)
在web-inf下建一个文件夹专门存放页面生成的模板。
注:
1.用FreeMarker的时候,需要在Spring的xml中做一些配置,配置里面指定好模板去哪加载(用定义一个bean的方式)配置好后,用autowired把配置的模板对象引进来。
2.把生成页面的文件夹的路径配置到propertis的文件中,用@Value的注解来取值,获取文件夹的路径。
基本的配置做完了
第三步:页面模板的编辑
先找一个商品详情页的.html的文件,把他的后缀名改成以.ftl结尾的文件(.ftl是FreeMarker的文件模板的格式)。
如果页面内容比较多的话,可以对页面进行首尾的拆分,用include指令引入首尾。
第四步:后台业务的处理
- 准备模板(创建一个模板对象,加载模板路径)
- 查询数据(把页面要展示的数据查询出来,放在一个map中)
- 调用模板对象的解析方法process
process方法里面有两个参数:一个是数据,一个是输出到哪(一个writer流),里面用文件的方式new一个File对象,文件里面是文件生成的路径+文件的名称+.html(后缀),生成完之后要记得关闭write流。
第五步:前台模板页面绑定数据
绑定好数据之后,后台访问生成页面的方法,生成成功后,用nginx提供的访问详情页的访问路径。这样就完成了商品详情页的处理。
————————————————