Spring Boot 与腾讯云 MySQL 监听 Binlog 数据变化,并使用 UI 展示页面效果

引言

在现代的分布式系统和微服务架构中,数据同步和变更监控是保证系统一致性和实时性的核心问题之一。MySQL 数据库的 binlog(二进制日志)功能能够记录所有对数据库的修改操作,如插入(INSERT)、更新(UPDATE)、删除(DELETE)等,是实现实时数据变更同步的有效工具。

结合 Spring Boot 框架与腾讯云 MySQL 服务,通过 mysql-binlog-connector-java 库监听 MySQL 的 binlog 变化,可以实时捕捉数据库中的数据变更,并通过合适的前端展示技术(如 Bootstrap UI)动态呈现这些变化,增强系统的可视化和互动性。

本文将详细介绍如何在 Spring Boot 项目中实现 MySQL binlog 监听、数据变更处理,并通过 Bootstrap UI 动态展示变化效果,提供一个完整的解决方案。

腾讯云MySQL,59块玩一年~

请在此添加图片描述

本文目标

本文将通过以下步骤展示如何实现数据变化监听和展示:

  1. 配置腾讯云 MySQL 数据库,启用 binlog 功能。
  2. 在 Spring Boot 项目中集成 mysql-binlog-connector-java 来监听 MySQL binlog。
  3. 通过 Spring Boot 的 Controller 处理监听到的数据变化。
  4. 使用 Thymeleaf 将后台数据动态渲染到前端页面。
  5. 使用 Bootstrap UI 组件展示 MySQL 数据变化。
  6. 通过 JavaScript 和 Bootstrap 的模态框实现动态展示数据变化详情。

1. 配置腾讯云 MySQL 数据库并启用 Binlog

1.1 腾讯云 MySQL 配置

在腾讯云上创建并配置 MySQL 数据库是实现数据监听的前提。首先登录腾讯云控制台并创建一个 MySQL 实例。在创建过程中,确保启用了 binlog(二进制日志)功能,并设置合适的日志格式(通常使用 ROW 格式以便捕获详细的行级变更信息)。

  • 登录腾讯云控制台

进入腾讯云控制台,选择 云数据库,并创建一个新的 MySQL 实例。

  • 启用 binlog 功能:(这里需要注意一下,腾讯云MySQL的Binlog是默认开启的!!!

在创建数据库实例时,在参数配置中启用 binlog,设置 binlog-format=rowrow 格式能够捕获更为详细的行级变更信息,适用于大多数变更监听场景。

[mysqld]
log-bin=mysql-bin
server-id=1
binlog-format=row
  • 创建 binlog 监听用户:创建一个具有读取 binlog 权限的用户:
CREATE USER 'binlog_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'binlog_user'@'%';
FLUSH PRIVILEGES;

此用户将用于监听和读取 binlog 数据。

  • 验证 binlog 配置:执行以下命令来检查 binlog 是否启用:
SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'binlog_format';

如果返回值为 ONROW,说明 binlog 配置已成功启用。

2. 在 Spring Boot 中集成 mysql-binlog-connector-java

2.1 创建 Spring Boot 项目

首先创建一个 Spring Boot 项目,并在 pom.xml 中添加 mysql-binlog-connector-java 依赖:

<dependency><groupId>com.github.shyiko</groupId><artifactId>mysql-binlog-connector-java</artifactId><version>0.21.0</version>
</dependency>

这个依赖会帮助我们在 Spring Boot 项目中使用 mysql-binlog-connector-java 库来连接和监听 MySQL 的 binlog。

2.2 编写 Binlog 监听服务

接下来,编写一个服务类,用于连接 MySQL 并监听 binlog 数据变化。在这个 BinlogService 类中,BinaryLogClient 被用来连接到 MySQL 服务器并监听 binlog 数据变化。监听到的事件会被添加到一个 LinkedBlockingQueue 中,这样我们可以在 Controller 中将这些数据展示到前端页面。通过 TableMapEventData 来获取表的映射关系。TableMapEventData 事件通常在 binlog 中包含了表名映射信息,它是与 WriteRowsEventData 一起生成的事件之一。WriteRowsEventData 实际上是通过 TableMapEventData 事件获得表 ID,然后使用这个 ID 来查找表名。

  • TableMap 事件:每当 TableMapEventData 事件发生时,我们将表的 tableId 和表名(getTable())映射到 tableIdToNameMap 中。这是因为 TableMapEventData 包含了一个表 ID 和表名的映射,这使得我们能够将表的 ID 与表名关联起来。
  • WriteRowsEventData:在插入数据(INSERT)事件发生时,我们从 tableIdToNameMap 中获取表名(通过 getTableId() 获取表 ID),然后记录插入的行数和表名。
  • UpdateRowsEventData:对于更新(UPDATE)事件,同样通过 getTableId() 获取表 ID,并从 tableIdToNameMap 中获取表名,记录更新的行数。
  • DeleteRowsEventData:对于删除(DELETE)事件,操作与 UPDATE 和 INSERT 类似,通过 tableIdToNameMap 获取表名,并记录删除的行数。
package com.example.demo.service;import com.github.shyiko.mysql.binlog.BinaryLogClient;
import com.github.shyiko.mysql.binlog.event.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;import java.util.concurrent.LinkedBlockingQueue;
import java.util.*;@Service
public class BinlogService {@Value("${mysql.host}")private String host;@Value("${mysql.port}")private int port;@Value("${mysql.username}")private String username;@Value("${mysql.password}")private String password;private LinkedBlockingQueue<String> binlogChanges = new LinkedBlockingQueue<>();// 存储 tableId -> tableName 的映射关系private Map<Long, String> tableIdToNameMap = new HashMap<>();// 开始监听 binlogpublic void startListening() throws Exception {BinaryLogClient client = new BinaryLogClient(host, port, username, password);//         设置 serverId,防止与其他连接冲突client.setServerId(12345);// 注册 binlog 事件监听器client.registerEventListener(new BinaryLogClient.EventListener() {@Overridepublic void onEvent(Event event) {EventHeaderV4 header = event.getHeader();// 处理 TableMap 事件,用于记录表的映射关系if (event.getData() instanceof TableMapEventData) {TableMapEventData tableMapData = (TableMapEventData) event.getData();tableIdToNameMap.put(tableMapData.getTableId(), tableMapData.getTable());}// 判断事件类型,处理不同的 binlog 事件if (event.getData() instanceof WriteRowsEventData) {WriteRowsEventData data = (WriteRowsEventData) event.getData();String tableName = tableIdToNameMap.get(data.getTableId());int rowsCount = data.getRows().size();String message = String.format("INSERT事件:表 %s 插入了 %d 行数据", tableName, rowsCount);binlogChanges.offer(message);} else if (event.getData() instanceof UpdateRowsEventData) {UpdateRowsEventData data = (UpdateRowsEventData) event.getData();String tableName = tableIdToNameMap.get(data.getTableId());int rowsCount = data.getRows().size();String message = String.format("UPDATE事件:表 %s 更新了 %d 行数据", tableName, rowsCount);binlogChanges.offer(message);}else if (event.getData() instanceof DeleteRowsEventData) {DeleteRowsEventData data = (DeleteRowsEventData) event.getData();String tableName = tableIdToNameMap.get(data.getTableId());int rowsCount = data.getRows().size();String message = String.format("DELETE事件:表 %s 删除了 %d 行数据", tableName, rowsCount);binlogChanges.offer(message);}}});// 连接并开始监听 binlogclient.connect();}// 获取最新的 binlog 数据变化public LinkedBlockingQueue<String> getBinlogChanges() {return binlogChanges;}
}

2.3 配置应用属性

application.properties 中配置 MySQL 的连接信息:

mysql.host=localhost
mysql.port=3306
mysql.username=binlog_user
mysql.password=password

2.4 创建 Controller 来处理 binlog 数据

在 Controller 中,我们将监听到的 binlog 变化通过模型传递给前端页面。在这个 Controller 中,index() 方法将 binlog 变化数据传递给前端页面。

package com.example.demo.controller;import com.example.demo.service.BinlogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;@Controller
public class BinlogController {@Autowiredprivate BinlogService binlogService;@GetMapping("/")public String index(Model model) {model.addAttribute("binlogChanges", binlogService.getBinlogChanges());return "binlog";}
}

2.5 确保监听器在正确的位置启动

如果在启动时需要监听 binlog 数据变化,需要确保在合适的时机启动监听器。例如,可以在 @PostConstruct 方法中启动,也可以使用 Spring Boot 的 CommandLineRunnerApplicationRunner 来确保应用启动后执行相关任务。

package com.example.demo.config;import com.example.demo.service.BinlogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;@Component
public class BinlogListenerRunner implements CommandLineRunner {@Autowiredprivate BinlogService binlogService;//    @PostConstruct
//    @Async  // 异步执行 binlog 监听
//    public void start() {
//    }@Overridepublic void run(String... args) throws Exception {try {binlogService.startListening();} catch (Exception e) {e.printStackTrace();}}
}

3. 使用 Bootstrap UI 展示数据变化

3.1 配置 Thymeleaf 模板

我们使用 Thymeleaf 模板引擎来动态渲染页面。首先,在 src/main/resources/templates 目录下创建一个 index.html 文件,并引入 Bootstrap UI 和 Thymeleaf 标签。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Binlog 数据变化展示</title><!-- 引入 Bootstrap CSS --><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container"><h1 class="text-center my-4">Binlog 数据变化监控</h1><!-- 动态展示数据变化 --><div id="binlogChanges" class="row"><div class="col-md-4" th:each="change : ${binlogChanges}"><div class="card mb-3"><div class="card-body"><h5 class="card-title">数据变化</h5><p class="card-text" th:text="${change}"></p><button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#changeDetailsModal"th:attr="data-bs-whatever=${change}">查看详情</button></div></div></div></div><!-- 模态框展示详细信息 --><div class="modal fade" id="changeDetailsModal" tabindex="-1" aria-labelledby="changeDetailsModalLabel" aria-hidden="true"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><h5 class="modal-title" id="changeDetailsModalLabel">数据变化详情</h5><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body"><p id="changeDetails">详细信息加载中...</p></div></div></div></div>
</div><script>var changeDetailsModal = document.getElementById('changeDetailsModal');changeDetailsModal.addEventListener('show.bs.modal', function (event) {var button = event.relatedTarget;var changeDetails = button.getAttribute('data-bs-whatever');var modalBody = changeDetailsModal.querySelector('.modal-body #changeDetails');modalBody.textContent = changeDetails;});
</script>
</body>
</html>

3.2 动态更新 binlog 数据

在页面加载时,通过 th:each 将后台的 binlog 变化数据动态展示在卡片中。每当新的数据变化被监听到,前端页面会自动更新并显示最新的变化。

3.3 效果展示

通过以上方法,您可以创建一个高效、可靠的实时数据监听与展示系统。

请在此添加图片描述


4. 总结与优化

4.1 总结

通过结合 Spring Boot 框架和腾讯云 MySQL 服务,利用 binlog 监听 MySQL 数据变化并在前端展示,我们能够实时捕捉并展示数据库的变化,极大地提升了系统的响应性和实时性。在前端,我们使用了 Bootstrap UI 组件,如卡片、按钮和模态框,创建了一个用户友好的界面。

4.2 优化与扩展

  • 实时推送:目前的实现通过轮询获取数据,可以考虑使用 WebSocket 来实现实时推送,减少轮询带来的性能开销。
  • 数据过滤与精确化:根据业务需求,可以对监听到的 binlog 数据进行精确过滤,仅处理特定的表或操作。
  • 日志与监控:在生产环境中,记录日志并进行健康监控对于高可用系统至关重要,可以考虑集成 Spring Boot Actuator 进行系统健康检查。

5. 使用MySQL减轻轻量应用服务器功能压力

通过将数据存储和处理卸载到腾讯云MySQL,CVM可以专注于处理应用逻辑和业务需求,减轻数据库管理、查询优化、存储管理等方面的负担。腾讯云MySQL提供的高性能、自动化运维、分布式架构、数据安全等功能,有助于提升系统的稳定性、可扩展性和性能,进而减少CVM服务器的功能压力,使得整体系统更加高效、可靠。

请在此添加图片描述

5.1 集中式数据库管理

腾讯云MySQL是一个完全托管的数据库服务,用户无需担心数据库的硬件资源、备份、维护和高可用性配置等问题。通过使用腾讯云MySQL,CVM可以将业务逻辑的复杂性转移到数据库层,减轻服务器的处理负担。

5.2 优化数据库查询性能

腾讯云MySQL拥有丰富的查询优化工具和调优功能(如查询缓存、索引优化、SQL调优等),通过合理的设计和配置,可以显著提高数据库的查询性能,减轻CVM服务器的负担。

5.3 分布式数据库架构

腾讯云MySQL支持分布式数据库架构(如读写分离、分表分库、Sharding等)。通过合理配置,可以将数据库负载分散到多个节点上,避免单一CVM服务器的过载。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转&#xff1a; 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

PlantUML——时序图

PlantUML时序图 背景 时序图&#xff08;Sequence Diagram&#xff09;&#xff0c;又名序列图、循序图&#xff0c;是一种UML交互图&#xff0c;用于描述对象之间发送消息的时间顺序&#xff0c;显示多个对象之间的动态协作。时序图的使用场景非常广泛&#xff0c;几乎各行各…

算法——链表相交(leetcode23)

链表相交这题就是找出两个相交链表相交的节点并返回 如上图假设上方第一个节点是链表A的头结点下方第一个节点是链表B的头结点 解法有以下两种 方法一(移动长链表指针后同步移动两个链表的指针直至相等) 也就是先遍历链表A和链表B的长度接着得到链表A和B长度的差值然后领长链…

STM32单片机锁死

自己画了一块stm32f407板子&#xff0c;外部晶振用了25MHz&#xff0c;烧写了8MHz的程序&#xff0c;第一次烧写成功&#xff0c;第二次开始识别不到芯片&#xff0c;第一次烧写成功由于外部晶振为25Hz&#xff0c;芯片内频率计算器却是按照8MHz写的&#xff0c;所以得出最后的…

Windows文件资源管理器增强工具

引言&#xff1a; 资源管理器在我们使用电脑时是经常用到的&#xff0c;各种文件资源等的分类整理都离不开它。但是Windows Explorer确实不好用&#xff0c;不智能&#xff0c;不符合人体工程学。特别是在一些场合&#xff0c;在打开的一堆文件夹里&#xff0c;想从中找到自己要…

聚类中3个解空间的描述

深度学习中做分类任务时&#xff0c;我们常常根据最后的全连接层得到一组向量A&#xff08;比如&#xff1a;[0.9, 0.7, 0.2]&#xff09;&#xff0c;这组向量经过归一化得到向量B(比如&#xff1a;[0.5&#xff0c; 0.3&#xff0c; 0.2])&#xff0c;再根据B向量采用概率最大…

Empirical analysis of hardware-assisted GPU virtualization

​ 年份&#xff1a;2019 作者&#xff1a;Anshuj Garg 会议&#xff1a;ESCI 出版商&#xff1a;IEEE 摘要 本篇文章对vGPU虚拟化的性能开销、调度算法的影响、同构与异构工作负载的干扰效应&#xff0c;以及PCI直通与vGPU的性能差异进行了研究。结果表明&#xff0c;vGP…

Java面试题2024-Java基础

Java基础 1、 Java语言有哪些特点 1、简单易学、有丰富的类库 2、面向对象&#xff08;Java最重要的特性&#xff0c;让程序耦合度更低&#xff0c;内聚性更高&#xff09; 3、与平台无关性&#xff08;JVM是Java跨平台使用的根本&#xff09; 4、可靠安全 5、支持多线程 2、…

【案例分享】运用 Infragistics Ultimate UI 让工业物联网 IIoT 数据流更易于访问

客户概况 贝克休斯旗下的 Bently Nevada 是状态监测和资产保护领域的全球领导者。该公司拥有 60 多年的专业知识&#xff0c;在全球安装了超过 600 万个传感器和 100,000 个机架监测系统。 如今&#xff0c;Bently Nevada的开发团队正在使用现代 UI 工具包来增强他们的系统&a…

PHM技术:基于支持向量机的智能故障诊断 | 行星齿轮箱智能故障诊断

目录 1.数据获取 2.特征提取与选择 3.健康状态识别 1.数据获取 用的行星齿轮箱数据采集自图1中的多级齿轮传动系统实验台中&#xff0c;在实验过程中&#xff0c;分别模拟了8种行星齿轮箱的健康状态&#xff0c;包括正常、第一级太阳轮点蚀、第一级太阳轮齿根裂纹、第一级…

推荐一款Windows系统精简工具:NTLite

NTLite是一款可以对Windows系统优化的安装工具&#xff0c;使用这款完全中文的NTLite授权注册版让你不会因为注册或者语言导致无法正常的使用&#xff0c;如果你正需要马上下载使用吧。 NTLite基本简介 NTLite 中文版可以用来做什么&#xff0c;它其实是一款 Windows 系统精简…

ESP-IDF VScode 项目构建/增加组件 新手友好!!!

项目构建 1.新建文件夹&#xff0c;同时在该文件夹内新建.c和.h文件 如图所示&#xff0c;在components中新建ADC_User.c、ADC_User.h、CMakeLists.txt文件。当然这里你也可以不在components文件夹内新建文件&#xff0c;下面会说没有在components文件夹内新建文件构建项目的方…

Node Exporter 可观测性最佳实践

Node Exporter 介绍 Node Exporter 是一个开源的 Prometheus 指标收集器&#xff0c;它提供了大量关于宿主机系统的关键指标&#xff0c;如 CPU、内存、磁盘和网络使用情况。在 Kubernetes 环境中&#xff0c;Node Exporter 对于监控集群节点的健康状况至关重要。本文将介绍如…

Spring Boot汽车资讯:科技与速度的交响

3系统分析 3.1可行性分析 通过对本汽车资讯网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本汽车资讯网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

外卖跑腿小程序源码如何满足多样需求?

外卖跑腿平台已经成了当代年轻人的便捷之选&#xff0c;校园中也不例外&#xff0c;那么外卖、跑腿小程序就需要满足用户多样化的需求&#xff0c;而这背后的源码扮演者最重要的角色。 用户类型的多样性 1.对上班族而言&#xff0c;他们希望外卖小程序能够快速下单、准确配送…

GeeRPC第一天 服务端与消息编码(1)

RPC 1. 系统架构图解释&#xff08;Graph&#xff09; 架构层次 RPC框架核心功能&#xff1a;这是系统的最上层&#xff0c;涵盖了框架的主要功能模块&#xff0c;直接与底层服务和用户交互。 服务层&#xff1a;主要负责服务的注册、发现和治理。 服务注册&#xff1a;将服务…

如何在谷歌浏览器中开启离线模式

在数字化时代&#xff0c;互联网已经成为我们生活中不可或缺的一部分。然而&#xff0c;有时候我们可能会遇到没有网络连接的情况&#xff0c;这时谷歌浏览器的离线模式就显得尤为重要。本教程将详细介绍如何在谷歌浏览器中轻松开启离线模式&#xff0c;并附带一些相关教程指南…

【进阶系列】正则表达式 #匹配

正则表达式 正则表达式是一个特殊的字符序列&#xff0c;它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使 Python 语言拥有全部的正则表达式功能。 一个正则表达式的匹配工具&#xff1a;regex101: build, test, and debug regex s "C:\\a\\b\\c" pri…

C++使用Alglib数学库进行非线性最小二乘拟合

目录 一、前言 二、主要函数分析 2.1 lsfitcreatef 2.2 lsfitsetcond 2.3 lsfitfit 2.4 lsfitresults 三、基础代码实现 3.1 定义待拟合函数 3.2 数据拟合 四、可视化代码实现 4.1 拟合h文件 4.2 拟合cpp文件 4.2 代码实验 一、前言 本文记录基于Alglib进行非线性…

Spring Boot汽车世界:资讯与技术的交汇

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…