高并发解决思路之一 页面静态化

背景:在电商中,如果搞活动,会发信息通知用户,这样短时间内会有大量用户访问某个页面,导致服务器的压力剧增
此时的逻辑是:
1.前端访问后台某个url,后台返回信息,前端拿到后台的数据渲染
如果后台的数据要查询很多个微服务才能得到,这样大批量用户同时访问的话,压力巨大

使用静态页的思路如下:


1.模仿浏览器去访问某个活动页a.html-->得到html信息
2.上传到阿里云的oss服务器,如上传到web/act/static/目录上,前端访问时,访问的是
web/act/static/这个目录下的静态文件,所以性能比较高

3.当后台内容变更时,就重新去生成一份a.html上传到web/act/static/覆盖原来的文件

这种方式需要跟前端配置联调,调节对应的css和js进行支持
引入依赖:
       <dependency>
            <groupId>net.sourceforge.htmlunit</groupId>
            <artifactId>htmlunit</artifactId>
        </dependency>

        OutputStream outputStream=null;
        try {
            String url="https://www.taobao.com/";
            WebClient webClient = new WebClient(BrowserVersion.CHROME);
            webClient.getOptions().setJavaScriptEnabled(false);
            webClient.getOptions().setCssEnabled(false);
            webClient.setAjaxController(new NicelyResynchronizingAjaxController());
            webClient.getOptions().setTimeout(30000);
            webClient.getOptions().setThrowExceptionOnScriptError(false);
            webClient.addRequestHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3192.0 Safari/537.36");
            HtmlPage page = webClient.getPage(url);
            String htmlStr = page.asXml();
            //这里拿到了页面信息,上传到服务器指位置,例如可以上传到阿里云oss图片服务器,在上面创建一个文件夹web/static,前端直接访问该路径就行了

            //这里演示下载到我本地电脑

            outputStream = new FileOutputStream("F:\test.html");
            outputStream.write(htmlStr.getBytes());


        }catch (Exception ex){

        }finally {
            if(null!=outputStream){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }

如期url得到html的方式有很多种,可以通过流直接读取,或者JSoup工具去读取

原文地址:https://www.cnblogs.com/yangxiaohui227/p/12553895.html