Spring Boot 整合 阿里开源中间件 Canal 实现数据增量同步(三)

love374
发布于 2022-7-11 11:47
浏览
0收藏

 

其实就是一串JSON数据,这个JSON如下:

{
 "data": [{
  "client_id": "myjszl",
  "resource_ids": "res1",
  "client_secret": "$2a$10$F1tQdeb0SEMdtjlO8X/0wO6Gqybu6vPC/Xg8OmP9/TL1i4beXdK9W",
  "scope": "all",
  "authorized_grant_types": "password,refresh_token,authorization_code,client_credentials,implicit",
  "web_server_redirect_uri": "http://www.baidu.com",
  "authorities": null,
  "access_token_validity": "1000",
  "refresh_token_validity": "1000",
  "additional_information": null,
  "autoapprove": "false"
 }],
 "database": "test",
 "es": 1640337532000,
 "id": 7,
 "isDdl": false,
 "mysqlType": {
  "client_id": "varchar(48)",
  "resource_ids": "varchar(256)",
  "client_secret": "varchar(256)",
  "scope": "varchar(256)",
  "authorized_grant_types": "varchar(256)",
  "web_server_redirect_uri": "varchar(256)",
  "authorities": "varchar(256)",
  "access_token_validity": "int(11)",
  "refresh_token_validity": "int(11)",
  "additional_information": "varchar(4096)",
  "autoapprove": "varchar(256)"
 },
 "old": null,
 "pkNames": ["client_id"],
 "sql": "",
 "sqlType": {
  "client_id": 12,
  "resource_ids": 12,
  "client_secret": 12,
  "scope": 12,
  "authorized_grant_types": 12,
  "web_server_redirect_uri": 12,
  "authorities": 12,
  "access_token_validity": 4,
  "refresh_token_validity": 4,
  "additional_information": 12,
  "autoapprove": 12
 },
 "table": "oauth_client_details",
 "ts": 1640337532520,
 "type": "INSERT"
}

每个字段的意思已经很清楚了,有表名称、方法、参数、参数类型、参数值.....

客户端要做的就是监听MQ获取JSON数据,然后将其解析出来,处理自己的业务逻辑。

Canal客户端搭建
客户端很简单实现,要做的就是消费Canal服务端传递过来的消息,监听canal.queue这个队列。

1、创建消息实体类
MQ传递过来的是JSON数据,当然要创建个实体类接收数据,如下:

/**
 * @author 公众号 码猿技术专栏
 * Canal消息接收实体类
 */
@NoArgsConstructor
@Data
public class CanalMessage<T> {
    @JsonProperty("type")
    private String type;

    @JsonProperty("table")
    private String table;

    @JsonProperty("data")
    private List<T> data;

    @JsonProperty("database")
    private String database;

    @JsonProperty("es")
    private Long es;

    @JsonProperty("id")
    private Integer id;

    @JsonProperty("isDdl")
    private Boolean isDdl;

    @JsonProperty("old")
    private List<T> old;

    @JsonProperty("pkNames")
    private List<String> pkNames;

    @JsonProperty("sql")
    private String sql;

    @JsonProperty("ts")
    private Long ts;
}

 

2、MQ消息监听业务
接下来就是监听队列,一旦有Canal服务端有数据推送能够及时的消费。

代码很简单,只是给出个接收的案例,具体的业务逻辑可以根据业务实现,如下:

import cn.hutool.json.JSONUtil;
import cn.myjszl.middle.ware.canal.mq.rabbit.model.CanalMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 监听MQ获取Canal增量的数据消息
 */
@Component
@Slf4j
@RequiredArgsConstructor
public class CanalRabbitMQListener {

    @RabbitListener(bindings = {
            @QueueBinding(
                    value = @Queue(value = "canal.queue", durable = "true"),
                    exchange = @Exchange(value = "canal.exchange"),
                    key = "canal.routing.key"
            )
    })
    public void handleDataChange(String message) {
        //将message转换为CanalMessage
        CanalMessage canalMessage = JSONUtil.toBean(message, CanalMessage.class);
        String tableName = canalMessage.getTable();
        log.info("Canal 监听 {} 发生变化;明细:{}", tableName, message);
        //TODO 业务逻辑自己完善...............
    }
}

 

3、测试
下面向表中插入数据,看下接收的消息是什么样的,SQL如下:

INSERT INTO `oauth_client_details`
VALUES
 ( 'myjszl', 'res1', '$2a$10$F1tQdeb0SEMdtjlO8X/0wO6Gqybu6vPC/Xg8OmP9/TL1i4beXdK9W', 'all', 'password,refresh_token,authorization_code,client_credentials,implicit', 'http://www.baidu.com', NULL, 1000, 1000, NULL, 'false' );

客户端转换后的消息如下图:

 Spring Boot 整合 阿里开源中间件 Canal 实现数据增量同步(三)-鸿蒙开发者社区
上图可以看出所有的数据都已经成功接收到,只需要根据数据完善自己的业务逻辑即可。

“客户端案例源码已经上传GitHub,关注公众号:码猿技术专栏,回复关键词:9530 获取!”


总结
数据增量同步的开源工具并不只有Canal一种,根据自己的业务需要选择合适的组件。

 

文章转自公众号:码猿技术专栏

已于2022-7-11 11:47:00修改
收藏
回复
举报
回复
    相关推荐