静态页面的生成、部署
当天的git地址:
一、商品的详情页面的静态生成
1.1 流程执行
- 1、通过canal监听数据库的里面商品(sku)审核状态由0---->1信息
- 2、发生改变的话rabbitMq消息队列将这个商品的id(skuId)发送给生成生成静态页面服务
- 3、生成静态页面服务,监听到这个队列有消息的话,将这个消息发送到服务中
- 4、服务收到这个消息(skuId),通过远程远程调用把需要的数据查询出来,封装到map中
- 5、生成静态也页面
- 5.1)静态页面需要的数据
- 5.2)页面生成的位置(输出流)
- 5.3)生成页面的模板
1.2 canal类监听数据
@CanalEventListener //声明当前的类是canal的监听类
public class SpuListener {
@Autowired
private RabbitTemplate rabbitTemplate;
/**
* 监听spu表
* @param eventType
* @param rowData
*/
@ListenPoint(schema = "changgou_goods",table = "tb_spu")
public void goodsUp(CanalEntry.EventType eventType,CanalEntry.RowData rowData){
Map<String,String> oldData = new HashMap<>();
Map<String,String> newData = new HashMap<>();
//将数据库老数据封装到map中
rowData.getBeforeColumnsList().forEach(column -> oldData.put(column.getName(),column.getValue()));
//将数据库新数据封装到map中
rowData.getAfterColumnsList().forEach(column -> newData.put(column.getName(),column.getValue()));
//判断是不是上架状态 上架状态从 0 -> 1
if (oldData.get("is_marketable").equals("0") && newData.get("is_marketable").equals("1")) {
rabbitTemplate.convertAndSend(RabbitMQConfig.GOODS_UP_EXCHANGE,"",newData.get("id"));
}
//判断是不是审核状态 审核状态从 0 -> 1
if (oldData.get("status").equals("0") && newData.get("status").equals("1")) {
rabbitTemplate.convertAndSend(RabbitMQConfig.GOODS_UP_EXCHANGE,"",newData.get("id"));
}
}
}
1.3 rabbtiMq发送消息
@Configuration
public class RabbitMQConfig {
//定义商品上架队列名称
public static final String AD_UPDATE_QUEUE = "ad_update_queue";
//定义商品审核通过名称
public static final String PAGE_CREATE_QUEUE="page_create_queue";
//交换机商品上架名称
public static final String GOODS_UP_EXCHANGE="goods_up_exchange";
//创建队列上架的对列
@Bean(SEARCH_ADD_QUEUE)
public Queue SEARCH_ADD_QUEUE() {
return new Queue(SEARCH_ADD_QUEUE);
}
//创建审核通过队列
@Bean(PAGE_CREATE_QUEUE)
public Queue PAGE_CREATE_QUEUE() {
return new Queue(PAGE_CREATE_QUEUE);
}
//创建队列上架的交换机
@Bean(GOODS_UP_EXCHANGE)
public Exchange GOODS_UP_EXCHANGE() {
return ExchangeBuilder.fanoutExchange(GOODS_UP_EXCHANGE).build();
}
//上架交换机绑定队列 设定路由规则为 ""
@Bean
public Binding AD_UPDATE_QUEUE_BINDING(@Qualifier(SEARCH_ADD_QUEUE) Queue queue, @Qualifier(GOODS_UP_EXCHANGE) Exchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("").noargs();
}
//审核通过交换机绑定队列 设定路由规则为 ""
@Bean
public Binding PAGE_CREATE_QUEUE_BINDING(@Qualifier(PAGE_CREATE_QUEUE) Queue queue, @Qualifier(GOODS_UP_EXCHANGE) Exchange exchange) {
return BindingBuilder.bind(queue).to(exchange).with("").noargs();
}
}
1.4 pag服务监听队列 (静态商品详情页面服务)
@Component
public class PageListener {
@Autowired
private PageService pageService;
//监听审核通过的队列
@RabbitListener(queues = RabbitMQConfig.PAGE_CREATE_QUEUE)
public void receiveMessage(String spuId) {
//将消息发送到了静态页面服务
pageService.generateItemPage(spuId);
}
}
1.5 生成静态页面
1.5.1 封装页面需要的数据
/**
* 根据spu的id查询出静态页面所需的数据
* @param spuId
* @return
*/
private Map<String, Object> findItemData(String spuId) {
//创建一个map封装查询上来的数据
Map<String, Object> resultMap = new HashMap<>();
//通过远程调用获取spu
Spu spu = spuFeign.findSpuById(spuId).getData();
resultMap.put("spu", spu);
//将spu的图片信息取出来
if (spu != null) {
if (StringUtils.isNotEmpty(spu.getImages())) {
//spu里存入的图片可能不止一张。截取获取图片集合
resultMap.put("imageList", spu.getImages().split(","));
}
}
//查询上来分类信息
Category category1 = categoryFeign.findById(spu.getCategory1Id()).getData();
Category category2 = categoryFeign.findById(spu.getCategory2Id()).getData();
Category category3 = categoryFeign.findById(spu.getCategory3Id()).getData();
resultMap.put("category1", category1);
resultMap.put("category2", category2);
resultMap.put("category3", category3);
//将sku存入结果集中
List<Sku> skuList = skuFeign.findSkuListBySpuId(spuId);
resultMap.put("skuList", skuList);
//将规格信息存入到结果集中
Map specMap = JSON.parseObject(spu.getSpecItems(), Map.class);
resultMap.put("specificationList", specMap);
return resultMap;
}
1.5.2 创建输出流,指定静态页面位置
- 1、查询上来的数据传入context中
- 2、创建静态页面生成的位置
- 3、文件模板名称
@Service
public class PageServiceImpl implements PageService {
@Autowired
private CategoryFeign categoryFeign;
@Autowired
private SkuFeign skuFeign;
@Autowired
private SpuFeign spuFeign;
@Autowired
private TemplateEngine templateEngine;
//获取生成页面的路径
@Value("${pagepath}")
private String pagepath;
/**
* 当商品的上架审核状态通过,生成静态页面
*
* @param spuId
*/
@Override
public void generateItemPage(String spuId) {
//获取context对象,用于存放商品详情数据
Context context = new Context();
//调用findItemData方法
Map<String, Object> itemData = findItemData(spuId);
//传入数据
context.setVariables(itemData);
//创建文件
File dir = new File(pagepath);
if (!dir.exists()) {
//文件不存在,创建一个
dir.mkdir();
}
//定义输出流,进行文件生成
File file = new File(dir+"/"+spuId+".html");
Writer out = null;
try {
out = new PrintWriter(file);
//生成文件
/**
* 1.模板名称
* 2.context对象,包含了模板需要的数据
* 3.输出流,指定文件输出位置
*/
templateEngine.process("item", context, out);
} catch (Exception e) {
e.printStackTrace();
//关闭流
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
二、生成的静态页面部署到nginx
一、业务流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vNZeobD4-1602332799360)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1602319924422.png)]
!1602318295531](C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\1602318295531.png)
-
1、生成静态页面,将页面上传的文件上传系统中。并生成一个文件的id
-
2、通过rabbitmq将文件的id发送到不同的nginx服务中
-
3、nginx拿到这个文件的id到mongodb里将对应文件下载到nginx中
页面部署到nginx
一、业务流程
-
1、生成静态页面,将页面上传的文件上传系统中。并生成一个文件的id
-
2、通过rabbitmq将文件的id发送到不同的nginx服务中
-
3、nginx拿到这个文件的id到mongodb里将对应文件下载到nginx中