springboot整合canal实现对mysql数据库实时监控

2023-05-16

canal

      • Canal介绍
      • Mysql环境准备
      • 安装canal
      • springboot整合canal

Canal介绍

官网地址:https://github.com/alibaba/canal

canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费

早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。

基于日志增量订阅和消费的业务包括

数据库镜像
数据库实时备份
索引构建和实时维护(拆分异构索引、倒排索引等)
业务 cache 刷新
带业务逻辑的增量数据处理
当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x

Mysql环境准备

使用mysql5.1.x以上,我的mysql是8.0,27目前最新版

Mysql的安装可以去直接看教程windows安装mysql8.0.27

步骤1:创建一个canal用户,用来监控

-- 使用命令登录:mysql -u root -p
-- 创建用户 用户名:canal 密码:canal
create user 'canal'@'%' identified by 'canal';
-- 授权 *.*表示所有库
grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'canal'@'%';
-- 删除用户
drop user 'canal'@'%';

注意:因为我的mysql是8.0.27最新版,与之前的mysql版本相比,创建账号和赋予权限的方式已经分开,如果你们用的不是最新的mysql,创建用户和赋予权限方式不是我这样,以下是之前的方式

-- 使用命令登录:mysql -u root -p
-- 创建用户 用户名:canal 密码:canal
create user 'canal'@'%' identified by 'canal';
-- 授权 *.*表示所有库
grant SELECT, REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'canal'@'%' identified by 'canal';

步骤2:在Mysql配置文件my,ini,添加以下内容:

[mysqld]
# 打开binlog
log-bin=mysql-bin
# 选择ROW(行)模式
binlog-format=ROW
# 配置MySQL replaction需要定义,不要和canal的slaveId重复
server_id=1

步骤3:修改之后,重启mysql,使用以下命令查看所需要的信息

  • 查看是否打开binlog模式
-- 查看是否打开binlog模式
show VARIABLES like '%log_bin%'

在这里插入图片描述
OFF是未开启,ON是已开启

  • 查看binlog日志文件列表
-- 查看binlog日志文件列表
show binary logs;
  • 查看当前正在写入的binlog文件
-- 查看当前正在写入的binlog文件
show master status;

安装canal

步骤1:资源下载

下载地址:https://github.com/alibaba/canal/releases

在这里插入图片描述

步骤2:解压下载好的资源(canal.deployer-1.1.5.tar.gz),到指定目录(随意)

在这里插入图片描述

步骤3:打开conf/example/instance.properties文件

  • 未修改前
#################################################
## mysql serverId , v1.0.26+ will autoGen
# canal.instance.mysql.slaveId=0

# enable gtid use true/false
canal.instance.gtidon=false

# position info
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=

# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=

# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal

#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=

# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

# table regex
canal.instance.filter.regex=.*\\..*
# table black regex
canal.instance.filter.black.regex=mysql\\.slave_.*
# table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch

# mq config
canal.mq.topic=example
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*
canal.mq.partition=0
# hash partition config
#canal.mq.partitionsNum=3
#canal.mq.partitionHash=test.table:id^name,.*\\..*
#canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6
#################################################

  • 修改后
#################################################
## mysql serverId , v1.0.26+ will autoGen
# canal.instance.mysql.slaveId=0

# enable gtid use true/false
canal.instance.gtidon=false

# 数据库地址
canal.instance.master.address=127.0.0.1:3306
# binlog日志名称
canal.instance.master.journal.name=mysql-bin.000001
# mysql主库连接时起始的binlog偏移量
canal.instance.master.position=156
# mysql主库连接时起始的binlog时间戳
canal.instance.master.timestamp=
canal.instance.master.gtid=

# rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=

# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal

#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#canal.instance.standby.gtid=

# username/password
# 在mysql服务器授权的账号密码
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8
# enable druid Decrypt database password
canal.instance.enableDruid=false
#canal.instance.pwdPublicKey=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALK4BUxdDltRRE5/zXpVEVPUgunvscYFtEip3pmLlhrWpacX7y7GCMo2/JM6LeHmiiNdH1FWgGCpUfircSwlWKUCAwEAAQ==

# table regex .*..*表示监听所有表 也可以写具体的表名,用,隔开
canal.instance.filter.regex=.*\\..*
# table black regex  mysql 数据解析表的黑名单,多个表用,隔开
canal.instance.filter.black.regex=
# table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch

# mq config
canal.mq.topic=example
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*
canal.mq.partition=0
# hash partition config
#canal.mq.partitionsNum=3
#canal.mq.partitionHash=test.table:id^name,.*\\..*
#canal.mq.dynamicTopicPartitionNum=test.*:4,mycanal:6
#################################################

因为我这是在本地windows系统上进行演示的,所以在bin目录下找到startup.bat启动

在这里插入图片描述
然后打开logs/canal/canal.log文件,看到内容没有异常信息,说明成功

在这里插入图片描述

springboot整合canal

步骤1:引入所需依赖

 	   <dependency>
            <groupId>com.alibaba.otter</groupId>
            <artifactId>canal.client</artifactId>
            <version>1.1.3</version>
        </dependency>

步骤2:新建一个CanalClient.java类,用来监听mysql

package com.myqxin.controller;

import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.alibaba.otter.canal.protocol.CanalEntry;
import org.springframework.beans.factory.InitializingBean;
import com.alibaba.otter.canal.protocol.Message;
import org.springframework.stereotype.Component;

import java.net.InetSocketAddress;
import java.util.List;

@Component
public class CanalClient implements InitializingBean {


    private final static int BATCH_SIZE = 1000;


    @Override
    public void afterPropertiesSet() throws Exception {
        // 创建链接
        CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("127.0.0.1", 11111), "example", "root", "9527");
        try {
            //打开连接
            connector.connect();
            //订阅数据库表,全部表
            connector.subscribe(".*..*");
            //回滚到未进行ack的地方,下次fetch的时候,可以从最后一个没有ack的地方开始拿
            connector.rollback();
            while (true) {
                // 获取指定数量的数据
                Message message = connector.getWithoutAck(BATCH_SIZE);
                //获取批量ID
                long batchId = message.getId();
                //获取批量的数量
                int size = message.getEntries().size();
                //如果没有数据
                if (batchId == -1 || size == 0) {
                    try {
                        //线程休眠2秒
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    //如果有数据,处理数据
                    printEntry(message.getEntries());
                    List<CanalEntry.Entry> entries = message.getEntries();
                }
                //进行 batch id 的确认。确认之后,小于等于此 batchId 的 Message 都会被确认。
                connector.ack(batchId);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            connector.disconnect();
        }
    }

    /**
     * 打印canal server解析binlog获得的实体类信息
     */
    private static void printEntry(List<CanalEntry.Entry> entrys) {
        for (CanalEntry.Entry entry : entrys) {
            if (entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONBEGIN || entry.getEntryType() == CanalEntry.EntryType.TRANSACTIONEND) {
                //开启/关闭事务的实体类型,跳过
                continue;
            }
            //RowChange对象,包含了一行数据变化的所有特征
            //比如isDdl 是否是ddl变更操作 sql 具体的ddl sql beforeColumns afterColumns 变更前后的数据字段等等
            CanalEntry.RowChange rowChage;
            try {
                rowChage = CanalEntry.RowChange.parseFrom(entry.getStoreValue());
            } catch (Exception e) {
                throw new RuntimeException("ERROR ## parser of eromanga-event has an error , data:" + entry.toString(), e);
            }
            //获取操作类型:insert/update/delete类型
            CanalEntry.EventType eventType = rowChage.getEventType();

            //判断是否是DDL语句
            if (rowChage.getIsDdl()) {
                System.out.println("是DDL语句" + rowChage.getSql());
            }

            // 根据不同的语句类型,处理不同的业务
            if (eventType == CanalEntry.EventType.INSERT) {
                // 是新增语句,业务处理。如果新增的时候数据没有发生变化的情况下,是不会被执行
                System.out.println("库名:" + entry.getHeader().getSchemaName() + "-- 表名:" + entry.getHeader().getTableName() + "新增数据");
                // 获取RowChange对象里面的每一行信息
                for (CanalEntry.RowData rowData : rowChage.getRowDatasList()) {
                    printColumn(rowData.getAfterColumnsList());
                }
            } else if (eventType == CanalEntry.EventType.DELETE) {
                // 是删除语句,业务处理。如果删除的时候是没有数据的情况下,是不会被执行
                System.out.println("库名:" + entry.getHeader().getSchemaName() + "-- 表名:" + entry.getHeader().getTableName() + "删除数据");
                // 获取RowChange对象里面的每一行信息
                for (CanalEntry.RowData rowData : rowChage.getRowDatasList()) {
                    printColumn(rowData.getBeforeColumnsList());
                }
            } else if (eventType == CanalEntry.EventType.UPDATE) {
                // 是修改语句,业务处理。如果修改的时候是没有修改任何数据的情况下,是不会被执行
                System.out.println("库名:" + entry.getHeader().getSchemaName() + "-- 表名:" + entry.getHeader().getTableName() + "修改数据");
                // 获取RowChange对象里面的每一行信息 
                for (CanalEntry.RowData rowData : rowChage.getRowDatasList()) {
                    printColumn(rowData.getBeforeColumnsList());
                    printColumn(rowData.getAfterColumnsList());
                }
            }
        }
    }

    private static void printColumn(List<CanalEntry.Column> columns) {
        for (CanalEntry.Column column : columns) {
            System.out.println(column.getName() + " : " + column.getValue() + "    update=" + column.getUpdated());
        }
    }


}

在这里插入图片描述
这里的内容,ip为你当前服务器的地址,端口为canal服务端口,可以在\canal.deployer-1.1.5\logs\canal\canal.log文件里面看到

在这里插入图片描述
example是在\canal.deployer-1.1.5\conf\example\instance.properties文件里面查看

在这里插入图片描述
后面两个参数就是你数据库的账号和密码,用root的账号和密码(不使用canal账号)

以上代码只做简单的演示打印,没有业务代码

步骤3:测试

  • 新建表语句(DDL)
-- 创建表
CREATE TABLE `sx_test_a` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `number` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '编号',
  `indexes` int(11) DEFAULT NULL COMMENT '索引',
  `date_time` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '时间',
  `monitor_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '监测因子',
  `monitor_value` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '监测值',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

在这里插入图片描述
控制台打印如下:

在这里插入图片描述

  • 新增数据
-- 新增数据
insert  into `sx_test_a`(`id`,`number`,`indexes`,`date_time`,`monitor_name`,`monitor_value`) values 
(1,'22',11,'2021-10-10','myqxin','23423');

在这里插入图片描述
控制台打印如下:

在这里插入图片描述

  • 修改数据
-- 修改数据
update sx_test_a set monitor_name = '子非我鱼' where id = 1;

在这里插入图片描述
控制台打印如下:

在这里插入图片描述

  • 删除数据
-- 删除数据
delete from sx_test_a

在这里插入图片描述
控制台打印如下:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot整合canal实现对mysql数据库实时监控 的相关文章

  • python之requests之post请求简单使用(亲测可用)

    import requests url 61 34 http tms test Home api login html 34 payload 61 34 0000013200020230511 34 headers 61 39 Conten
  • python之wxpython简单使用亲测可用

    测试源码如下 xff08 只是创建了一个窗体然后设置窗体名称 xff09 xff1a import wx class MyFrame wx Frame def init self super init None title 61 34 我不
  • vs2022调用python脚本(亲测可用)

    一 新建一个控制台项目 二制作python环境文件夹 以上是安装好的python环境 此时在新建的控制台项目下新建一个python37文件夹 将一下这个几个文件和文件夹拷贝过去 如图 修改vs工程属性
  • freertos内核--任务调度剖析

    前言 在使用freertos的时候 xff0c 我们都知道在创建了一系列任务之后 xff0c 启用调度器 xff0c 系统就可以帮我们管理任务 xff0c 分配资源 本文主要对调度器的原理进行剖析 xff0c 从vTaskStartSche
  • 二进制信号量

    二进制信号量能够满足任务间的互斥和同步 xff0c 需要的系统开销最小 xff0c 因此也称快速信号量 二进制信号量可以看成一个标志 xff0c 对应资源是可用还是不可用 本小节就来认识二进制信号量的创建等过程 首先要添加一个头文件free
  • STM32自学之SPI的DMA操作(寄存器级)

    STM32自学之SPI的DMA操作 xff08 寄存器级 xff09 一 实验目标 学会配置STM32的SPI寄存器和DMA寄存器 xff0c 实现STM32的SPI1与SPI2通信功能 xff0c 每次发送一字节数据 xff0c 并可多次
  • win11无法设置移动热点

    win11无法设置移动热点 WIN10电脑热点打不开 win11电脑热点打不开 xff0c 都可以参照操作 xff0c 费力九牛二虎之力 xff0c 终于搞定 xff0c 分享给遇见同类问题的同学 xff0c 希望能帮助解决你的烦恼 具体操
  • 【node】升级 Node 版本教程

    文章目录 Window 系统Mac 或 Linux系统 Window 系统 window系统升级node只能到node官网下载window安装包来覆盖之前的node node 安装教程附下载地址 xff1a https blog csdn
  • 惠普关闭 secure boot

    一般新买的win10电脑 xff0c 是无法安装ubuntu的 xff0c 需要关闭 secure boot 开机f1进bios xff0c 改成英文 advanced secure boot configuration config le
  • ubuntu22.04运行qq音乐

    把启动图标参数改为 Exec 61 opt qqmusic qqmusic no sandbox U
  • Ubuntu环境下仿真gazebo的出现的错误的解决方法

    在运行gazebo的会出现几个错误 xff0c 下面几个总结是我在用Ubuntu的gazebo仿真时候出现的几个错误 xff0c 希望对大家在仿真的时候会有所帮助 1 xff1a ros update出错 解决方法 xff1a curl s
  • ros功能包的创建(详细版)

    这个ros功能包的创建流程 xff0c 适合初学的小白 1 xff1a 找一个合适的目录创建一个文件夹 xff0c 本文目录选择了一个名字是ac的文件夹来创建功能包 xff0c 新创建文件夹的名字可以随便起 xff0c 建议最好用英文 xf
  • 如何下载Windows11原版程序光盘映像文件(iso)

    此处采用官网下载 以win11为例 1 进入windows官网 xff0c 链接 xff1a Download Windows11 2 找到 下载win11磁盘映像iso 模块 xff0c 点击 选择下载项 3 下载项目有两个 xff0c
  • 解决The repository ‘http://security.ubuntu.com/ubuntu impish-security Release

    将 etc apt下的sources list的内容全都注释掉 xff0c 然后换成下面的内容 xff1a deb http old releases ubuntu com ubuntu impish main restricted uni
  • if判断的时候,程序不报错,但输出结果不对

    if判断的时候 xff0c 程序不报错 xff0c 但输出结果不对 其中的一个可能的原因是 xff1a 判断语句中少加了等号 如 xff1a if a 61 b 这样不报错 xff0c 但结果不对 应该是两个等号 xff0c 因为一个等号是
  • 学习笔记26-- 在solidwork里面绘制世界环境,制作成gazebo的.world世界文件基本方法

    环境 ubuntu16 04 ros kinetic gazebo7 16 基础要求 基础的urdf文件launch文件内容 能够理解并可以参考编写 问题来源 仿真时候 机器人可能需要各种形式的世界环境 虽然gazebo里面有创建世界建模工
  • 最新嵌入式学习交流群

    老铁们 大家可以帮忙顶顶帖子 帮助更多的伙伴 可以加咱们的学习交 流 裙 611386401 嵌入式物联网创客3 大家手动添加下 更多学习资料 和行业资讯 每天我都会更新的 你可以在咱们裙 免费结识行业精英 有什么不懂得随时问我和裙友 每天
  • 绝对路径! 报错:[gazebo-2] process has died [pid 2382, exit code 134

    当执行 roslaunch turtlebot gazebo turtlebot world launch world file 61 PATH时 xff0c 报错如下信息 xff1a 注 xff1a PATH 是你要打开的world对应的
  • 学习笔记30--ros-gazebo仿真的一些插件学习推荐以及一些urdf关节理解分享

    环境 ubuntu16 04 ros kinectic gazebo7 16 lt 一 gt gazebo支持以下几种插件类型 并且所有插件类型都可以链接到ros 但只能通过urdf文件引用 ModelPlugins xff0c 提供对Ph
  • 学习笔记32--仿真使用的urdf的物理属性定义解析

    环境 ubuntu16 04 ros kinetic gazebo7 16 导入 搞项目不一定要等到实际机器人结构出来 才能测试代码的 很多时候需要根据需要手动编写urdf来仿真测试的 那么 仿真时候 机器人的一些摩擦系数转动惯量是怎么定义

随机推荐

  • 学习笔记35-- 仿真时用到的d435以及16线雷达在urdf中定义以及launch注意点

    环境 ubuntu16 04 ros kinetics gazebo7 16 来源 仿真有d435以及16线雷达的urdf编写 注意 urdf采用的是 xacro编写的 d435 16vel urdf xacro span class to
  • 杂记7--opencv的ar码模块学习

    背景 xff1a 项目需要用到marker知识 xff0c 所以到官网上临时补一些知识 概要 xff1a 主要介绍marker一些接口的含义 xff0c 纯属个人理解 xff0c 有误则希望大佬不吝赐教 1 涉及ar码操作学习 xff0c
  • Maven-3.6.1下载与环境搭建(解决IDEA兼容问题)及其配置

    Maven 3 6 1下载与环境搭建 xff08 解决IDEA兼容问题 xff09 及配置 Maven下载路径配置系统环境路径配置测试 Maven的文件目录结构解析IDEA中Maven的配置IDEA中Maven的全局配置 注意 xff1a
  • 构建一个arm裸板轻量级的printf

    构建一个arm裸板轻量级的printf span class token keyword typedef span span class token keyword char span span class token operator s
  • 二维小游戏,飞机大战,图片素材

    二维小游戏 xff0c 飞机大战 xff0c 图片素材 高清大图下载链接 https download csdn net download qq 45706825 15042600
  • hallib_RTC

    RTC 一 配置参数 1 2 只有使能RTC之后才能选LSE 二 编写应用代码 1 在mspinit里面加上这个函数 xff0c 打开秒中断 xff0c 这个函数在 h文件里面 span class token function HAL R
  • hullib_Tim3TiggerAdc1

    Tim3TiggerAdc1 只有Tim3才可以用更新 xff08 TIM TRGO UPDATE xff09 触发adc xff0c 其他定时器都要用输出比较模式才可以 一 cubmax配置 1 配置tim3为500ms更新 xff0c
  • hullib_AdcBase

    AdcBase 也就是不用中断 xff0c 每次用软件触发的简单操作 一 cubmax配置 1 选好通道就可以了 xff0c 其他都不用管 二 需要编写的代码 1 在main函数while里面写上 span class token keyw
  • hullib_eeprom

    EEPROM 这个模拟iic真的搞了好久啊 xff0c 最后发现这个24c02写完之后至少要延时4ms再来读才可以 xff0c 要不然读的时候都是NACK 一 时序 自己看数据手册吧
  • hullib_PwmCapture

    PwmCapture 需要两个channel 一 cubemx配置 一个上升沿捕获 xff0c 一个下降沿捕获 打开中断 二 自己写的代码 1 开启两个通道的中断 span class token function HAL TIM IC S
  • 2021-03-16

    hullib Rtc 获取时间之后必须获取日期他才会有时间 HAL RTC GetTime amp hrtc amp sTime RTC FORMAT BIN HAL RTC GetDate amp hrtc amp sDate RTC F
  • hullib_PwmOutput

    hullib PwmOutput 一 cubmx需要配置的 1 这里一定是pwm Generation 而不是pwm outcompare 使用定时器的PWM模式只能在4个通道产生频率相同但占空比不同的输出信号 使用定时器的输出比较模式可以
  • 计算机类非全日制研究生

    北京市 10002 中国人民大学 院系所专业研究方向考试范围 159 信息学院 xff08 专业学位 xff09 085400 专业学位 电子信息 02 软件工程领域 xff08 非全 xff09 详情 159 信息学院 xff08 专业学
  • 史上最详细的Docker 镜像的制作-上传-拉取--部署(阿里云)

    Docker 镜像的制作 上传 拉取 部署 一 镜像 xff08 images xff09 1 什么是镜像 xff1f 2 镜像的组成和用途 xff08 1 xff09 Dockerfile xff08 2 xff09 scratch xf
  • 机动目标跟踪-Singer模型,当前统计模型,交互多模型与卡尔曼滤波的结合

    文章目录 非机动目标跟踪算法原理一 Singer 模型算法二 当前统计模型算法三 交互多模型算法 实验仿真一 低机动情况1 1 Singer模型参数设置1 2 当前统计模型参数设置1 3交互多模型参数设置1 4 对比分析 二 一般机动情况2
  • 用大白话解析函数调用,系统调用和API之间的关系

    一 官方的解释 大概了解一下 函数调用 函数调用是计算机编或运行时 xff0c 使用某个函数来完成相关命令 系统调用 系统调用是用户在程序中使用 访管指令 调用由操作系统提供的子功能集合 API 应用编程接口 xff08 Applicati
  • docker删除所有容器和镜像

    确保自己有权限 xff0c 一般先执行下面的命令获取管理员权限 span class token function sudo span span class token function su span 1 杀死运行的容器 xff1a sp
  • Docker镜像制作与仓库搭建

    Docker 1 xff0c docker镜像制作2 xff0c docker仓库搭建 1 xff0c docker镜像制作 docker官方和个人发布的镜像由于版本等各种原因 xff0c 漏洞较多 xff0c 已统计Docker Hub超
  • 2019年全国大学生电子设计竞赛赛题分享与浅析

    0 ti杯2019年全国大学生电子设计竞赛赛题已于今晨公布 其中赛题分为本科组与高职高专组 xff1a 本科组 xff1a A 电动小车动态无线充电系统 B 巡线机器人 C 线路负载及故障检测装置 D 简易电路特性测试仪 E 基于互联网的信
  • springboot整合canal实现对mysql数据库实时监控

    canal Canal介绍Mysql环境准备安装canalspringboot整合canal Canal介绍 官网地址 xff1a https github com alibaba canal canal k n l xff0c 译意为水道