{"id":15024561,"url":"https://github.com/normangyllenhaal/canal-client","last_synced_at":"2025-04-04T15:10:25.934Z","repository":{"id":41564814,"uuid":"190960994","full_name":"NormanGyllenhaal/canal-client","owner":"NormanGyllenhaal","description":"spring boot canal starter 易用的canal 客户端 canal client","archived":false,"fork":false,"pushed_at":"2024-07-21T06:16:51.000Z","size":62,"stargazers_count":280,"open_issues_count":35,"forks_count":126,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-28T14:08:40.400Z","etag":null,"topics":["canal","canal-client","java","spring","springboot"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NormanGyllenhaal.png","metadata":{"files":{"readme":"README.MD","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-09T03:44:57.000Z","updated_at":"2025-03-16T15:49:59.000Z","dependencies_parsed_at":"2024-10-14T04:40:58.991Z","dependency_job_id":"5078a41b-ff3f-4589-9673-27932b802011","html_url":"https://github.com/NormanGyllenhaal/canal-client","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NormanGyllenhaal%2Fcanal-client","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NormanGyllenhaal%2Fcanal-client/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NormanGyllenhaal%2Fcanal-client/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NormanGyllenhaal%2Fcanal-client/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NormanGyllenhaal","download_url":"https://codeload.github.com/NormanGyllenhaal/canal-client/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247198463,"owners_count":20900080,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["canal","canal-client","java","spring","springboot"],"created_at":"2024-09-24T20:00:32.857Z","updated_at":"2025-04-04T15:10:25.899Z","avatar_url":"https://github.com/NormanGyllenhaal.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.org/NormanGyllenhaal/canal-client.svg?branch=master)](https://travis-ci.org/NormanGyllenhaal/canal-client)\n## 易用的canal 客户端 easy canal client\n\n### 介绍\ncanal 是阿里巴巴mysql数据库binlog的增量订阅\u0026消费组件  \n使用该客户端前请先了解canal,https://github.com/alibaba/canal  \ncanal 自身提供了简单的客户端，如果要转换为数据库的实体对象，处理消费数据要每次进行对象转换。\n该客户端直接将canal的数据原始类型转换为各个数据表的实体对象，并解耦数据的增删改操作，方便给业务使用。\n\n### 要求\njava8+\n\n### 特性\n* 解耦单表增删操作\n* simple,cluster,zookeeper,kafka客户端支持\n* 同步异步处理支持\n* spring boot 开箱即用\n\n### 如何使用\nspring boot 方式 \nmaven 依赖\n```xml\n  \u003cdependency\u003e\n      \u003cgroupId\u003etop.javatool\u003c/groupId\u003e\n      \u003cartifactId\u003ecanal-spring-boot-starter\u003c/artifactId\u003e\n      \u003cversion\u003e1.2.6-RELEASE\u003c/version\u003e\n  \u003c/dependency\u003e\n```\njava 方式\n```xml\n \u003cdependency\u003e\n       \u003cgroupId\u003etop.javatool\u003c/groupId\u003e\n       \u003cartifactId\u003ecanal-client\u003c/artifactId\u003e\n       \u003cversion\u003e1.2.6-RELEASE\u003c/version\u003e\n \u003c/dependency\u003e\n```\n配置说明\n\n|属性|描述|默认值|\n|:----    |:---------------------    |:------- |\n|canal.mode |canal 客户端类型 目前支持4种类型 simple,cluster,zk,kafka(kafka 目前支持flatMessage 格式)|simple\n|canal.filter| canal过滤的表名称，如配置则只订阅配置的表|\"\"\n|canal.batch-size| 消息的数量，超过该次数将进行一次消费 |1(个)\n|canal.timeout  |消费的时间间隔(s)|1s\n|canal.server     |服务地址,多个地址以,分隔 格式 ${host}:${port}|null\n|canal.destination |canal 的instance 名称,kafka模式为topic 名称|null\n|canal.user-name     |canal 的用户名    |null\n|canal.password |canal 的密码     |null\n|canal.group-id  |kafka groupId 消费者订阅消息时可使用，kafka canal 客户端 |null\n|canal.async |是否是异步消费，异步消费时，消费时异常将导致消息不会回滚，也不保证顺序性 |true\n|canal.partition |kafka partition |null\n\n### 订阅数据库的增删改操作\n实现EntryHandler\u003cT\u003e 接口，泛型为想要订阅的数据库表的实体对象，\n该接口的方法为 java 8 的 default 方法，方法可以不实现，如果只要监听增加操作，只实现增加方法即可  \n下面以一个t_user表的user实体对象为例,\n默认情况下，将使用实体对象的jpa 注解 @Table中的表名来转换为EntryHandler中的泛型对象，\n```java\npublic class UserHandler implements EntryHandler\u003cUser\u003e{\n\n}\n```\n如果实体类没有使用jpa @Table的注解，也可以使用@CanalTable 注解在EntryHandler来标记表名，例如  \n```java\n@CanalTable(value = \"t_user\")\n@Component\npublic class UserHandler implements EntryHandler\u003cUser\u003e{\n\n   /**\n   *  新增操作\n   * @param user\n    */\n   @Override\n    public void insert(User user) {\n\t   //你的逻辑\n        log.info(\"新增 {}\",user);\n    }\n    /**\n    * 对于更新操作来讲，before 中的属性只包含变更的属性，after 包含所有属性，通过对比可发现那些属性更新了\n   * @param before\n   * @param after\n    */\n    @Override\n    public void update(User before, User after) {\n    \t//你的逻辑\n        log.info(\"更新 {} {}\",before,after);\n    }\n    /**\n    *  删除操作\n    * @param user\n    */\n    @Override\n    public void delete(User user) {\n       //你的逻辑\n        log.info(\"删除 {}\",user); \n   }\n}\n```\n另外也支持统一的处理@CanalTable(value=\"all\"),这样除去存在EntryHandler的表以外，其他所有表的处理将通过该处理器,统一转为Map\u003cString, String\u003e对象\n```java\n@CanalTable(value = \"all\")\n@Component\npublic class DefaultEntryHandler implements EntryHandler\u003cMap\u003cString, String\u003e\u003e {\n     @Override\n        public void insert(Map\u003cString, String\u003e map) {\n            logger.info(\"insert message  {}\", map);\n        }\n    \n        @Override\n        public void update(Map\u003cString, String\u003e before, Map\u003cString, String\u003e after) {\n            logger.info(\"update before {} \", before);\n            logger.info(\"update after {}\", after);\n        }\n    \n        @Override\n        public void delete(Map\u003cString, String\u003e map) {\n            logger.info(\"delete  {}\", map);\n        }\n}\n```\n如果你想获取除实体类信息外的其他信息，可以使用\n```java\nCanalModel canal = CanalContext.getModel();\n```\n具体使用可以查询项目demo 示例  \nhttps://github.com/NormanGyllenhaal/canal-client/tree/master/canal-example\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnormangyllenhaal%2Fcanal-client","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnormangyllenhaal%2Fcanal-client","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnormangyllenhaal%2Fcanal-client/lists"}