全站资源开放下载,感谢广大网友的支持
链接失效请移步职涯宝平台的学习路线|资源下载分类
支持用户留言评论_客服实时在线_问题解决更快
支付宝赞助-Java帮帮社区
微信赞助-Java帮帮社区

从构建分布式秒杀系统聊聊商品详情页静态化

11
发表时间: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页面执行以下生成商品页操作,不出意外目录下会生成四个商品页面,打开如下图所示:

goods.png

思考

  • 为什么要构建静态商品页,说出你的理由?

  • Nginx处理静态页的速度为什么会优于Tomcat?

  • 多维度的商品页,单个维度的变动如何不影响全局?


Java帮帮公众号生态

Java帮帮公众号生态

总有一款适合你

Java帮帮-微信公众号

Java帮帮-微信公众号

将分享做到极致

九点编程-公众号

九点编程-公众号

深夜九点学编程

大数据驿站-微信公众号

大数据驿站-微信公众号

一起在数据中成长

Python帮帮-公众号

Python帮帮-公众号

人工智能,爬虫,学习教程

程序员生活志-公众号

程序员生活志-公众号

互联网,职场,程序员那些事儿

Java帮帮学习群生态

Java帮帮学习群生态

总有一款能帮到你

Java学习群

Java学习群

与大牛一起交流

大数据学习群

大数据学习群

在数据中成长

九点编程学习群

九点编程学习群

深夜九点学编程

python学习群

python学习群

人工智能,爬虫

测试学习群

测试学习群

感受测试的魅力

Java帮帮生态承诺

Java帮帮生态承诺

一直坚守,不负重望

初心
勤俭
诚信
正义
分享
合作品牌 非盈利生态-优质内容分享传播者
友链交换:加帮主QQ2524138991 留言即可 24小时内答复  
会员登录
获取验证码
登录
登录
我的资料
留言
回到顶部