发件箱夸克扩展
概述
这个扩展的灵感来自发件箱事件路由器单消息转换(SMT)。正如博客文章中讨论的那样使用发件箱模式进行可靠的微服务数据交换在美国,微服务通常需要彼此交换信息,而处理这种情况的一个很好的方法是使用发件箱模式结合Debezium的发件箱事件路由器SMT。开云体育官方注册网址
下图显示了该模式的整体架构:
发件箱扩展的目标是提供一个Quarkus应用程序使用可重用的、高度可配置的组件,该组件促进了与Debezium的CDC连接器管道配对的发件箱模式的使用,从而与所述数据的任何消费者可靠且异步地共享数据。开云体育官方注册网址
开始
为了开始使用Debezium Outbox Quarku开云体育官方注册网址s扩展,需要将扩展添加为Quarkus应用程序的一部分,如下所示:
io.开云体育官方注册网址debezium debezium-quarku -outbox 2.2.0。α< /版本> < / >的依赖
扩展为应用程序提供io.开云体育官方注册网址debezium.outbox.quarkus.ExportedEvent
接口。类将实现此接口,并且事件将使用javax.enterprise.event.Event
类。
的 |
例子
的实现ExportedEvent
接口,表示已创建的订单:
公共类OrderCreatedEvent实现了ExportedEvent {private static final String TYPE = "Order";private static final String EVENT_TYPE = "OrderCreated";private final long orderId;private final JsonNode;即时时间戳;public OrderCreatedEvent(即时createdAt,订单订单){此。orderId = order.getId();这一点。时间戳= createdAt;这一点。jsonNode = convertToJson(order); } @Override public String getAggregateId() { return String.valueOf(orderId); } @Override public String getAggregateType() { return TYPE; } @Override public JsonNode getPayload() { return jsonNode; } @Override public String getType() { return EVENT_TYPE; } @Override public Instant getTimestamp() { return timestamp; } @Override public Map getAdditionalFieldValues() { // no additional fields return Collections.emptyMap(); } }
下面的示例说明了OrderService
它发出OrderCreatedEvent
:
@注入OrderRepository;@ inject事件< ExportedEvent < ?>>事件;@事务性公共订单addOrder(订单订单){订单= orderRepository.save(订单);事件。fire(new OrderCreatedEvent(Instant.now(), order));返回订单;}}
当应用程序代码通过调用触发事件时事件#火()
时,发件箱扩展将收到事件发生的通知,并将事件的内容持久化到当前事务范围内的发件箱事件表中。Debe开云体育官方注册网址zium CDC连接器将与发件箱事件路由器一起监视该表,并将负责使用CDC事件转发数据。
要查看完整的端到端演示,请使用发件箱下面的示例演示了两个Quarkus微服务应用程序在下达或取消订单时使用发件箱模式在它们之间共享数据。
附加字段映射
Debe开云体育官方注册网址zium发件箱SMT可以配置为读取其他字段,并将这些字段值作为事件标头或事件值的一部分发出。
为了传递由Quarkus发件箱扩展保存的其他字段映射,配置属性quarkus.开云体育官方注册网址debezium-outbox.additional-fields
必须在application.properties
.属性的应用程序实现传递的附加字段定义的逗号分隔列表ExportedEvent
接口。
这个以逗号分隔的列表中的每个条目必须遵循以下格式:
<字段>:< field-java-type > [: < field-column-definition > [: < field-jpa-attribute-converter >]]
该模式指出字段的名称和java类型是必需的,而列定义和JPA属性转换器是可选的。但是,请注意,如果您希望指定JPA属性转换器,那么必须指定列定义。
下面的示例演示如何定义名为customer_name
在Java中表示为字符串
并将其存储在发件箱表中VARCHAR (100)
列。这个例子还展示了一个JPA Attribute转换器,它定义了强制字符串存储为大写。
quarkus.开云体育官方注册网址debezium-outbox.additional-fields = customer_name:字符串:varchar (100): example.UpperCase
一旦在应用程序中配置了字段. properties
文件中,应用程序的代码需要通过其导出的事件提供相应的值。类扩展的应用程序类ExportedEvent
需要重写所调用的方法getAdditionalFieldValues ()
并返回地图
附加字段名和值的。
在下面的示例中,我们将展示如何指定customer_name
字段,值为Acme的商品
.使用我们的OrderCreatedEvent
从上面的示例部分,我们扩展了事件:
公共类OrderCreatedEvent实现了ExportedEvent{…@覆盖公共地图<字符串,对象> getAdditionalFieldValues(){返回集合。singletonMap("customer_name", "Acme Goods");}}
额外的字段映射允许为每个字段指定一个JPA属性转换器。 在这个例子中,我们定义 |
应用程序中的配置. properties
文件及更新OrderCreateedEvent
为了提供这些额外的字段和值,Debezium发件箱SMT现在可以访问这些额外的字段值,并将它们放置在发开云体育官方注册网址出的事件中。
配置
可以通过在Quarkus中设置选项来配置发件箱扩展application.properties
文件。该扩展可以使用默认配置开箱即用,但此配置可能并不适用于每种情况。
构建时配置选项
配置属性 |
类型 |
默认的 |
|
字符串 |
OutboxEvent |
|
字符串 |
|
|
字符串 |
|
字符串 |
|
|
|
字符串 |
|
|
字符串 |
|
字符串 |
|
|
|
字符串 |
|
|
字符串 |
|
字符串 |
|
|
|
字符串 |
|
|
字符串 |
|
字符串 |
|
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
生成时配置默认值将与发件箱事件路由器SMT一起使用。当不使用默认值时,请确保SMT配置匹配。 |
运行时配置选项
配置属性 |
类型 |
默认的 |
|
布尔 |
真正的 |
分布式跟踪
该功能目前处于孵化状态,即准确的语义,配置选项等可能会根据我们收到的反馈在未来的版本中改变。具体来说,在未来的版本中,分布式跟踪支持将被开放遥测规范的支持所取代。 |
扩展支持分布式跟踪。看到跟踪文档欲知详情。