1,为什么要页面静态化?
1,如果页面数据全部经过数据库查询后再渲染,浏览量大的情况下造成数据库压力过大。
2,每次页面都经过渲染,服务器压力过大,并发能力差。
2,什么是页面静态化
将动态生成的HTML变为静态内容保存,每次用户访问不在经过页面渲染,直接返回生成好的静态页面,静态资源还可以放到nginx下,减少Tomcat压力。
3,静态化的技术
1,目前页面静态化基本靠模板引擎技术,常见的有 ThymeLeaf ,FreeMaker, VeloCity ,以ThymeLeaf最为常见。。ThymeLeaf除了可以将渲染结果 写入Response,也可以将渲染结果保存到本地。
4,ThymeLeaf的使用
1,ThymeLeaf有三个重要的概念,,(1)Context,上下文,里面可以保存需要渲染的数据,当模板进行渲染时,模板引擎从上下文中获取数据。 (2)TemplateResolver 模板解析器,,用来读取模板的相关配置,如 模板的位置,模板的类型, 模板的名称等 。 (3) TemplateEngine 模板引擎,负责具体的模板解析。
2,模板引擎的使用 TemplateEngine.process("模板名",context,writer) 模板名称, 上下文, 输出目的地的流,
在输出时,我们可以指定输出的目的地,如果目的地是Response的流,那就是网络响应。如果目的地是本地文件,那就实现静态化了。
而在SpringBoot中已经自动配置了模板引擎,因此我们不需要关心这个。现在我们做静态化,就是把输出的目的地改成本地文件即可!
代码demo:
Service代码:
@Service
public class GoodsHtmlService {
@Autowired
private GoodsService goodsService;
@Autowired
private TemplateEngine templateEngine;
private static final Logger LOGGER = LoggerFactory.getLogger(GoodsHtmlService.class);
/**
* 创建html页面
*
* @param spuId
* @throws Exception
*/
public void createHtml(Long spuId) {
PrintWriter writer = null;
try {
// 获取页面数据
Map<String, Object> spuMap = this.goodsService.loadModel(spuId);
// 创建thymeleaf上下文对象
Context context = new Context();
// 把数据放入上下文对象
context.setVariables(spuMap);
// 创建输出流
File file = new File("C:\\project\\nginx-1.14.0\\html\\item\\" + spuId + ".html");
writer = new PrintWriter(file);
// 执行页面静态化方法
templateEngine.process("item", context, writer);
} catch (Exception e) {
LOGGER.error("页面静态化出错:{},"+ e, spuId);
} finally {
if (writer != null) {
writer.close();
}
}
}
/**
* 新建线程处理页面静态化
* @param spuId
*/
public void asyncExcute(Long spuId) {
ThreadUtils.execute(()->createHtml(spuId));
/*ThreadUtils.execute(new Runnable() {
@Override
public void run() {
createHtml(spuId);
}
});*/
}
}
线程工具类:
public class ThreadUtils {
private static final ExecutorService es = Executors.newFixedThreadPool(10);
public static void execute(Runnable runnable) {
es.submit(runnable);
}
}
5,什么时候创建静态文件??
1,进行nginx配置,用户进行页面请求是先在本地查找此静态页面,如果没有静态页面则反向代理到页面请求的Controller中,在Controller方法里查询完数据,将数据放入model后,开启一个线程进行页面静态化。
6,Nginx代理静态文件
Nginx的demo:
server {
listen 80;
server_name
www.leyou.com;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location /item {
# 先找本地
root html;
if (!-f $request_filename) { #请求的文件不存在,就反向代理
proxy_pass
http://127.0.0.1:8084;
break;
}
}
location / {
proxy_pass
http://127.0.0.1:9002;
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}