mongodb netcore 操作封装_一个基于CanalSharp(一款针对.NET的Canal客户端开源项目)封装的ASP.NET Core业务组件...

本文介绍了如何使用CanalSharp.AspNetCore组件,一个基于CanalSharp的ASP.NET Core后台任务组件,来实现实时监听MySQL数据更改并将其同步到MongoDB。内容包括CanalSharp介绍、CanalServer的安装与配置,以及在.NET项目中集成CanalSharp.AspNetCore的步骤和示例。
摘要由CSDN通过智能技术生成

CanalSharp.AspNetCore

一个基于CanalSharp(一款针对.NET的Canal客户端开源项目)封装的ASP.NET Core业务组件,可以用于实时收集MySql数据更改记录并写入修改日志数据表中,可以选择MySql或者MongoDB作为输出记录。

关于CanalSharp

CanalSharp 是阿里巴巴开源项目 Canal 的 .NET 客户端。为 .NET 开发者提供一个更友好的使用 Canal 的方式。Canal 是mysql数据库binlog的增量订阅&消费组件,其作者是WithLin和晓晨。

更多关于CanalSharp的信息请浏览:https://github.com/CanalClient/CanalSharp

更多关于Canal的信息请浏览:https://github.com/alibaba/canal

关于此组件

CanalSharp.AspNetCore是一个基于CanalSharp的适用于ASP.NET Core的一个后台任务组件,它可以随着ASP.NET Core实例的启动而启动,目前采用轮询的方式对Canal Server进行监听,获得MySql行更改(RowChange)后写入MySql或MongoDB中指定的记录表中。

准备工作

当前的canal开源版本支持8.0及以下的版本,针对阿里云RDS账号默认已经有binlog dump权限,不需要任何权限或者binlog设置,可以直接跳过这一步。 开启binlog写入功能,并且配置binlog模式为row。

修改C:\ProgramData\MySQL\MySQL Server 5.7\my.ini的以下内容

log-bin=mysql-bin

binlog-format=Row

server-id=1

重启数据库服务,测试修改是否生效

show variables like 'binlog_format';

show variables like 'log_bin';

创建一个Canal用于获取binlog的用户并授予权限

CREATE USER canal IDENTIFIED BY canal;

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO canal @'%';

FLUSH PRIVILEGES;

安装Canal-Server

通过Docker拉取Canal镜像:

docker pull canal/canal-server:v1.1.2

通过以下命令启动Canal实例:

docker run --restart=always --name core_productservice_canal \

-e canal.instance.master.address=192.168.16.150:3306 \

-e canal.instance.dbUsername=canal \

-e canal.instance.dbPassword=canal \

-e canal.destinations=products \

-e canal.instance.defaultDatabaseName=products_dev \

-e canal.instance.filter.regex=products_dev\\..* \

-e canal.instance.filter.black.regex=products_dev\\.canal.* \

-p 8001:11111 \

-d canal/canal-server:v1.1.2

PS: 其中name、destinations、defaultDatabaseName、filter根据要监听的业务数据库按需修改。

使用CanalSharp.AspNetCore

首先,通过NuGet或项目引用添加该组件,搜索CanalSharp.AspNetCore: |

其次,在配置文件(appSettings.json)中添加以下配置项:MySql和MongoDB是二选一的配置,不可同时设置。

"Canal": {

"Enabled": true,

"LogSource": "Core.Product.Canal",

"ServerIP": "192.168.16.190", // Canal-Server所在的服务器IP

"ServerPort": 8001, // Canal-Server所在的服务器Port

"Destination": "products", // 建议与Canal-Server中配置的destination保持一致

"Filter": "products_dev\\..*", // 建议与Canal-Server中配置的filter保持一致

"SleepTime": 50, // SleepTime越短监听频率越高但也越耗CPU

"BufferSize": 2048, // 每次监听获取的数据量大小,单位为字节

"Output": {

"MySql":{

"ConnStr": "Server=192.168.16.150;Port=3306;Database=products_dev;Uid=dev;Pwd=xdp" // 要输出的日志记录表所在的MySql连接字符串

},

"Mongo":{

"ConnStr": "mongodb://192.168.16.150:27017", // 要输出的日志记录表所在的MongDB连接字符串

"DataBase": "productrs_dev" // 要输出的日志记录表所在的MongDB数据库名

},

}

}

最后,在StartUp类中的Configure方法中加入以下代码行:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

{

......

app.UseCanalClient(Configuration);

}

示例项目

效果展示

当在指定要监听的数据库对某张表的某行数据进行Update或Delete操作后,又或者进行Insert行操作后。

MySql

如果选择输出到MySql数据库,那么canal.logs表会自动记录变更的记录数据如下图:

PS: INSERT操作会记录新增的数据行数据到CurrentValue列,DELETE操作会记录删除的数据行数据到PreviousValue列,UPDATE操作则会记录修改前PreviousValue和修改后的值CurrentValue。

MongoDB

如果选择输出到MongoDB,那么会自动记录变更数据如下图:

操作monodb的c#封装,调用非常方便,可以继承,功能包括: 1、所有数据库操作 2、前台表格类数据获取 public List GetList(List lstColName, Document query, JqGridParam jqParam, ref int count),封装了通用的获取前台表格数据的方法,将在工程中减少大量数据库访问代码,有了这个后对前台表格类查询我们可以不用在Control里使用linq或者封装在Model里然后对前台定义视图类了,使用如下: try { JqGridParam jqParam = new JqGridParam(); jqParam.page = 1; jqParam.rows = 1000; MemberOper memOper = new MemberOper(); MongoBasicOper monOper = new MongoBasicOper(DTName.GROUP_MEMBER); int count = 0; //过滤条件 Document query = new Document(); if (!string.IsNullOrEmpty(find)) { MongoRegex reg = new MongoRegex(".*" + find + ".*"); query.Add(DColName.Name, reg); } query.Add(DColName.GroupId, g); Document[] docStatus = new Document[] { new Document(DColName.Status, RowStatus.Pass), new Document(DColName.Status, RowStatus.Admin) }; query.Add("$or", docStatus); //查询列 List lstColName = new List(); lstColName.Add(DColName.UserId); lstColName.Add(DColName.UserName); //查询数据 var lstRes = monOper.GetListEx(lstColName, query, jqParam, ref count); //转换返回值 JqGrid jg = new JqGrid(); if (count == 0) { return Json(jg.toNull(jqParam), JsonRequestBehavior.AllowGet); } var jsonData = jg.toJson(jqParam, count, lstRes, lstColName); jsonData.param = g; return Json(jsonData, JsonRequestBehavior.AllowGet); } catch (Exception e) { return Json(e.Message, JsonRequestBehavior.AllowGet); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值