Canal 微服务项目搭建

项目介绍

许多高并发业务中,我们都需要搭建一个微服务,用于读取canal监听到的变更日志,微服务名字叫xxx-canal。

项目参考地址:https://github.com/NormanGyllenhaal/canal-client

项目搭建

拿秒杀系统为例子,我们搭建seckill-canal微服务

该微服务项目我们需要引入canal-spring-boot-autoconfigure包,并且需要实现EntryHandler<T>接口,该接口中有3个方法,分别为insert、update、delete,这三个方法用于监听数据增删改变化。

1. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>seckill-service</artifactId>
        <groupId>com.seckill</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>seckill-canal</artifactId>

    <dependencies>
        <!--web-->
        <dependency>
            <groupId>com.seckill</groupId>
            <artifactId>seckill-web</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!--esAPI-->
        <dependency>
            <groupId>com.seckill</groupId>
            <artifactId>seckill-search-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!--goodsAPI-->
        <dependency>
            <groupId>com.seckill</groupId>
            <artifactId>seckill-goods-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!--canal-->
        <dependency>
            <groupId>top.javatool</groupId>
            <artifactId>canal-spring-boot-autoconfigure</artifactId>
            <version>1.2.1-RELEASE</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定该Main Class为全局的唯一入口 -->
                    <mainClass>com.seckill.CanalApplication</mainClass>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal><!--可以把依赖的包都打包到生成的Jar包中-->
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

2. bootstrap.yml配置

我们需要添加canal的配置:

#Canal配置
canal:
  server: canal-server:11111
  destination: example

完整yaml如下:

server:
  port: 18088
spring:
  application:
    name: seckill-canal
  cloud:
    nacos:
      config:
        file-extension: yaml
        server-addr: nacos-server:8848
      discovery:
        #Nacos的注册地址
        server-addr: nacos-server:8848
#超时配置
ribbon:
  ReadTimeout: 3000000
#Canal配置
canal:
  server: canal-server:11111
  destination: example
#日志
logging:
  level:
    root: error

3. 实现EntryHandler接口

创建com.seckill.handler.SkuHandler实现EntryHandler接口,@CanalTable注解会关联相应的数据表,代码如下:

package com.seckill.canal;

import com.alibaba.fastjson.JSON;
import com.seckill.goods.pojo.Sku;
import com.seckill.page.feign.SkuPageFeign;
import com.seckill.search.feign.SkuInfoFeign;
import com.seckill.search.pojo.SkuInfo;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import top.javatool.canal.client.annotation.CanalTable;
import top.javatool.canal.client.handler.EntryHandler;

@Component
@CanalTable(value = "tb_sku")
public class SkuHandler implements EntryHandler<Sku> {
    
    

    /***
     * 增加数据
     * @param sku
     */
    @Override
    public void insert(Sku sku) {
    
    
        System.out.println("===========insert:"+sku);
    }

    /***
     * 修改数据
     * @param before
     * @param after
     */
    @Override
    public void update(Sku before, Sku after) {
    
    
        System.out.println("===========update-before:"+before);
        System.out.println("===========update-after:"+after);
    }

    /***
     * 删除数据
     * @param sku
     */
    @Override
    public void delete(Sku sku) {
    
    
        System.out.println("===========delete:"+sku);
    }
}

4. 创建启动类

@SpringBootApplication
public class CanalApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(CanalApplication.class,args);
    }
}

程序启动后,修改tb_sku数据,可以看到控制会打印修改前后的数据:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45525272/article/details/128763122