1 概述

mysql、MongoDB数据变动监听分发 本项目意在简化监听mysql、MongoDB数据库的不同表的各种数据变动 项目依赖redis,mysql 使用场景:刷新缓存、异构系统...

2 使用方式

从bin-log-distributor-app到client数据分发方式的默认实现为redis,如果要开发基于其他的比如mq,只需要分别实现bin-log-distributor-pub下的DataPublisher接口与bin-log-distributor-client下的即可

2.1 服务端

服务端是项目中bin-log-distributor-app模块,在mysql-binlog-connector-java基础上提供了监听mysql数据库二进制日志并进行分发的功能

2.1.1 参考配置

# redis地址

spring.redisson.address=redis://192.168.1.204:6379

# mysql日志同步账户,

binaryLog.host = 192.168.1.204

binaryLog.port = 3306

binaryLog.username = aa

binaryLog.password = aa

binaryLog.serverId = 1

# 读取列名,进行映射

spring.datasource.url = jdbc:mysql://${binaryLog.host}:${binaryLog.port}/mysql?autoReconnect=true&useUnicode=true&characterEncoding=utf-8

spring.datasource.username = ${binaryLog.username}

spring.datasource.password = ${binaryLog.password}

spring.datasource.driverClassName = com.mysql.jdbc.Driver

# rabbitmq连接相关信息(如果只有redis客户端可以不需要使用)

spring.rabbit.host = 192.168.1.204

spring.rabbit.port = 5672

spring.rabbit.username = aa

spring.rabbit.password = aa

spring.rabbit.virtualHost = /binlog

2.1.2 启动方式

编译打包项目,直接通过(java -jar)启动bin-log-distributor-app-${version}-SNAPSHOT.jar,可参考spring boot手册

2.2 客户端

2.2.1 redis客户端

2.2.1.1 引入依赖包

cn.keking.project

bin-log-distributor-client-redis

${version}

2.2.1.2 添加客户端配置

#自动注册客户端(2.1中服务端的地址)

databaseEventServerUrl=http://localhost:8885/client/addAll

#本应用命名

appName=lbt-service-ext-redis

# redis地址

spring.redisson.address=redis://192.168.1.204:6379

2.2.1.3 写handler,实现 DatabaseEventHandler 接口,并加上注解 @HandleDatabaseEven

/**

* LockLevel为保持顺序的级别,None为默认

* TABLE -> 同表按顺序执行

* COLUMN -> 某列值一致的按顺序执行

* NONE -> 无序

*/

@Service

@HandleDatabaseEvent(database = "Rana_G", table = "PTP_PROJ_REP_HIS", events = {DatabaseEvent.UPDATE_ROWS, DatabaseEvent.DELETE_ROWS},lockLevel = LockLevel.TABLE)

public class ProjRepHisDatabaseEventHandler implements DatabaseEventHandler {

private static final Logger logger = LoggerFactory.getLogger(ProjRepHisDatabaseEventHandler.class);

@Override

public void handle(EventBaseDTO eventBaseDTO) {

logger.info(JSON.toJSONString(eventBaseDTO));

// todo 在这里写相关逻辑

}

}

2.2.1.4 启动监听,当2里的handler是由容器管理时需要通过registerHandler(projRepHisDatabaseEventHandler)手动注册,如果不需要容器管理,可以直接通过autoScanHandler()自动扫描添加

@Component

public class DatabaseEventListener {

private static Logger logger = LoggerFactory.getLogger(DatabaseEventListener.class);

@Autowired

private RedissonClient redissonClient;

@Value("#{env.databaseEventServerUrl}")

private String serverUrl;

@Value("#{env.appName}")

private String appName;

//将第3步里的service注入

@Autowired

private ProjRepHisDatabaseEventHandler projRepHisDatabaseEventHandler;

@PostConstruct

public void start() {

//初始化订阅的实现

DataSubscriber dataSubscriber = new DataSubscriberRedisImpl(redissonClient);

new BinLogDistributorClient(appName, dataSubscriber)

//在binlog中注册handler

.setQueueType(ClientInfo.QUEUE_TYPE_REDIS)

.registerHandler(projRepHisDatabaseEventHandler)

.setServerUrl(serverUrl).autoRegisterClient().start();

}

}

2.2.2 rabbitmq客户端

2.2.2.1 引入依赖包

cn.keking.project

bin-log-distributor-client-rabbitmq

${version}

2.2.2.2 添加客户端配置

#自动注册客户端(2.1中服务端的地址)

databaseEventServerUrl=http://localhost:8885/client/addAll

#本应用命名

appName=lbt-service-ext-rabbit

# redis地址(rabbitmq实现也要使用redis作为分布式锁)

spring.redisson.address=redis://192.168.1.204:6379

# RabbitMQ配置

spring.rabbit.host=192.168.1.204

spring.rabbit.port=5672

spring.rabbit.username=aa

spring.rabbit.password=aa

spring.rabbit.virtualHost=/binlog

spring.rabbit.apiUrl=http://192.168.1.204:15672/api/

2.2.2.3 写handler,实现 DatabaseEventHandler 接口,并加上注解 @HandleDatabaseEven

/**

* LockLevel为保持顺序的级别,None为默认

* TABLE -> 同表按顺序执行

* COLUMN -> 某列值一致的按顺序执行

* NONE -> 无序

*/

@Service

@HandleDatabaseEvent(database = "Rana_G", table = "PTP_PROJ_REP_HIS", events = {DatabaseEvent.UPDATE_ROWS, DatabaseEvent.DELETE_ROWS},lockLevel = LockLevel.TABLE)

public class ProjRepHisDatabaseEventHandler implements DatabaseEventHandler {

private static final Logger logger = LoggerFactory.getLogger(ProjRepHisDatabaseEventHandler.class);

@Override

public void handle(EventBaseDTO eventBaseDTO) {

logger.info(JSON.toJSONString(eventBaseDTO));

// todo 在这里写相关逻辑

}

}

2.2.2.4 启动监听,当2里的handler是由容器管理时需要通过registerHandler(projRepHisDatabaseEventHandler)手动注册,如果不需要容器管理,可以直接通过autoScanHandler()自动扫描添加

@Component

public class DatabaseEventListener {

private static Logger logger = LoggerFactory.getLogger(DatabaseEventListener.class);

@Autowired

private RedissonClient redissonClient;

@Value("#{env.databaseEventServerUrl}")

private String serverUrl;

@Value("#{env.appName}")

private String appName;

//将第3步里的service注入

@Autowired

private ProjRepHisDatabaseEventHandler projRepHisDatabaseEventHandler;

//org.springframework.amqp.rabbit.connection.ConnectionFactory 自行创建spring bean

@Autowired

private ConnectionFactory connectionFactory;

//com.rabbitmq.http.client.Client 自行创建spring bean

@Autowired

private Client rabbitHttpClient;

@PostConstruct

public void start() {

//初始化订阅的实现

DataSubscriber dataSubscriber = new DataSubscriberRabbitMQImpl(connectionFactory, rabbitHttpClient, redissonClient);

new BinLogDistributorClient(appName, dataSubscriber)

//默认为redis实现,使用mq实现这里一定要指定QueueType

.setQueueType(ClientInfo.QUEUE_TYPE_RABBIT)

.registerHandler(projRepHisDatabaseEventHandler)

.setServerUrl(serverUrl).autoRegisterClient().start();

}

}

2.3 前端管理模块

前端管理服务模块是基于vue的管理各个应用监听状况的管理界面

新增MySQL数据源

数据源管理

日志进度

分发队列监控

新增数据订阅

3 其他

获取mongodb数据变更_支持mysql、MongoDB数据变更订阅/监听分发相关推荐

  1. mysql 不会丢失数据吗_讨论MySQL丢失数据的几种情况

    1. 概述 很多企业选择MySQL都会担心它的数据丢失问题,从而选择Oracle,但是其实并不十分清楚什么情况下,各种原因导致MySQL会丢失部分数据.本文不讨论Oracle和MySQL的优劣,仅仅关 ...

  2. mysql如何进行数据透视_使用MySQL的数据透视表

    为了在MySQL中转动数据,您需要同时使用聚合函数和CASE表达式. 如果您有已知数量的列,则可以对查询进行硬编码: select p.postid, max(case when t.tagname ...

  3. mysql cluster 数据文件_关于MYSQL CLUSTER数据文件存放节点错误问题 -问答-阿里云开发者社区-阿里云...

    SQL节点,DATA节点均已配置正常,但是出现一个匪夷所思的问题. 在33节点执行了建库脚本及建表脚本,发现数据文件在33和34两个SQL节点存在,按理说数据文件应该数据节点上的DATADIR. Co ...

  4. mysql数据传出_从MySQL读取数据,以List方式传出

    代码如下:publicListselectDb(){Listlist=newArrayList();InfoForminfo=newInfoForm();Statementsm=null;Result ...

  5. mysql 查看数据表大小_关于MySQL 查询表数据大小的总结

    一:关于MySQL表数据大小 我们知道mysql存储数据文件一般使用表空间存储 当mysql使用innodb存储引擎的时候,mysql使用表存储数据分为共享表空间和独享表空间两种方式 ·共享表空间:I ...

  6. 不动产测绘数据入库_房产基础地理信息数据生产管理与入库更新一体化

    随着城市面貌日新月异的变化和测绘地理信息产业的飞速发展,房产基础地理信息数据的更新周期越来越短,使得房产基础地理信息数据的生产管理和入库更新工作面临新的机遇和挑战. EPS(encapsulated ...

  7. java的for循环取出数据只是拿到最后一个_从MySQL中导数据到HBase

    前言 这个问题在网上已经一搜一大把了,为什么要自己亲手总结一下仅仅是因为最近自己公司新上了HBase然后使用Spark去读取MySQL的数据写入HBase的时候遇到了一些问题,也困扰了挺久 现在就详细 ...

  8. mysql双机数据热备份_配置MySQL数据库双机热备份

    1.mysql 数据库没有增量备份的机制,当数据量太大的时候备份是一个很大的问题.还好 mysql 数据库提供了一种主从备份的机制,其实就是把主数据库的所有的数据同时写到备份数据库中.实现 mysql ...

  9. bootstrap table无法服务器分页_[精选] MySQL百万数据,你如何用分页来查询数据

    文章来自:https://www.cnblogs.com/lxwphp/p/9237331.html 商务合作: 请加微信 2230304070 精选文章正文 在开发过程中我们经常会使用分页,核心技术 ...

最新文章

  1. 判断两个树是否相等和判断tree1是否包含tree2 python实现
  2. 设计模式之享元模式(Flyweight)摘录
  3. linux 替换内核 img,查看更改linux内核initrd.img-Go语言中文社区
  4. 腾讯姚星:两大科技矩阵助力两张网,立志攻克通用人工智能和多模态问题
  5. 【剑指offer-Java版】16反转链表
  6. 我也说说宏定义likely()和unlikely()
  7. 关闭uboot MMU 会导致android2.3 S5pv210 系统不稳定?!why
  8. mysql查询索引相关信息查询
  9. python怎么读取csv文件-使用Python读写csv文件的三种方法
  10. (转)Python之区块链入门
  11. 十年.十大经济金融事件
  12. 为什么调试的时候需要编译选项中添加 -g,readelf命令.
  13. 【渝粤教育】电大中专电商运营实操 (14)作业 题库
  14. 阿里巴巴实习 面试题
  15. 喉炎在临床上的症状表现
  16. 基于涂鸦智能开发的墨水屏座位管理器——2.嵌入式功能实现篇
  17. CSDN博客,Fer来也!
  18. 圆周率用计算机能算出来不,圆周率到底能不能算尽?人类拿超级计算机算了,结果不敢相信!...
  19. 链栈的定义、构建、入栈、出栈和取栈顶元素
  20. 20套各种风格影视动画公司响应式企业模电影上映影讯网站模板电影软件网页CSS模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响应

热门文章

  1. 详解:面向对象与面向过程的比较 类之间的关系:泛化、实现、依赖、关联、聚合、组合
  2. ios 点击出现另外一套tabbar_iOS开发中TabBar再次点击实现刷新效果
  3. 开启php的ssl,php怎么开启ssl?开启ssl的方法
  4. informix和mysql数据量_informix数据库知识积累
  5. 工作日的努力python_python计算上班时间的问题
  6. 交大c语言作业答案,西安交大c语言作业及答案详解.docx
  7. java.library.path hadoop_关于java:Hadoop“无法为您的平台加载本机Hadoop库”警告
  8. 用Python解决数据结构与算法问题
  9. springMVC+Spring+mybatis整合配置版与注解版
  10. Elasticsearch之批量操作bulk