努力好了,时间会给你答案。--------magic_guo

在一个电商项目中,访问频率最高的是商品详情页页面,而且商品详情页的变化评率不会太高(除非是搞活动的时候);那么访问频率高,然后再使用数据库来查询,频繁访问数据库,性能肯定达不到要求。因此另外一套解决方案就应用而生:
nginx+静态的商品详情页;

nginx:处理静态数据没秒钟可以到达10W次(官方数据);
在项目上线的时候,搭建一台nginx服务器,专门来处理静态页面的请求;

需要考虑的是,页面生成的时机,如果用户要访问商品的时候,再去生成页面,这样用户体验将会有一个极大的折扣,因此页面是在用户访问之前就已经生成了,那么到底在什么时候生成呢?答案是:在后台添加商品的时候;

流程图:

架构图:

还有一个问题,就是已经存入数据的商品,没有详情页,怎么去生成呢?
我们将数据库的所有商品数据查出来,然后直接调用item模块来生成,以达到一个同步的需求;

话不多说,看代码:
maven依赖:

 <dependencies><!--        <dependency>-->
<!--            <groupId>com.guo</groupId>-->
<!--            <artifactId>shop-feign</artifactId>-->
<!--        </dependency>--><dependency><groupId>com.guo</groupId><artifactId>shop-common</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

配置:

spring:cloud:config:uri: http://localhost:9999profile: shop-item, log, mq, eureka-clienname: applicationrabbitmq:listener:simple:acknowledge-mode: manual  # 手动ACK

mq配置:

@Configuration
public class RabbitMqConfig {// 创建一个item队列@Beanpublic Queue itemQueue() {return new Queue(ShopConstants.ITEM_QUEUE, true, false, false);}// 创建一个交换机,或者直接导入商品模块的good_exchange@Beanpublic TopicExchange goodsExchange() {return new TopicExchange(ShopConstants.GOODS_EXCHANGE, true, false);}// 将队列绑定到交换机上public Binding itemQueueToGoodsExchange() {return BindingBuilder.bind(itemQueue()).to(goodsExchange()).with("goods.*");}
}

监听器配置:

@Configuration
@Slf4j
public class ItemQueueListener {@Autowiredprivate freemarker.template.Configuration configuration;private ExecutorService executorService = Executors.newFixedThreadPool(5);@RabbitListener(queues = ShopConstants.ITEM_QUEUE)public void createItem(Goods goods, Channel channel, Message message) {executorService.submit(new Runnable() {@SneakyThrows@Overridepublic void run() {// 获取模板Template template = configuration.getTemplate("goodsItemTemplate.ftl");// 准备数据Map<String, Object> map = new HashMap<>();map.put("gname", goods.getGname());map.put("gorice", goods.getGprice());map.put("pngList", goods.getTempPng().split("\\|"));// 准备静态页面输出的位置String path = ItemQueueListener.class.getClassLoader().getResource("static").getPath();// 生成静态页面template.process(map, new FileWriter(path + File.separator + goods.getId() + ".html"));// 手动ACKtry {channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (IOException e) {e.printStackTrace();}}});}
}

启动类:

@SpringBootApplication(scanBasePackages = "com.guo", exclude = DataSourceAutoConfiguration.class)
@EnableEurekaClient
public class ShopItemApplication {public static void main(String[] args) {SpringApplication.run(ShopItemApplication.class, args);}}

完工!


本文章教学视频来自:https://www.bilibili.com/video/BV1tb4y1Q74E?p=3&t=125


静下心,慢慢来,会很快!

java电商项目搭建-------商品详情页模块相关推荐

  1. 商品详细信息的代码html_电商网站的商品详情页系统架构

    小型电商网站的商品详情页系统架构 小型电商网站的页面展示采用页面全量静态化的思想.数据库中存放了所有的商品信息,页面静态化系统,将数据填充进静态模板中,形成静态化页面,推入 Nginx 服务器.用户浏 ...

  2. 电商网站的商品详情页系统架构

    小型电商网站的商品详情页系统架构 小型电商网站的页面展示采用页面全量静态化的思想.数据库中存放了所有的商品信息,页面静态化系统,将数据填充进静态模板中,形成静态化页面,推入 Nginx 服务器.用户浏 ...

  3. 电商详情页缓存架构(一)电商网站的商品详情页架构

    小型电商网站的商品详情页的页面静态化架构以及其缺陷 小型电商网站,一般使用页面静态化的方案,提前将数据渲染到模板中. 问题:每次模板变更,模板对应的所有数据需要全部重新渲染 大型电商网站的异步多级缓存 ...

  4. 亿级流量电商详情页系统实战-1.小型电商网站的商品详情页的页面静态化架构以及其缺陷

    1.电商网站按规模分类 电商网站里,大概可以说分成两种: 小型电商 简单的一种架构方案,页面静态化的方案 大型电商 复杂的一套架构,大电商,国内排名前几的电商,大型的详情页架构页面静态化,全量的页面静 ...

  5. 电商系统:商品详情页

    高并发问题 商品详情页(商详页)一定是整个系统中DAU(日均访问次数)最高的页面之一.不难理解,用户购买前一定会货比三家.如果在设计时没考虑高并发的问题,大促的时候,商品系统必然是第一个被流量冲垮的系 ...

  6. Vue3电商项目实战-商品详情模块6【17-商品详情-标签页组件、18-商品详情-热榜组件、19-商品详情-详情组件、20-商品详情-注意事项组件】

    文章目录 17-商品详情-标签页组件 18-商品详情-热榜组件 19-商品详情-详情组件 20-商品详情-注意事项组件 17-商品详情-标签页组件 目的:实现商品详情组件和商品评价组件的切换 大致步骤 ...

  7. java电商项目搭建-------分布式文件存储系统(fastDFS)

    人之所以痛苦,那是因为你在成长.--------magic_guo 微服务项目,由于访问量和系统的高可用性能,会将上传的文件图片等存放在搭建的分布式文件存储系统:现在比较流行的文件存储系统有fastD ...

  8. java电商项目搭建-------订单模块

    努力好了,时间会给你答案.--------magic_guo 订单模块的流程以及用户操作如下: 1.当用户选定购物车需要结算的商品并单击结算按钮时,会跳转到订单页面,此时会将选定的购物车信息展示在订单 ...

  9. 电商平台APP商品详情源数据接口代码分享

    电商平台APP商品详情源数据接口代码分享如下: 1.公共参数 名称 类型 必须 描述(接口代码教程wx19970108018) key String 是 调用key(必须以GET方式拼接在URL中,点 ...

最新文章

  1. 计算机二级理工类报哪个,计算机二级考哪一科目,毕业后找工作会对科目有要求吗?还是说不管什么科目有证就行了?...
  2. 40)类与类之间的关系(has use is)
  3. mybaits六:参数处理
  4. 洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)
  5. 【OpenCV3】cv::Mat中的数据按行列写入txt文件中
  6. python去停用词用nltk_使用nltk删除英文停用词
  7. 我刊成功承办第二届数据科学家大会(2018)
  8. java题-java运行时异常与一般异常有何异同?
  9. python输入n×n的矩阵_Python使用shape计算矩阵的行和列
  10. 使用代码段遍历,枚举类型Enum
  11. 一款保险系统架构设计图
  12. 稀疏矩阵的三种存储方法
  13. 程炳皓:我不恨陈一舟 开心网做不好是我自己的问题
  14. 编译时内核栈溢出:the frame size of 1928 bytes is larger than 1024 bytes
  15. 蓝桥杯嵌入式总结(KEY配置_按键扫描(三行代码)_矩阵按键_GPIO口输入和输出类型)
  16. PDF文件怎么打印?分享两种打印方法
  17. 2021基于Debian的All in One(NAS+软路由)配置教程
  18. 操作系统第七章笔记---进程同步
  19. 第一定律VR助力马克思主义学院完成高校思政课改
  20. VC6代码移植VS2008的SDK总结,包括OPENGL和DireX还有Cimage 【总结】

热门文章

  1. 用JS觖决URL乱码问题
  2. 荣耀手表gspro支持鸿蒙吗,数码知识:荣耀手表gspro可以装APP吗是否支持第三方软件安装...
  3. HEIF/HEIC转jpg、JPEG、PNG开源实现
  4. 基于YOLO模型的安全帽佩戴检测
  5. 敲代码时如何快速移动光标_「ABB」ABB机器人快速示教上手指南
  6. 第四章 CSS的深入学习
  7. 2021年计算机保研-假211真双非三无的失败保研经历(武大/复旦/计算所/华科/同济/上交)
  8. [附源码]计算机毕业设计JAVA高校教材订购系统
  9. 对使用 Z-BlogPHP 搭建的网站进行安全加固 (上)
  10. 基于STC15W4K32S4单片机仿真《74HC595驱动数码管静态显示》