发件箱Quarkus扩展
概述
这个扩展的启发发件箱活动路由器单一的消息转换(SMT)。博客文章中讨论可靠的Microservices数据交换与发件箱模式,microservices通常需要彼此交换信息和一个非常好的方法来处理使用发件箱模式结合Debezium发件箱事件路由器SMT。开云体育官方注册网址
下面的图片显示了此模式的总体架构:
发件箱扩展的目标是提供一个Quarkus应用程序与一个可重用的、高度可配置组件,促进了发件箱的使用模式搭配Debezium CDC连接器管道可靠和异步与任何消费者表示数据的共享数据。开云体育官方注册网址
开始
为了开始使用Debezium发件箱Quarkus扩展,扩开云体育官方注册网址展需要添加部分Quarkus应用程序如下:
<依赖> < groupId > io.debez开云体育官方注册网址ium < / groupId > < artifactId > debezium-quarkus-outbox < / artifactId > <版本> tripwire。最后< /版本> < /依赖>
扩展为应用程序提供了io.开云体育官方注册网址debezium.outbox.quarkus.ExportedEvent
接口。我们估计一个应用程序类将实现这个接口,事件将会发出使用javax.enterprise.event.Event
类。
的 |
例子
下面的例子说明了一个实现的ExportedEvent
创建接口代表一个订单:
公共类OrderCreatedEvent实现ExportedEvent <字符串,JsonNode >{私有静态最终字符串类型=“秩序”;私有静态最终字符串EVENT_TYPE =“OrderCreated”;私人最终长orderId;私人最终JsonNode JsonNode;私人最后即时时间戳;公共OrderCreatedEvent(即时createdAt订单顺序){。orderId = order.getId ();这一点。时间戳= createdAt;这一点。jsonNode = convertToJson(秩序); } @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
:
@ApplicationScoped公开课OrderService {@ inject OrderRepository OrderRepository;@ inject事件< ExportedEvent < ?,? > >事件;@ transactional公共秩序addOrder(订单顺序){= orderRepository.save顺序(顺序);事件。火(新OrderCreatedEvent (Instant.now(),顺序));返回订单;}}
当应用程序代码触发事件通过调用事件#火()
,发件箱扩展将通知事件发生和持续的内容事件变成了发件箱事件表当前事务的范围内。Debe开云体育官方注册网址zium CDC连接器与发件箱事件路由器将监控这个表,负责传送数据使用CDC事件。
看到一个完整的端到端演示,发件箱使用发件箱模式示例说明了两个Quarkus microservice应用程序之间共享数据他们当订单被放置或取消。
反应性变异
如果你的应用程序使用被动的数据源,或者Hibernate的反应,你必须使用稍微不同的配置扩展添加到您的应用程序。
例如,使用以下配置导入反应变量的扩展:
<依赖> < groupId > io.debez开云体育官方注册网址ium < / groupId > < artifactId > debezium-quarkus-outbox-reactive < / artifactId > <版本> tripwire。最后< /版本> < /依赖>
反应性扩展为应用程序提供了相同的io.开云体育官方注册网址debezium.outbox.quarkus.ExportedEvent
界面无电抗变体,但它也提供了开云体育官方注册网址DebeziumOutboxHandler
类。注入开云体育官方注册网址DebeziumOutboxHandler
豆很快持久化到一个应用程序提供了一个方法ExportedEvent
发件箱表。下面的例子展示了一个使用相同的调用ExportedEvent
在前面的例子:
@ApplicationScoped公开课OrderService {@ inject DebeziumOut开云体育官方注册网址boxHandler DebeziumOutboxHandler;@ inject OrderRepository OrderRepository;@ inject事件< ExportedEvent < ?,? > >事件;@ReactiveTransactional公立大学<订单> addOrder(订单订单){返回orderRepository.persistAndFlush(秩序)打电话给(debeziumOutboxHandler。开云体育官方注册网址persistToOutbox(新OrderCreatedEvent (Instant.now(),顺序)));}}
的 |
额外的字段映射
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属性定义转换器,迫使字符串的存储大写。
quarkus.开云体育官方注册网址debezium-outbox.additional-fields = customer_name:字符串:varchar (100): example.UpperCase
一旦字段(s)在应用程序的配置. properties
文件,应用程序的代码需要提供相应的值通过其出口活动。为了做到这一点,应用程序类,它扩展了ExportedEvent
需要覆盖调用的方法getAdditionalFieldValues ()
并返回一个地图
额外的字段名称和值。
在接下来的例子中,我们展示了如何指定customer_name
字段的值Acme的商品
。使用我们的OrderCreatedEvent
从上面的示例一节中,我们扩展事件:
公共类OrderCreatedEvent实现ExportedEvent <字符串,JsonNode > {…@Override公共地图<字符串、对象> getAdditionalFieldValues(){返回集合。singletonMap (“customer_name”、“Acme商品”);}}
额外的字段映射允许指定一个转换器/ JPA属性字段。 在这个例子中,我们定义的 |
在应用程序的配置. properties
文件和更新OrderCreateedEvent
提供这些额外的字段和值,Debezium发件箱SMT现在可以访问这些额外的字段值,并将他们释放事件。开云体育官方注册网址
配置
发件箱扩展Quarkus可以通过设置配置选项application.properties
文件。扩展工作开箱即用的默认配置,但此配置可能不是适合所有情形。
构建时间配置选项
配置属性 |
类型 |
默认的 |
|
字符串 |
OutboxEvent |
|
字符串 |
|
|
字符串 |
|
字符串 |
|
|
|
字符串 |
|
|
字符串 |
|
字符串 |
|
|
|
字符串 |
|
|
字符串 |
|
字符串 |
|
|
|
字符串 |
|
|
字符串 |
|
字符串 |
|
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
|
|
字符串 |
构建时间配置默认值将与发件箱事件路由器SMT开箱即用的。当不使用默认值,确保SMT配置匹配。 |
运行时配置选项
配置属性 |
类型 |
默认的 |
|
布尔 |
真正的 |
分布式跟踪
这个功能目前正在酝酿状态,即精确的语义,配置选项等可能会改变在未来修订,根据我们得到的反馈。具体来说,分布式跟踪支持将被替换为在将来的版本中支持开放遥测技术规范。 |
扩展支持分布式跟踪。看到跟踪文档为更多的细节。