Canal安装部署
1.下载安装包解压
2.mysql配置
2.1 启动binlog功能
- 查看是否启动
show variables like 'binlog_format%'
- 修改my.cnf配置
log-bin=mysql-bin #添加这一行就 ok
binlog-format=ROW #选择 row 模式
server_id=1 #配置 mysql replaction 需要定义,不能和canal的slaveId重复
2.2 赋权限
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;
3.修改配置
- conf/example/instance.properties
# username/password
canal.instance.dbUsername=root
canal.instance.dbPassword=
- bin/startup.cmd
set CANAL_OPTS= -DappName=otter-canal -Dlogback.configurationFile="D:\Code\Canal\conf\logback.xml" -Dcanal.conf="%canal_conf%"
4.启动
启动startup.cmd
5.使用
- pom.xml
<dependency>
<groupId>top.javatool</groupId>
<artifactId>canal-spring-boot-starter</artifactId>
<version>1.2.1-RELEASE</version>
</dependency>
- application.yml
canal:
server: 127.0.0.1:11111
destination: example
logging:
level:
root: info
top:
javatool:
canal:
client:
client:
AbstractCanalClient: error
- 实体类
@Setter
@Getter
@Table(name = "t_order_info")
public class OrderInfo implements Serializable {
public static final Integer STATUS_ARREARAGE = 0;//未付款
public static final Integer STATUS_ACCOUNT_PAID = 1;//已付款
public static final Integer STATUS_CANCEL = 2;//手动取消订单
public static final Integer STATUS_TIMEOUT = 3;//超时取消订单
public static final Integer STATUS_REFUND = 4;//已退款
public static final int PAYTYPE_ONLINE = 0;//在线支付
public static final int PAYTYPE_INTERGRAL = 1;//积分支付
@Column(name = "order_no")
private String orderNo;//订单编号
@Column(name = "user_id")
private Long userId;//用户ID
@Column(name = "product_id")
private Long productId;//商品ID
@Column(name = "delivery_addr_id")
private Long deliveryAddrId;//收货地址
@Column(name = "product_name")
private String productName;//商品名称
@Column(name = "product_img")
private String productImg;//商品图片
@Column(name = "product_count")
private Integer productCount;//商品总数
@Column(name = "product_price")
private BigDecimal productPrice;//商品原价
@Column(name = "seckill_price")
private BigDecimal seckillPrice;//秒杀价格
@Column(name = "intergral")
private Long intergral;//消耗积分
@Column(name = "status")
private Integer status = STATUS_ARREARAGE;//订单状态
@Column(name = "create_date")
private Date createDate;//订单创建时间
@Column(name = "pay_date")
private Date payDate;//订单支付时间
@Column(name = "pay_type")
private Integer payType;//支付方式 1-在线支付 2-积分支付
@Column(name = "seckill_date")
private Date seckillDate;//秒杀的日期
@Column(name = "seckill_time")
private Integer seckillTime;// 秒杀场次
@Column(name = "seckill_id")
private Long seckillId;//秒杀商品ID
@Override
public String toString() {
return "OrderInfo{" +
"orderNo='" + orderNo + '\'' +
", userId=" + userId +
", productId=" + productId +
", deliveryAddrId=" + deliveryAddrId +
", productName='" + productName + '\'' +
", productImg='" + productImg + '\'' +
", productCount=" + productCount +
", productPrice=" + productPrice +
", seckillPrice=" + seckillPrice +
", intergral=" + intergral +
", status=" + status +
", createDate=" + createDate +
", payDate=" + payDate +
", payType=" + payType +
", seckillDate=" + seckillDate +
", seckillTime=" + seckillTime +
", seckillId=" + seckillId +
'}';
}
}
- 监听类
@Slf4j
@Component
@CanalTable(value = "t_order_info")
public class OrderaInfoHandler implements EntryHandler<OrderInfo> {
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public void insert(OrderInfo orderInfo) {
log.info("当有数据插入的时候会触发这个方法");
System.out.println(orderInfo);
}
@Override
public void update(OrderInfo before, OrderInfo after) {
log.info("当有数据更新的时候会触发这个方法");
System.out.println(before);
System.out.println(after);
}
@Override
public void delete(OrderInfo orderInfo) {
log.info("当有数据删除的时候会触发这个方法");
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)