ES与MySQL数据同步实现方式

1.什么是数据同步:

1.Elasticsearch中的酒店数据来自于mysql数据库,因此mysql数据发生改变时,Elasticsearch也必须跟着改变,这个就是Elasticsearch与mysql之间的数据同步
在这里插入图片描述

2.数据同步实现方式:

常见的数据同步方案有三种

  • 同步调用
  • 异步通知
  • 监听binlog

2.1.同步调用:

a.解决架构图:

  • 1.方案一:同步调用:
    在这里插入图片描述
  • 2.基本步骤如下:
    • hotel-demo对外提供接口,用来修改elasticsearch中的数据
    • 酒店管理服务在完成数据库操作后,直接调用hotel-demo提供的接口,

b.优缺点分析:

  • 优点:实现简单,粗暴
  • 缺点:业务耦合度高

2.2.异步通知

a.实现的架构图:

  • 1.方案二:异步通知
    在这里插入图片描述
  • 2.流程如下:
    • hotel-admin对mysql数据库数据完成增、删、改后,发送MQ消息
    • hotel-demo监听MQ,接收到消息后完成Elasticsearch数据修改

b.优缺点分析:

  • 优点:低耦合,实现难度一般
  • 缺点:依赖mq的可靠性

2.3.监听binlog:

a.实现的架构图:

  • 1.方案三:监听binlog
    在这里插入图片描述
  • 2.流程如下:
    • 给mysql开启binlog功能
    • mysql完成增、删、改操作都会记录在binlog中
    • hotel-demo基于canal监听binlog变化,实时更新elasticsearch中的内容

b.优缺点分析:

  • 优点:完全解除服务间耦合
  • 缺点:开启binlog增加数据库负担、实现复杂度高

3.MQ实现MySQL与Es的数据同步:

3.1.案例说明:

  • 1.导入hotel-admin项目作为酒店管理的微服务。然后当酒店数据发生增、删、改时,要求对Elasticsearch中数据也要完成相同操作

3.2.实现步骤:

a.酒店管理项目的运行:

  • 1.导入hotel-admin项目并运行,启动并测试酒店数据的CRUD,运行后,访问 http://localhost:8099
    在这里插入图片描述
  • 2.其中包含了酒店的CRUD功能:
    在这里插入图片描述

b.项目引入ES依赖:

  • 1.在hotel-admin、hotel-demo中引入rabbitmq的依赖:
    <!--amqp-->
    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    

c.MQ架构规划:

  • 1.使用RabbitMQ,然后MQ结构如下图,声明exchange、queue、RoutingKey
    在这里插入图片描述
  • 2.声明队列交换机名称:在hotel-admin和hotel-demo中的cn.itcast.hotel.constatnts包下新建一个类MqConstants
    package cn.itcast.hotel.constatnts;public class MqConstants {/*** 交换机*/public final static String HOTEL_EXCHANGE = "hotel.topic";/*** 监听新增和修改的队列*/public final static String HOTEL_INSERT_QUEUE = "hotel.insert.queue";/*** 监听删除的队列*/public final static String HOTEL_DELETE_QUEUE = "hotel.delete.queue";/*** 新增或修改的RoutingKey*/public final static String HOTEL_INSERT_KEY = "hotel.insert";/*** 删除的RoutingKey*/public final static String HOTEL_DELETE_KEY = "hotel.delete";
    }
    
  • 3.声明队列交换机在hotel-demo中,定义配置类,声明队列、交换机:
    package cn.itcast.hotel.config;import cn.itcast.hotel.constants.MqConstants;
    import org.springframework.amqp.core.Binding;
    import org.springframework.amqp.core.BindingBuilder;
    import org.springframework.amqp.core.Queue;
    import org.springframework.amqp.core.TopicExchange;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;@Configuration
    public class MqConfig {@Beanpublic TopicExchange topicExchange(){return new TopicExchange(MqConstants.HOTEL_EXCHANGE, true, false);}@Beanpublic Queue insertQueue(){return new Queue(MqConstants.HOTEL_INSERT_QUEUE, true);}@Beanpublic Queue deleteQueue(){return new Queue(MqConstants.HOTEL_DELETE_QUEUE, true);}@Beanpublic Binding insertQueueBinding(){return BindingBuilder.bind(insertQueue()).to(topicExchange()).with(MqConstants.HOTEL_INSERT_KEY);}@Beanpublic Binding deleteQueueBinding(){return BindingBuilder.bind(deleteQueue()).to(topicExchange()).with(MqConstants.HOTEL_DELETE_KEY);}
    }
    

d.生产者发送消息:

  • 1.发送MQ消息:在hotel-admin中的增、删、改业务中分别发送MQ消息:
    在这里插入图片描述

e.消费端接收消息:

  • 1.接收MQ消息:hotel-demo接收到MQ消息要做的事情包括:
    • 新增消息:根据传递的hotel的id查询hotel信息,然后新增一条数据到索引库
    • 删除消息:根据传递的hotel的id删除索引库中的一条数据
  • 1.首先在hotel-demo的cn.itcast.hotel.service包下的IHotelService中新增新增、删除业务
    void deleteById(Long id);void insertById(Long id);
    
    • 2.给hotel-demo中的cn.itcast.hotel.service.impl包下的HotelService中实现业务:
    @Override
    public void deleteById(Long id) {try {// 1.准备RequestDeleteRequest request = new DeleteRequest("hotel", id.toString());// 2.发送请求client.delete(request, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}
    }@Override
    public void insertById(Long id) {try {// 0.根据id查询酒店数据Hotel hotel = getById(id);// 转换为文档类型HotelDoc hotelDoc = new HotelDoc(hotel);// 1.准备Request对象IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());// 2.准备Json文档request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);// 3.发送请求client.index(request, RequestOptions.DEFAULT);} catch (IOException e) {throw new RuntimeException(e);}
    }
    
  • 3.编写监听器:在hotel-demo中的cn.itcast.hotel.mq包新增一个类:
    package cn.itcast.hotel.mq;import cn.itcast.hotel.constants.MqConstants;
    import cn.itcast.hotel.service.IHotelService;
    import org.springframework.amqp.rabbit.annotation.RabbitListener;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;@Component
    public class HotelListener {@Autowiredprivate IHotelService hotelService;/*** 监听酒店新增或修改的业务* @param id 酒店id*/@RabbitListener(queues = MqConstants.HOTEL_INSERT_QUEUE)public void listenHotelInsertOrUpdate(Long id){hotelService.insertById(id);}/*** 监听酒店删除的业务* @param id 酒店id*/@RabbitListener(queues = MqConstants.HOTEL_DELETE_QUEUE)public void listenHotelDelete(Long id){hotelService.deleteById(id);}
    }
    

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

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

相关文章

7.2 算法设计与分析

分治法&#xff08;考的概率较低&#xff09; 回溯法&#xff08;考的概率较低&#xff09; 动态规划法&#xff08;考的概率较高&#xff09; 1

Python 办公自动化 处理 Excel 数据 【1】推荐

话说学好办公自动化,走遍天下都不怕&#xff01;&#xff01;&#xff01; 好的&#xff0c;现在开始。 因为是一些办公自动化的应用场景&#xff0c;所以需要电脑支持excel、word和ppt以及python的运行环境。 如果有电脑不支持Excel word ppt的以及python环境下载安装配置可…

交通感知与车路协同系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

QT:事件机制

一、事件机制 qt的核心机制&#xff1a;对象树、信号和槽、事件机制 1.1概念 就是当这件事情发生时&#xff0c;自动执行对应的功能代码。该某块功能代码是虚函数&#xff0c;只需重写该虚函数&#xff0c;即可执行重写的代码。 1.2事件处理简介 1. 什么是事件&#xff1f; (重…

【教学类-76-01】20240820书包01(图案最大化)

背景需求 通义万相生成图片&#xff0c;把图案最大化的方法&#xff08;切掉白边&#xff09; 【教学类-75-01】20240817“通义万相图片最大化透明png”的修图流程-CSDN博客文章浏览阅读1.6k次&#xff0c;点赞56次&#xff0c;收藏17次。【教学类-75-01】20240817“通义万相…

【Android 笔记】记移植OpenCV4.8图像人脸识别

前言 因业务需要&#xff0c;使用大屏端摄像头捕获图像&#xff0c;且要识别图像中人脸的数目以及从中随机抽取一人。 业务流程如下&#xff0c;调用摄像头预览、拍照&#xff0c;使用OpenCV库进行人脸识别&#xff0c;将识别到的人脸使用矩形框绘制出来&#xff0c;从识别的人…

【秋招笔试】8.18大疆秋招(第三套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

STM32CubeMX 配置串口通信 HAL库

一、STM32CubeMX 配置串口 每个外设生成独立的 ’.c/.h’ 文件 不勾&#xff1a;所有初始化代码都生成在 main.c 勾选&#xff1a;初始化代码生成在对应的外设文件。 如 GPIO 初始化代码生成在 gpio.c 中。 二、重写fputc函数 ​ #include <stdio.h>#ifdef __GNUC__#def…

无人机之固定翼无人机的组成

固定翼无人机是根据空气动力学原理设计机翼的形状&#xff0c;靠动力装置产生推力或者拉力&#xff0c;使无人机获得一定速度后&#xff0c;会导致空气在飞机上下表面的压力不同&#xff0c;进而产生升力&#xff0c;其升力主要来源于固定的机翼。大多数都是由机翼、机身、尾翼…

FastHTML:使用 Python 彻底改变 Web 开发

什么是 FastHTML&#xff1f;&#x1f310; FastHTML 是一个现代 Python Web 应用程序框架&#xff0c;其真正目的是让 Python 开发人员轻松进行 Web 开发。它大大减少了对 JavaScript 和 CSS 构建交互式和可扩展 Web 应用程序的依赖。FastHTML 通过使用 Python 对象来表示 HTM…

python 捕获异常

捕获指定异常 e 是保存的异常信息 捕获多个异常

全国大学生数学建模比赛——时间序列(详细解读)

全国大学生数学建模比赛中&#xff0c;时间序列分析是一种重要的方法。以下是对时间序列在该比赛中的详细解读&#xff1a; 一、时间序列的概念 时间序列是按时间顺序排列的一组数据。在数学建模中&#xff0c;时间序列数据通常反映了某个现象随时间的变化情况。例如&#xf…

使用vs配置opencv环境(属性表方法)

opencv官网&#xff1a;https://opencv.org/releases/ 老手回忆&#xff08;新建属性表&#xff09; Step1: 安装VS&#xff0c;安装openCV Step2: 新建项目&#xff0c;新建项目属性表&#xff0c;debug|x64新建属性&#xff0c;命好名字 Step3: VC目录-包含目录中添加: 安装…

经典游戏,用java实现的坦克大战小游戏

今天给大家分享一个使用java编写的坦克大战小游戏&#xff0c;整体还是挺好玩的&#xff0c;通过对这款游戏的简单实现&#xff0c;加深对java基础的深刻理解。 一、设计思路 1.坦克大战小游戏通过java实现&#xff0c;其第一步需要先绘制每一关对应的地图&#xff0c;地图包括…

WPF中RenderTransform,LayoutTransform区别

RenderTransform RenderTransform 是在渲染阶段应用的变换。它不会影响控件的布局&#xff0c;只会影响控件的外观。常用于动画和视觉效果。 • 应用时机&#xff1a;在控件已经完成布局之后。 • 影响范围&#xff1a;仅影响控件的外观&#xff0c;不影响布局。 • 常见用途&…

探索 HarmonyOS 的层叠布局:灵活的 Stack 容器

在应用开发中&#xff0c;灵活的布局设计是提高用户体验的关键之一。HarmonyOS 提供了丰富的布局组件&#xff0c;其中层叠布局&#xff08;Stack Layout&#xff09;是一个强大的工具&#xff0c;可以帮助开发者轻松实现元素的重叠显示。本文将深入探讨 Stack 容器的功能和应用…

【设计模式】六大原则-下

❓首先什么是设计模式&#xff1f; &#x1f635;相信刚上大学的你和我一样&#xff0c;在学习这门课的时候根本不了解这些设计原则和模式有什么用处&#xff0c;反而不如隔壁的C更有意思&#xff0c;至少还能弹出一个小黑框&#xff0c;给我个hello world。 ✨ 如何你和我一样…

ArcGIS Pro基础:状态栏显示栏的比例尺设置和经纬度位置

上图所示&#xff0c;界面下方最左侧是显示的比例尺&#xff0c;可以进行选择设置&#xff0c;也可以进行自定义设置 上图所示&#xff0c;可以手动录入比例尺&#xff0c;同时也可以对比例尺设置别名&#xff0c;比如【实验1】作为特定比例尺的标记 如上图所示&#xff0c;可以…

KEEPALIVED高可用集群最详解

目录 一、高可用集群 1.1 集群的类型 1.2 实现高可用 1.3 VRRP&#xff1a;Virtual Router Redundancy Protocol 1.3.1 VRRP相关术语 1.5.2 VRRP 相关技术 二、部署KEEPALIVED 2.1 keepalived 简介 2.2 Keepalived 架构 2.3 Keepalived 环境准备 2.3.1 实验环境 2…

嵌入式初学-C语言-二七

文件操作 概述&#xff1a; 什么是文件&#xff1a; 是保存在外存储器&#xff08;磁盘&#xff0c;u盘&#xff0c;移动硬盘等等&#xff09;上的数据的集合。 文件操作体现在哪几个方面&#xff1a; 文件内容的读取文件内容的写入 数据的读取和写入可被视为针对文件进行…