静态页面的生成和部署

静态页面的生成、部署

当天的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中

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
通用静态页面生成系统<br>(Engineer) <br>系统介绍<br>Engineer系统是降低服务器负载,减少企业运营成本的完美解决方案。通过动态批量生成静态页面,可使企业在对外发布服务器选择上,缩减对硬件的投资,并同时降低企业的互联网接入费用。<br>Engineer系统可与目前98%以上文章管理系统进行无缝结合,2%特例系统,也可通过二次编码进行整合,系统根据模板生成静态页,时刻保持网站的新鲜感。<br>Engineer系统是企业低成本、高负载量网站运营完美解决方案。<br><br><br>系统特点<br><br>与现有系统无缝整合<br>系统采用XML文件格式配置系统,通过参数的设置,自动获取数据后生成源数据,Engineer系统读取源数据和模板信息后生成静态页面<br><br>非常见系统结构冗余<br>Engineer采用特有的双层XML配置结构,如企业的系统不适合通过配置文件生成源数据,则可通过简单的二次编码,直接生成符合Engineer数据标准的源数据,达到系统的整合<br><br>动态模板标记<br>在制作Engineer系统使用的模板时,可任意使用模板标记,系统将自动识别,并替换为源数据中相应的内容<br><br><br>系统要求<br><br>操作系统:Microsoft Windows、Linux等支持SUN Java环境的系统<br>运行环境:SUN Java J2SDK 1.4.2及以上版本<br><br><br>*************************************************************<br>解压缩当前压缩包到任意目录<br>配置java环境<br>将jar文件夹中文件加入系统环境变量CLASSPATH中<br><br>详细安装、配置、使用请阅读Engineer.doc<br>*************************************************************
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值