对商品的增删改时其它服务可能需要新的商品数据,但是如果消息内容中包含全部商品信息,数据量太大,而且并不是每个服务都需要全部的信息。因此我们只发送商品id,其它服务可以根据id查询自己需要的信息。

接收方:搜索微服务、静态页微服务

  • 接收消息后如何处理?

  • 搜索微服务:

  • 增/改:添加新的数据到索引库

  • 删:删除索引库数据

  • 静态页微服务:

  • 增:创建新的静态页

  • 删:删除原来的静态页

  • 改:创建新的静态页并删除原来的

1.1.1.修改ly-page当中PageService设置其生成的HTML文件到本地的nginx安装目录当中的html当中

搭建服务到Linux的时候换成linux的安装路径

1.1.1.1创建对应枚举在这里插入图片描述

在这里插入图片描述

package com.leyou.common.enums;

import lombok.AllArgsConstructor;

import lombok.Getter;

import lombok.NoArgsConstructor;

@Getter //get方法

@NoArgsConstructor //无参构造

@AllArgsConstructor //有参构造

public enum NginxUrlEnum {

NGINX_URL_ENUM_HTML(“D:/ngnix/nginx-1.18.0/nginx-1.18.0/html/item/”),

;

private String url;

}

1.1.1.2 修改ly-page当中的PageService

在这里插入图片描述

public void createHtml(Long spuId) {

//上下文

Context context = new Context();

context.setVariables(loadModel(spuId));

//输出流(渲染输出)D:/ngnix/nginx-1.18.0/nginx-1.18.0/html/item

File dest = new File(NginxUrlEnum.NGINX_URL_ENUM_HTML.getUrl(), spuId + “.html”);

try(PrintWriter writer = new PrintWriter(dest, “UTF-8”)){

//三个参数(- 模板名称 - 上下文:里面包含模型数据 - writer:输出目的地的流)

templateEngine.process(“item”, context, writer);

}catch (Exception e){

log.error(“[静态页服务] 生成静态页异常0”,e);

}

}

1.2.发送消息


我们先在商品微服务ly-item-service中实现发送消息。

1.2.1.引入依赖

在这里插入图片描述

org.springframework.boot

spring-boot-starter-amqp

1.2.2.配置文件

我们在application.yml中添加一些有关RabbitMQ的配置:

在这里插入图片描述

spring:

rabbitmq:

host: 192.168.206.66

username: leyou

password: 123321

virtual-host: /leyou

template:

retry:

enabled: true

initial-interval: 10000ms

max-interval: 300000ms

multiplier: 2

exchange: ly.item.exchange

publisher-confirms: true

  • template:有关AmqpTemplate的配置

  • retry:失败重试

  • enabled:开启失败重试

  • initial-interval:第一次重试的间隔时长

  • max-interval:最长重试间隔,超过这个间隔将不再重试

  • multiplier:下次重试间隔的倍数,此处是2即下次重试间隔是上次的2倍

  • exchange:缺省的交换机名称,此处配置后,发送消息如果不指定交换机就会使用这个

  • publisher-confirms:生产者确认机制,确保消息会正确发送,如果发送失败会有错误回执,从而触发重试

1.2.3.改造GoodsService

1.2.3.1注入AmqpTemplate

在这里插入图片描述

@Autowired

private AmqpTemplate amqpTemplate;

1.2.3.2封装一个发送消息到mq的方法:

在这里插入图片描述

private void sendMessage(Long id, String type){

// 发送消息

try {

this.amqpTemplate.convertAndSend( type, id);

} catch (Exception e) {

}

}

  • 这里没有指定交换机,因此默认发送到了配置中的:ly.item.exchange

注意:这里要把所有异常都try起来,不能让消息的发送影响到正常的业务逻辑

  • 然后在新增的时候调用:

在这里插入图片描述

@Transient

public void saveGoods(Spu spu) {

//新增SPU

spu.setId(null);

spu.setCreateTime(new Date());

spu.setLastUpdateTime(spu.getCreateTime());

spu.setSaleable(true);

spu.setValid(false);//设置默认不删除

int count = spuMapper.insert(spu);

if(count != 1){

throw new LyException(ExceptionEnum.GOODS_SAVE_ERROR);

}

//新增spu_detail

SpuDetail spuDetail = spu.getSpuDetail();

spuDetail.setSpuId(spu.getId());//spu新增完善会回显,然后就有spu.getId())

spuDetailMapper.insert(spuDetail);

saveSkuAndStock(spu);

sendMessage(spu.getId(),“item.insert”);

}

  • 修改的时候调用:

在这里插入图片描述

@Transactional

public void updateGoods(Spu spu) {

if(spu.getId() == null){

throw new LyException(ExceptionEnum.GOODS_UPDATE_ERROR);

}

//删除SKU

Sku sku = new Sku();

sku.setSpuId(spu.getId());

//查询sku

List skuList = skuMapper.select(sku);

if(!CollectionUtils.isEmpty(skuList)){

//删除sku

skuMapper.delete(sku);

//skuList.stream().map(Sku::getId).collect(Collectors.toList());

//代码解析.stream()将集合转换为流,map将集合当中的的所有id取出转换为集合

// 删除stock

List ids = skuList.stream().map(Sku::getId).collect(Collectors.toList());

stockMapper.deleteByIdList(ids);

}

//修改spu

spu.setValid(null);//是否有效设置为空

spu.setSaleable(null);

spu.setLastUpdateTime(new Date());

spu.setLastUpdateTime(null);

int count = spuMapper.updateByPrimaryKeySelective(spu);

if(count != 1){

throw new LyException(ExceptionEnum.GOODS_UPDATE_ERROR);

}

//修改detail

count = spuDetailMapper.updateByPrimaryKeySelective(spu.getSpuDetail());

if(count != 1){

throw new LyException(ExceptionEnum.GOODS_UPDATE_ERROR);

}

//新增sku和stock

saveSkuAndStock(spu);

//发送mq消息

sendMessage(spu.getId(),“item.update”);

}

1.3.搜索服务接收消息


搜索服务接收到消息后要做的事情:

  • 增:添加新的数据到索引库

  • 删:删除索引库数据

  • 改:修改索引库数据

因为索引库的新增和修改方法是合二为一的,因此我们可以将这两类消息一同处理,删除另外处理。

1.3.1.引入依赖

在这里插入图片描述

org.springframework.boot

spring-boot-starter-amqp

1.3.2.添加配置

在这里插入图片描述

spring:

rabbitmq:

host: 192.168.206.66

username: leyou

password: leyou

virtual-host: /leyou

这里只是接收消息而不发送,所以不用配置template相关内容。

1.3.3.编写监听器(数据新增和更新)

1.3.3.1 创建ItemListener

在这里插入图片描述

在这里插入图片描述

package com.leyou.search.mq;

import com.leyou.search.service.SearchService;

import org.springframework.amqp.core.ExchangeTypes;

import org.springframework.amqp.rabbit.annotation.Exchange;

import org.springframework.amqp.rabbit.annotation.Queue;

import org.springframework.amqp.rabbit.annotation.QueueBinding;

import org.springframework.amqp.rabbit.annotation.RabbitListener;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Component;

@Component //注入Spring当中

public class ItemListener {

@Autowired

private SearchService searchService;

@RabbitListener(bindings = @QueueBinding(

value = @Queue(name = “search.item.insert.queue”, durable = “true”),

exchange = @Exchange(name = “ly.item.exchange”, type = ExchangeTypes.TOPIC),

key = {“item.insert”,“item.update”}

))

public void listenInsertOrUpdate(Long spuId){

if(spuId == null){

return;

}

//处理消息,对索引库进行新增或者修改

searchService.createOrUpdateIndex(spuId);

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

最后

除了简历做到位,面试题也必不可少,整理了些题目,前面有117道汇总的面试到的题目,后面包括了HTML、CSS、JS、ES6、vue、微信小程序、项目类问题、笔试编程类题等专题。

mg-TaHOzD8U-1711958805224)]
[外链图片转存中…(img-HnAEbLEO-1711958805224)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-2Jg871UK-1711958805224)]

最后

除了简历做到位,面试题也必不可少,整理了些题目,前面有117道汇总的面试到的题目,后面包括了HTML、CSS、JS、ES6、vue、微信小程序、项目类问题、笔试编程类题等专题。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐