乐优商城(九)数据同步

1. 项目问题分析

现在项目中有三个独立的微服务:

  • 商品微服务:原始数据保存在 MySQL 中,从 MySQL 中增删改查商品数据。
  • 搜索微服务:原始数据保存在 ES 的索引库中,从 ES 中查询商品数据。
  • 商品详情微服务:做了页面静态化,静态页面的商品数据不会随着数据库发生变化。

假如我在商品微服务中,修改了商品的数据,也就是 MySQL 中数据发生了改变。但搜索微服务查询到的数据还是原来的,商品详情微服务的生成的静态页面也没有发生改变,这样显然不对。我们需要实现数据的同步,让搜索微服务和商品详情微服务的商品也发生修改。

我们使用消息队列技术(RabbitMQ)来实现数据同步:

2. 项目改造

接下来,我们就改造项目,实现搜索微服务和商品详情微服务的数据同步。

2.1 改造思路

生产者:商品微服务

  • 什么时候发送消息?

    当商品微服务对商品进行增、删、改的操作时候,就发送一条消息。

  • 发送什么内容?

    我们发送商品 id,其它微服务可以根据 id 查询自己需要的信息。

消费者:搜索微服务和商品详情微服务

接收消息后如何处理?

  • 搜索微服务:
    • 增/改:添加新的数据到索引库
    • 删:删除索引库数据
  • 商品详情微服务:
    • 增/改:创建新的静态页
    • 删:删除原来的静态页

2.2 商品微服务发送消息

在 leyou-item-service 中实现商品微服务发送消息。

2.2.1 引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.2.2 配置文件

在 application.yaml 中添加 RabbitMQ 的配置:

spring:rabbitmq:host: 127.0.0.1username: leyoupassword: leyouvirtual-host: /leyoutemplate:exchange: leyou.item.exchangepublisher-confirms: true
  • template:有关 AmqpTemplate 的配置
    • exchange:缺省的交换机名称,此处配置后,发送消息如果不指定交换机就会使用这个
  • publisher-confirms:生产者确认机制,确保消息会正确发送,如果发送失败会有错误回执,从而触发重试
2.2.3 改造 SpuService
  1. 注入 AmpqTemplate 模板

@Autowired
private AmqpTemplate amqpTemplate;

编写发送消息方法

/*** 发送消息* @param id 商品 id* @param type*/
private void sendMessage(Long id, String type){try {this.amqpTemplate.convertAndSend("item." + type, id);} catch (Exception e) {e.printStackTrace();}
}

在新增方法中,调用发送消息方法

在修改方法中,调用发送消息方法

在这里插入图片描述

2.3 搜索微服务接收消息

在 leyou-search 中实现搜索微服务接收消息。

2.3.1 引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.3.2 配置文件
spring:rabbitmq:host: 127.0.0.1username: leyoupassword: leyouvirtual-host: /leyou
2.3.3 编写监听器

@Component
public class GoodsListener {@Autowiredprivate SearchService searchService;/*** 处理 insert 和 update 的消息** @param id* @throws Exception*/@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "leyou.create.index.queue", durable = "true"),exchange = @Exchange(value = "leyou.item.exchange",ignoreDeclarationExceptions = "true",type = ExchangeTypes.TOPIC),key = {"item.insert", "item.update"}))public void listenCreate(Long id) throws Exception {if (id == null) {return;}// 创建或更新索引this.searchService.createIndex(id);}/*** 处理 delete 的消息** @param id*/@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "leyou.delete.index.queue", durable = "true"),exchange = @Exchange(value = "leyou.item.exchange",ignoreDeclarationExceptions = "true",type = ExchangeTypes.TOPIC),key = "item.delete"))public void listenDelete(Long id) {if (id == null) {return;}// 删除索引this.searchService.deleteIndex(id);}
}
2.3.4 编写创建和删除索引方法

在 SearchService 中添加创建和删除索引方法:

/*** 创建索引** @param id* @throws IOException*/
public void createIndex(Long id) throws IOException {Spu spu = this.spuClient.querySpuById(id);// 构建商品Goods goods = this.buildGoods(spu);// 保存数据到索引库this.goodsRepository.save(goods);
}
/*** 删除索引** @param id*/
public void deleteIndex(Long id) {this.goodsRepository.deleteById(id);
}

2.4 商品详情微服务接收消息

在 leyou-goods-web 中实现商品详情微服务接收消息。

2.4.1 引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2.4.2 配置文件
spring:rabbitmq:host: 127.0.0.1username: leyoupassword: leyouvirtual-host: /leyou
2.4.3 编写监听器

在这里插入图片描述

@Component
public class GoodsListener {@Autowiredprivate GoodsHtmlService goodsHtmlService;/*** 处理 insert 和 update 的消息** @param id* @throws Exception*/@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "leyou.create.web.queue", durable = "true"),exchange = @Exchange(value = "leyou.item.exchange",ignoreDeclarationExceptions = "true",type = ExchangeTypes.TOPIC),key = {"item.insert", "item.update"}))public void listenCreate(Long id) throws Exception {if (id == null) {return;}// 创建页面goodsHtmlService.createHtml(id);}/*** 处理 delete 的消息** @param id*/@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "leyou.delete.web.queue", durable = "true"),exchange = @Exchange(value = "leyou.item.exchange",ignoreDeclarationExceptions = "true",type = ExchangeTypes.TOPIC),key = "item.delete"))public void listenDelete(Long id) {if (id == null) {return;}// 删除页面goodsHtmlService.deleteHtml(id);}
}
2.4.4 添加删除页面方法

在 GoodsHtmlService 中 添加删除页面方法

/*** 删除 HTML 页面* @param id*/
public void deleteHtml(Long id) {File file = new File("D:\\nginx-1.14.0\\html\\item\\" + id + ".html");file.deleteOnExit();
}

3. 测试

  1. 启动微服务

打开 RabbitMQ 管理界面,交换机和队列都已将创建好了

启动后台管理系统和门户系统

查看搜索商品页和商品详情页

进入后台管理系统,修改商品价格为 4999

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/726088.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python75-Python的函数参数,关键字(keyword)参数

在定义Python函数时可定义形参(形式参数的意思)这些形参的值要等到调用时才能确定下来,由函数的调用者负责为形参传入参数值。简单来说,就是谁调用函数,谁负责传入参数值。 关键字(keyword)参数 Python函数的参数名不是无意义的,Python 允许在调用函数时通过名字来传入参…

mysql 查看数据库、表的命令

查看所有的数据库 1.show databases; 2.select schema_name from information_schema.schemata\G \G 。以纵向报表的形式显示结果&#xff0c;方便查看。 查看mysql数据库的运行状态 status 选择数据库 use 库名 例 use TestDb 查看数据库中的表 show tables 查看表结构 de…

怎么在图片上直接编辑文字?3个方法教你轻松编辑

怎么在图片上直接编辑文字&#xff1f;随着技术的飞速发展&#xff0c;图片编辑已经成为我们日常生活和工作中不可或缺的一部分。在图片上直接编辑文字&#xff0c;不仅能够添加说明和标注&#xff0c;提高信息的传达效率&#xff0c;还能够增强图片的美观和设计感&#xff0c;…

qt练习案例

记录一下qt练习案例&#xff0c;方便学习qt知识点 基本部件 案例1 需求&#xff0c;做一个标签&#xff0c;显示"你好"知识点&#xff0c;QLabel画面 4. 参考&#xff0c;Qt 之 QLabel 案例2 需求&#xff0c;做一个标签&#xff0c;显示图片 知识点&#xff0c;…

在Linux/Ubuntu/Debian中用fdisk分区mkfs格式化

fdisk 是一个命令行实用程序&#xff0c;用于在类 Unix 操作系统&#xff08;包括 Linux&#xff09;中对磁盘进行分区。 如果你想使用“fdisk”格式化 USB 驱动器&#xff0c;通常会先对驱动器进行分区&#xff0c;然后使用特定的文件系统格式化分区。 以下是有关如何在 Linu…

c++初阶------类和对象(六大默认构造函数的揭破)

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

1.JavaWebJava基础加强[万字长文]-Junit、反射、注解核心知识点梳理

导语&#xff1a; 一、Junit单元测试 1.Junit测试概述 2.Junit使用步骤 3.Junit_Before&After 二、反射 1.反射概述 2.反射获取字节码Class对象的三种方式 3.Class对象功能概述 4.Class对象功能_获取Field 5.Class对象功能_获取Constructor 6.Class对象功能_获取…

20个实操保姆级副业项目

这边免费给到大家很多项目资料和工具&#xff0c;主要的就是为了消除信息壁垒&#xff0c;在互联网创业或兼职的路上不再被割&#xff0c;不再多花冤枉钱&#xff0c;相信人间有真爱&#xff0c;有不懂的问题可咨询博主&#xff01;为了帮助到更多的创业者&#xff0c;资料欢迎…

极狐GitLab 16.3 重磅发布,极致的 DevOps 体验等你来【一】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 极狐GitLab 在去年 8 月份发布了 16.3 版本。此次发布带来了合…

ElasticSearch为什么快?

ElasticSearch是一个高性能&#xff0c;分布式搜索引擎&#xff0c;它之所以快&#xff0c;主要有以下几个原因&#xff1a; 1.分布式存储&#xff1a;ElasticSearch使用分布式存储技术&#xff0c;将数据存储在多个节点上从而减少单个节点的压力&#xff0c;提高整体性能。 …

Kakarot:当今以太坊的未来

1. 引言 前序博客&#xff1a; Kakarot&#xff1a;部署在Starknet上的ZK-EVM type 3 随着 Kakarot zkEVM 即将发布测试网&#xff0c;想重申下 Kakarot zkEVM 的愿景为&#xff1a; 为什么在rollup空间中还需要另一个 zkEVM&#xff1f; 开源代码见&#xff1a; https:/…

Anaconda prompt运行打开jupyter notebook 指令出错

一、打不开jupyter notebook网页 报错如下&#xff1a; Traceback (most recent call last): File “D:\anaconda3\lib\site-packages\notebook\traittypes.py”, line 235, in _resolve_classes klass self._resolve_string(klass) File “C:\Users\DELL\AppData\Roaming\Py…

oracle数据库通过sql实现blob类型字段转字符串

最近遇到一个问题&#xff0c;数据表tabA中有一个字段content是blob类型。现在需要通过sql把这个字段的内容展示出来。一般情况我们都是通过后端实现blob转string。但是通过sql查询出blob类型的内容还没遇到过&#xff0c;今天把解决这个问题的心理路程记录下。 首先&#xff0…

软考 系统分析师系列知识点之系统性能评估(3)

接前一篇文章&#xff1a;软考 系统分析师系列知识点之系统性能评估&#xff08;2&#xff09; 所属章节&#xff1a; 第6章. 系统配置与性能评价 第8节. 系统性能评估 6.8.2 经典评估方法 在计算机技术的发展过程中&#xff0c;性能评估的常用方法有&#xff1a;时钟频率法、…

vue3项目绝对路径重命名后vscode无法提示路径,无法进行文件跳转

vue3项目绝对路径重命名后vscode无法提示路径 设置如下: //vite.config.js resolve: {// 绝对路径重命名 @/xxxx => src/xxxxalias: {"@": path.resolve(__dirname, "src"),

安全SCDN详解

随着互联网发展&#xff0c;越来越多的人都会使用到网站&#xff0c;个人网站、企业网站&#xff0c;各类大大小小的网站影响到人们的生活方方面面。许多站长都有使用或是听起过CDN&#xff0c;而SCDN&#xff0c;全称为“Security Content Delivery Network”&#xff0c;即安…

【Java设计模式】八、装饰者模式

文章目录 0、背景1、装饰者模式2、案例3、使用场景4、源码中的实际应用 0、背景 有个快餐店&#xff0c;里面的快餐有炒饭FriedRice 和 炒面FriedNoodles&#xff0c;且加配菜后总价不一样&#xff0c;计算麻烦。如果单独使用继承&#xff0c;那就是&#xff1a; 类爆炸不说&a…

【模板】AcWing795.《前缀和》(C++)

【题目描述】 输入一个长度为 n 的整数序列。 接下来再输入 m 个询问&#xff0c;每个询问输入一对 l,r。 对于每个询问&#xff0c;输出原序列中从第 l 个数到第 r 个数的和。 【输入格式】 第一行包含两个整数 n 和 m。 第二行包含 n 个整数&#xff0c;表示整数数列。 接下…

985硕的4家大厂实习与校招经历专题分享(part1)

先简单介绍一下我的个人经历&#xff1a; 985硕士24届毕业生&#xff0c;实验室方向:CV深度学习 就业&#xff1a;工程-java后端 关注大模型相关技术发展 校招offer: 阿里巴巴 字节跳动 等10 研究生期间独立发了一篇二区SCI 实习经历:字节 阿里 京东 B站 &#xff08;只看大厂…

非科班如何系统自学Python?

在数字化时代&#xff0c;Python如一位“全能选手”在编程语言的舞台上大放异彩&#xff0c;无论是数据科学、网站开发还是人工智能&#xff0c;它都能游刃有余地驾驭各种挑战。正因如此&#xff0c;越来越多的人渴望掌握这门兼具强大功能和优雅简洁的语言。 目录 引言 开始 …