Debezium发布历史83

原文地址: https://debezium.io/blog/2020/02/19/debezium-camel-integration/

欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.

Debezium 和 Apache Camel 的集成场景
二月 19, 2020 作者: Jiri Pechanec
骆驼 集成 quarkus
Debezium 的典型用例之一是使用变更数据捕获将遗留系统与组织中的其他系统集成。有多种方法可以实现这一目标

使用 Debezium 将数据写入 Kafka,然后结合 Kafka Streams 管道和 Kafka Connect 连接器将更改传递到其他系统

在 Java 独立应用程序中使用Debezium Embedded 引擎,并使用纯 Java 编写集成代码;通常用于将更改事件发送到替代消息传递基础设施,例如 Amazon Kinesis、Google Pub/Sub 等。

使用现有的集成框架或服务总线来表达管道逻辑

本文重点讨论第三个选项 - 专用集成框架。

阿帕奇骆驼
Camel是一个开源集成框架,使开发人员能够从不同的系统和服务读取、转换、路由和写入数据。它提供了大量现成的组件,这些组件要么提供与第三方系统的接口,要么提供企业集成模式的实现。

这种组合允许开发人员轻松连接到目标系统并使用声明性 DSL 表达集成管道。

骆驼和Debezium
Camel 3已于 2019 年底发布,除了主要的重新架构之外,新的 Debezium 组件也已添加到代码库中。它还使 Camel 能够用作Kafka Connect 运行时中的连接器。

这篇文章仅关注 Debezium 组件的使用,后一个选项将在以后的文章中介绍。

Debezium MySQL 连接器组件

Debezium PostgreSQL 连接器组件

Debezium SQL Server 连接器组件

Debezium MongoDB 连接器组件

正如您所看到的,每个非孵化Debezium 连接器都由其专用组件代表。该解决方案的优点是依赖关系的完全隔离以及连接器实例的类型安全配置。

在内部,该组件通过事件驱动的Camel 消费者公开 Debezium端点,该消费者封装了Debezium 嵌入式引擎的实例。

一个例子
作为一个例子,我们构建了一个简单的问答(Q&A)应用程序,大致受到 StackOverflow 等的启发。REST API 允许发布新问题以及现有问题的答案,这些问题都存储在数据库中。

应用程序生成的任何数据更改(例如,如果创建了新问题或答案)都会通过 Debezium 捕获并传递到 Camel 管道,该管道通过 SMTP 服务器发送电子邮件并在提供的 Twitter 帐户上发布相应的推文。

您可以在 GitHub 上找到该示例的完整源代码。

拓扑结构
解决方案拓扑中有多个组件:
图片来自于原文
Debezium发布历史83_第1张图片

图 1. 部署拓扑

问答应用程序使用Quarkus堆栈实现,并公开 REST API 来创建问题和答案

应用程序将其数据存储在 PostgreSQL 数据库中

Camel 路由作为普通 Java 应用程序运行,该应用程序使用嵌入式Infinispan存储来保存其状态(用于构建将问题与其答案链接起来的聚合对象),并通过电子邮件向关联的 Twitter 帐户发送有关已回答问题的消息

在容器中运行的MailHog SMTP服务器用于发送电子邮件

问答申请
源应用程序是一个基于 Quarkus 的简单 REST 服务。它管理两个实体Question和Answer,并1:n在 PostgreSQL 数据库中存储关系。
图片来自于原文
Debezium发布历史83_第2张图片

图 2. 问答后端服务实体关系图

实体是使用 REST API 创建的,并且它们之间会自动建立关联。

骆驼管道
Camel管道是以下业务规则的表达:

对于创建或更新的每个问题,请向问题创建者发送电子邮件

对于创建或更新的每个答案,请向问题和答案创建者发送电子邮件

当一个问题得到三个答案时,在专门的 Twitter 帐户上发布一条关于该问题的推文

业务需求转换为此 EIP 图表描述的管道:
图片来自于原文
Debezium发布历史83_第3张图片

图 4. Camel 管道

代码演练
要使用 Debezium Camel 组件,我们至少需要将以下依赖项添加到pom.xml文件中

org.apache.camel camel-bom ${version.camel} pom import


  io.debezium
  debezium-connector-postgres
  ${version.debezium}


  io.debezium
  debezium-embedded
  ${version.debezium}


  io.debezium
  debezium-core
  ${version.debezium}

org.apache.camel camel-core org.apache.camel camel-debezium-postgres 管道逻辑本身在QaDatabaseUserNotifier类中定义。它的主要路线如下所示:

public class QaDatabaseUserNotifier extends RouteBuilder {

@Override
public void configure() throws Exception {
from(“debezium-postgres:localhost?”
+ “databaseHostname={{database.hostname}}”
+ “&databasePort={{database.port}}”
+ “&databaseUser={{database.user}}”
+ “&databasePassword={{database.password}}”
+ “&databaseDbname=postgres”
+ “&databaseServerName=qa”
+ “&schemaWhitelist={{database.schema}}”
+ “&tableWhitelist={{database.schema}}.question,{{database.schema}}.answer”
+ “&offsetStorage=org.apache.kafka.connect.storage.MemoryOffsetBackingStore”)
.routeId(QaDatabaseUserNotifier.class.getName() + “.DatabaseReader”)
.log(LoggingLevel.DEBUG, “Incoming message ${body} with headers ${headers}”)
.choice()
.when(isQuestionEvent)
.filter(isCreateOrUpdateEvent)
.convertBodyTo(Question.class)
.log(LoggingLevel.TRACE, “Converted to logical class ${body}”)
.bean(store, “readFromStoreAndUpdateIfNeeded”)
.to(ROUTE_MAIL_QUESTION_CREATE)
.endChoice()
.when(isAnswerEvent)
.filter(isCreateOrUpdateEvent)
.convertBodyTo(Answer.class)
.log(LoggingLevel.TRACE, "Converted to logical class b o d y " ) . b e a n ( s t o r e , " r e a d F r o m S t o r e A n d A d d A n s w e r " ) . t o ( R O U T E M A I L A N S W E R C H A N G E ) . f i l t e r ( h a s M a n y A n s w e r s ) . s e t B o d y ( ) . s i m p l e ( " Q u e s t i o n ′ {body}") .bean(store, "readFromStoreAndAddAnswer") .to(ROUTE_MAIL_ANSWER_CHANGE) .filter(hasManyAnswers) .setBody().simple("Question ' body").bean(store,"readFromStoreAndAddAnswer").to(ROUTEMAILANSWERCHANGE).filter(hasManyAnswers).setBody().simple("Question{exchangeProperty[aggregate].text}’ has " +
"many answers (generated at " + Instant.now() + “)”)
.to(TWITTER_SERVER)
.end()
.endChoice()
.otherwise()
.log(LoggingLevel.WARN, “Unknown type ${headers[” +
DebeziumConstants.HEADER_IDENTIFIER + “]}”)
.endParent();

from(ROUTE_MAIL_QUESTION_CREATE)                                             
  .routeId(QaDatabaseUserNotifier.class.getName() + ".QuestionNotifier")
  .setHeader("To").simple("${body.email}")
  .setHeader("Subject").simple("Question created/edited")
  .setBody().simple("Question '${body.text}' was created or edited")
  .to(SMTP_SERVER);

}

@Converter
public static class Converters {

@Converter
public static Question questionFromStruct(Struct struct) {                   
  return new Question(struct.getInt64("id"), struct.getString("text"),
      struct.getString("email"));
}

@Converter
public static Answer answerFromStruct(Struct struct) {                       
  return new Answer(struct.getInt64("id"), struct.getString("text"),
      struct.getString("email"), struct.getInt64("question_id"));
}

}
}
from是 Debezium 源端点。URI 部分直接映射到连接器配置选项。
管道逻辑根据更改事件类型进行划分。识别基于包含源表CamelDebeziumIdentifier标识符( )的标头。..
管道现在只能处理更新和删除。识别基于CamelDebeziumOperation包含op消息字段的标头Envelope。
Kafka Connect 的Struct类型被转换为管道中使用的逻辑类型。转换由自定义 Camel 转换器执行。可以使用开箱即用的DebeziumTypeConverter转换Struct为 a Map,但这将管道逻辑紧密耦合到表结构中。
调用补充路由,该路由与基于 Infinispan 缓存的消息存储进行通信以构建消息聚合。消息存储检查是否已存储问题。如果不是,则创建并存储新的聚合,否则将使用新数据更新存储的聚合。
调用补充路由来格式化邮件消息并通过 SMTP 端点将其传递给问题创建者。
与答案消息类型相关的路由部分非常相似(答案被添加到问题聚合中)。主要区别是当聚合包含三个答案时发布 Twitter 消息。
附带说明一下,为了简单起见,该示例当前使用易失性内存来存储 Debezium 偏移量。对于持久存储,您可以使用基于文件的偏移存储或基于 Infinispan 创建自定义偏移存储实现,将偏移存储委托给底层缓存。

演示
为了运行演示,您需要拥有一个具有适当 API 密钥和机密的Twitter开发者帐户。

转到应用程序目录并构建所有组件:

$ mvn clean install
启动服务(提供您自己的 Twitter API 凭据):

$ env TWITTER_CONSUMER_KEY=<…> TWITTER_CONSUMER_SECRET=<…> TWITTER_ACCESS_TOKEN=<…> TWITTER_ACCESS_TOKEN_SECRET=<…> docker-compose up
在另一个终端中创建一个问题和三个答案:

$ curl -v -X POST -H ‘Content-Type: application/json’ http://0.0.0.0:8080/question/ -d @src/test/resources/messages/create-question.json
$ curl -v -X POST -H ‘Content-Type: application/json’ http://0.0.0.0:8080/question/1/answer -d @src/test/resources/messages/create-answer1.json
$ curl -v -X POST -H ‘Content-Type: application/json’ http://0.0.0.0:8080/question/1/answer -d @src/test/resources/messages/create-answer2.json
$ curl -v -X POST -H ‘Content-Type: application/json’ http://0.0.0.0:8080/question/1/answer -d @src/test/resources/messages/create-answer3.json
Twitter 帐户应包含一条新推文,其文本类似于“问题‘狗有多少条腿?’” 有很多答案(生成于 2020-02-17T08:02:33.744Z)”。此外,MailHog 服务器 UI应该显示如下消息:
图片来自于原文
Debezium发布历史83_第4张图片

图 4. MailHog 消息

结论
Apache Camel 是实现系统集成场景的一个非常有趣的选择。

无需任何外部消息传递基础设施,就可以非常轻松地使用 Debezium 组件部署独立的 Camel 路由,从而能够捕获数据更改并对其执行复杂的路由和转换操作。Camel 为开发人员提供了完整的企业集成模式实现库,以及用于不同系统的数百个连接器,这些连接器可以包含在复杂的服务编排中。

完整示例的源代码可在 GitHub 上获取。

你可能感兴趣的:(CDC,debezium,FlinkCDC,数据库,运维,大数据)