上周的公告Quarkus在Java社区中引起了极大的兴趣:它由最好的Java库和标准精心制作,允许基于GraalVM和OpenJDK HotSpot构建kubernetes原生应用程序。在这篇博文中,我们将演示一个基于夸克的微服务如何通过Apache Kafka使用Debezium的数据更改事件。开云体育官方注册网址出于这个目的,我们将从最近的文章中看到如何转换运输微服务发件箱模式变成基于quarkuss的服务。

Quarkus是一个Java栈,设计用于开发基于Java平台的云原生应用程序。它结合并紧密集成了成熟的库,如Hibernate ORM, Vert。Netty, RESTEasy和Apache Camel以及Eclipse微表面主动性,例如配置被动的消息.使用Quarkus,您可以使用命令式和响应式风格开发应用程序,也可以根据需要组合这两种方法。

它被设计用于显著减少内存消耗和改进启动时间。最后,Quarkus同时支持OpenJDK HotSpot和GraalVM虚拟机。使用GraalVM,可以将应用程序编译为本地二进制文件,从而进一步减少资源消耗和启动时间。

要更多地了解夸克本身,我们建议看看它的优秀开始指南。

使用Quarkus消费Kafka信息

在原版中示例应用程序为了演示发件箱模式,有一个基于Thorntail的微服务(“发货”),它消耗Debezium连接器产生的事件。开云体育官方注册网址我们用名为“shipping -service-quarkus”的新服务扩展了这个示例。它提供了与“发货服务”相同的功能,但实现为基于Quarkus而不是Thorntail的微服务。

这使得整个架构看起来像这样:

发件箱模式概述">
          </div>
          <div class=

要将原来的服务改造成基于quarkuss的应用程序,只需要做一些更改:

  • Quarkus目前只支持MariaDB,不支持MySQL;因此,我们包含了服务写入的MariaDB实例

  • JSON-P API如果没有RESTEasy(参见RESTEasy),目前不能使用传入的JSON消息问题# 1480);所以代码已经被修改为使用Jackson API

  • 而不是Kafka消费者API响应式消息传递API由MicroProfile定义用于接收来自Apache Kafka的消息;类提供的API的实现SmallRye项目是捆绑作为Quarkus扩展

虽然前两个步骤只是技术细节,但响应式消息传递API是对原始消费者中的轮询循环的一个很好的简化。使用Kafka主题的消息所需要做的就是用注释方法@Incoming,当新消息到达时,它将自动被调用:

@ApplicationScoped公共KafkaEventConsumer@Incoming订单公共CompletionStage <无效> onMessage (KafkaMessage <字符串字符串>消息)抛出IOException//处理消息…返回message.ack ();}}

“orders”消息源是通过MicroProfile Config API配置的,该API将其解析为“OrderEvents”主题,该主题已经从原始发件箱示例中得知。

构建过程

构建过程与以前基本相同。现在使用的不是Thorntail Maven插件,而是Quarkus Maven插件。

下面使用Quarkus扩展:

  • io.quarkus: quarkus-hibernate-orm:支持Hibernate ORM和JPA

  • io.quarkus: quarkus-jdbc-mariadb:支持通过JDBC访问MariaDB

  • io.quarkus: quarkus-smallrye-reactive-messaging-kafka:支持通过MicroProfile响应式消息传递API访问Kafka

他们还引入了一些其他的扩展。quarkus-arc(Quarkus CDI运行时)和quarkus-vertx(由响应式消息传递支持使用)。

此外,还需要进行两项更改:

  • 一个名为本地的已添加;这用于使用Quarkus Maven插件将服务编译为本机二进制映像

  • native-image.docker-build系统属性在运行构建时启用;这意味着本机映像构建是在Docker容器中完成的,因此GraalVM不必安装在开发人员的机器上

所有繁重的工作都由配置在中的Quarkus Maven插件完成pom.xml像这样:

构建> << finalName >装运< / finalName ><插件>...<插件>< groupId >io.quarkus< / groupId >< artifactId >quarkus-maven-plugin< / artifactId ><版本>$ {version.quarkus}> < /版本执行< >执行< ><目标><目标>构建> < /目标> < /目标执行< / >> < /执行< /插件>> < /插件构建> < /...<文件><标识>本地的< / id >构建> <<插件><插件>< groupId >io.quarkus< / groupId >< artifactId >quarkus-maven-plugin< / artifactId ><版本>$ {version.quarkus}> < /版本执行< >执行< ><目标><目标>本机映像> < /目标> < /目标< >配置< enableHttpUrlHandler >真正的< / enableHttpUrlHandler >< autoServiceLoaderRegistration >< / autoServiceLoaderRegistration >< /配置>执行< / >> < /执行< /插件>> < /插件构建> < /< /资料>

配置

与任何Quarkus应用程序一样,发送服务是通过application.properties文件:

quarku .datasource.url: jdbc:mariadb:// shipping -db-quarkus:3306/shipmentdb quarku .datasource.driver: org.mariadb.jdbc.Driver quarku .datasource.username: mariadbuser quarku .datasource.password: mariadbpw quarku .hibernate-or开云体育电动老虎机m.database。一代= drop-and-create quarkus.hibernate-orm.log。sql=true smallrye.messaging.source.orders.type=io.smallrye.reactive.messaging.kafka.Kafka smallrye.messaging.source.orders.topic=OrderEvents smallrye.messaging.source.orders.bootstrap.servers=kafka:9092 smallrye.messaging.source.orders.key.deserializer=org.apache.kafka.common.serialization.StringDeserializer smallrye.messaging.source.orders.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer smallrye.messaging.source.orders.group.id=shipment-service-quarkus

在我们的例子中它包含

  • 发货服务写入数据的数据源的定义(基于MariaDB);

  • 消息源的定义,由“OrderEvents”Kafka主题支持,使用给定的引导服务器、反序列化器和Kafka消费者组id。

执行

Docker Compose配置文件增加了两个服务,MariaDB和新的基于quarkuss的发货服务。所以,当docker-compose起来执行时,两个运输服务并排启动:最初的基于thorntail的服务和使用Quarkus的新服务。当订单服务接收到新的购买订单并通过发件箱表将相应的事件导出到Apache Kafka时,这条消息将由两个发货服务处理,因为它们使用不同的消费者组id。

性能数据

这些数字肯定不科学,但很好地说明了基于quarkuss的本地应用程序和运行在JVM上的Thorntail服务之间的数量级差异:

Quarkus服务 Thorntail服务

内存(MB)

33.8

1257

开始时间[ms]

260

5746

申请包大小[MB]

54

131

内存数据通过htop实用程序。测量启动时间,直到打印关于应用程序就绪的消息。与所有性能测量一样,您应该基于您的设置和工作负载运行自己的比较,以深入了解特定用例的实际差异。

总结

在这篇文章中,我们成功地演示了在用Quarkus Java栈编写的Java应用程序中使用debezium生成的事件是可能的。开云体育官方注册网址我们还展示了可以将这样的应用程序作为二进制映像提供,并提供了显示显著节省资源的粗略性能数据。

如果您想亲自了解将Java微服务部署为本机映像的奇妙之处,可以找到完整的文档源代码在Debezium示例repo中实现。开云体育官方注册网址如果你有任何问题或反馈,请在下面的评论中告诉我们;期待您的回复!

非常感谢Guillaume Smet审阅了这篇文章的早期版本!

雅罗西克Pechanec

Jiri是Red Hat的软件开发人员(前质量工程师)。他职业生涯的大部分时间都花在Java和系统集成项目和任务上。他住在捷克共和国布尔诺附近。


关于Debe开云体育官方注册网址zium

开云体育官方注册网址Debezium是一个开源的分布式平台,它将现有数据库转换为事件流,因此应用程序几乎可以立即看到并响应数据库中提交的每一个行级更改。开云体育电动老虎机开云体育官方注册网址Debezium是建立在卡夫卡并提供卡夫卡连接监控特定数据库管理系统的兼容连接器。开云体育电动老虎机开云体育官方注册网址Debezium在Kafka日志中记录了数据更改的历史,所以你的应用程序可以在任何时候停止和重新启动,并且可以很容易地使用它没有运行时错过的所有事件,确保所有事件都被正确和完整地处理。开云体育官方注册网址Debezium是开源Apache许可证,版本2.0

参与

我们希望您觉得Debezium有趣开云体育官方注册网址且有用,并愿意尝试一下。在Twitter上关注我们@开云体育官方注册网址debezium在Zulip上和我们聊天,或加入我们的邮件列表与社区对话。所有的代码都是开源的GitHub上,因此在本地构建代码并帮助我们改进现有连接器并添加更多连接器。如果您发现了问题或对我们如何改进Debezium有想法,请告诉我们开云体育官方注册网址记录问题