全站資源開放下載,感謝廣大網友的支持
鏈接失效請移步職業司平臺
非盈利平臺

非盈利平臺

只為分享一些優質內容

Java幫幫-微信公眾號

Java幫幫-微信公眾號

將分享做到極致

微信小程序

微信小程序

更方便的閱讀

職業司微信公眾號

職業司微信公眾號

實時動態通知

安卓APP

安卓APP

我們從此不分開

程序員生活志-公眾號

程序員生活志-公眾號

程序員生活學習圈,互聯網八卦黑料

支付寶贊助-Java幫幫社區
微信贊助-Java幫幫社區

從構建分布式秒殺系統聊聊商品詳情頁靜態化

13
發表時間:2018-11-08 13:20來源:Java幫幫-微信公眾號


前言

大家都知道淘寶、天貓、京東以及聚美之類的電商網站,她們的商品頁會存在多套模板,各套模板的元數據是一樣的,只是展示方式不一樣。特別是對于店主而言商品詳情頁個性化需求非常多,就商品單頁各個維度信息來說,數據來源也是非常多的。這時候,如果我們再實時的去查詢各個數據源組織數據,對于數據庫來說開銷是巨大的,秒殺更是如此。

靜態化

在這里我們就做一個簡單商品詳情頁靜態頁生成,大家工作中根據實際情況做調整優化。后面如果大家對商品詳情頁架構感興趣,可以去了解下《億級流量網站架構核心技術》書中的如何構建需求響應式億級商品詳情頁,畢竟前人栽樹后人乘涼,里面還是有很多大家可以借鑒的地方。

我們選用freemarker做模板,pom.xml引入:

<!-- freemarker 模版 生成靜態頁 --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-freemarker</artifactId></dependency>

application.properties配置相關參數:

#freemarker(用于商品靜態頁生成簡化版)spring.freemarker.template-loader-path=classpath:/static/template/spring.freemarker.suffix=.fltspring.freemarker.enabled=truespring.freemarker.cache=falsespring.freemarker.charset=UTF-8spring.freemarker.content-type=text/htmlspring.freemarker.allow-request-override=falsespring.freemarker.check-template-location=truespring.freemarker.expose-request-attributes=falsespring.freemarker.expose-session-attributes=falsespring.freemarker.expose-spring-macro-helpers=false#商品靜態頁spring.freemarker.html.path = D://file//

goods.flt定義商品單頁模板:

# 模板太大了,這里不做展示,請自行參考源碼static/template/goods.flt

ICreateHtmlService靜態化接口:

/** * 生成商品靜態頁 */publicinterfaceICreateHtmlService{    Result createAllHtml();}

CreateHtmlServiceImpl靜態化實現:

@ServicepublicclassCreateHtmlServiceImplimplementsICreateHtmlService{        privatestaticint corePoolSize = Runtime.getRuntime().availableProcessors();    //多線程生成靜態頁面privatestatic ThreadPoolExecutor executor  = new ThreadPoolExecutor(corePoolSize, corePoolSize+1, 10l, TimeUnit.SECONDS,            new LinkedBlockingQueue<Runnable>(1000));        @Autowiredpublic Configuration configuration;   @Autowiredprivate SeckillRepository seckillRepository;    @Value("${spring.freemarker.html.path}")    private String path;        @Overridepublic Result createAllHtml(){        List<Seckill> list = seckillRepository.findAll();        final List<Future<String>> resultList = new ArrayList<Future<String>>();         for(Seckill seckill:list){            resultList.add(executor.submit(new createhtml(seckill)));        }       for (Future<String> fs : resultList) {            try {                System.out.println(fs.get());//打印各個線任務執行的結果,調用future.get() 阻塞主線程,獲取異步任務的返回結果            } catch (InterruptedException e) {               e.printStackTrace();            } catch (ExecutionException e) {               e.printStackTrace();            }       }         return Result.ok();    }    classcreatehtmlimplementsCallable<String>  {        Seckill seckill;        publiccreatehtml(Seckill seckill){            this.seckill = seckill;        }        @Overridepublic String call()throws Exception {            Template template = configuration.getTemplate("goods.flt");            File file= new File(path+seckill.getSeckillId()+".html");            Writer  writer = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");            template.process(seckill, writer);            return"success";        }    }}

最后通過swagger-ui頁面執行以下生成商品頁操作,不出意外目錄下會生成四個商品頁面,打開如下圖所示:

思考

  • 為什么要構建靜態商品頁,說出你的理由?

  • Nginx處理靜態頁的速度為什么會優于Tomcat?

  • 多維度的商品頁,單個維度的變動如何不影響全局?


Java幫幫學習群生態

Java幫幫學習群生態

總有一款能幫到你

Java學習群

Java學習群

與大牛一起交流

大數據學習群

大數據學習群

在數據中成長

九點編程學習群

九點編程學習群

深夜九點學編程

python學習群

python學習群

人工智能,爬蟲

測試學習群

測試學習群

感受測試的魅力

Java幫幫生態承諾

Java幫幫生態承諾

一直堅守,不負重望

初心
勤儉
誠信
正義
分享
友鏈交換:加幫主QQ2524138991 留言即可 24小時內答復  
業司
教育資訊
會員登錄
獲取驗證碼
登錄
登錄
我的資料
留言
回到頂部