|
这个版本仍在开发中,目前尚未被认为是稳定的。要使用最新稳定版本,请使用 Spring for Apache Kafka 4.0.4! |
什么是新内容?
4.0 有哪些新内容(自 3.3 起)
这一部分涵盖了从版本3.3到版本4.0所做的更改。对于早期版本的变更历史,请参阅变更历史。
Apache Kafka 4.0 客户端升级
Spring for Apache Kafka 已升级以使用 Apache Kafka 客户端版本 4.0.0。
此次升级带来了几个重要的更改:
-
所有基于ZooKeeper的功能已在Kafka 4.0完全过渡到KRaft模式时被移除
-
移除了ZooKeeper依赖项
-
嵌入式Kafka测试框架现在仅使用KRaft模式
-
The
EmbeddedKafkaZKBroker类已移除,所有功能现在都由EmbeddedKafkaKraftBroker处理
嵌入式Kafka测试框架更改
测试基础设施已得到显著更新:
-
The
EmbeddedKafkaRuleJUnit 4 rule has been removed -
The
@EmbeddedKafka注解已简化,移除了与 ZooKeeper 相关的属性: -
The
kraft属性已移除,因为 KRaft 模式现在是唯一选项 -
ZooKeeper-specific properties 例如
zookeeperPort、zkConnectionTimeout和zkSessionTimeout已经被移除 -
KafkaClusterTestKit 现在导入用于 KRaft 模式的新的包
-
一些测试已更新以解决KRaft模式中静态端口分配的限制
-
针对测试中的复制因子进行了调整,以适应KRaft要求
移除已弃用功能
已移除几个已弃用的项目:
-
已弃用的
partitioner类已从运行时提示中移除 -
已弃用的
sendOffsetsToTransaction方法,该方法使用String consumerGroupId已被移除
Kafka Streams API 变更
-
KafkaStreamBrancher已更新以使用新的split()和branch()方法,而不是已弃用的branch()方法 -
The
DeserializationExceptionHandlerhas been updated to use the newErrorHandlerContext
内部 API 更新,与 Apache Kafka 4.0.0 相关
-
The
BrokerAddress类现在使用org.apache.kafka.server.network.BrokerEndPoint代替已弃用的kafka.cluster.BrokerEndPoint -
The
GlobalEmbeddedKafkaTestExecutionListenerhas been updated to work solely with KRaft mode
新消费者重平衡协议
Spring for Apache Kafka 4.0 支持 Kafka 4.0 的新消费者重新平衡协议 - KIP-848。 对于详情,请参见 新消费者重新平衡协议文档。
支持多值头
The JsonKafkaHeaderMapper and SimpleKafkaHeaderMapper 支持为 Kafka 记录的多值头映射。
更多详情请参阅 支持多值头映射。
配置额外的RecordInterceptor
监听器容器现在支持通过 getRecordInterceptor() 进行拦截器自定义。
详见 消息监听器容器 部分的说明。
每条记录的批处理监听器观察
现在可以为使用批处理监听器时的每条记录获取观察值。 请参阅 批处理监听器的可观测性 以获取更多信息。
Kafka 队列(共享消费者)支持
Spring for Apache Kafka 现在通过 share consumers 提供 Kafka Queues 的早期访问支持,这些 share consumers 是 Apache Kafka 4.0.0 的一部分,实现了 KIP-932。 这使得多个消费者可以同时从相同的分区消费,相比传统的 consumer groups 提供了更好的负载分布。 见 Kafka Queues (Share Consumer) 了解更多信息。
Jackson 3 支持
Spring for Apache Kafka 现在提供了对 Jackson 3 的全面支持,同时保留对 Jackson 2 的支持。 当可用时,Jackson 3 会自动检测并优先使用,提供增强的性能和现代的 JSON 处理能力。
所有 Jackson 2 类现在都有与之对应的 Jackson 3 类,命名一致且类型安全性得到提升:
-
JsonKafkaHeaderMapper替换DefaultKafkaHeaderMapper -
JacksonJsonSerializer/Deserializer替换JsonSerializer/Deserializer -
JacksonJsonSerde替换JsonSerde -
JacksonJsonMessageConverter家族替换JsonMessageConverter家族 -
JacksonProjectingMessageConverter替换ProjectingMessageConverter -
DefaultJacksonJavaTypeMapper替换DefaultJackson2JavaTypeMapper
新的 Jackson 3 类使用 JsonMapper 代替泛型 ObjectMapper 以增强类型安全性,并利用了 Jackson 3 改进的模块系统和性能优化。
迁移路径: 现有应用程序在添加 Jackson 3 到类路径且更新类引用以使用新的 Jackson 3 等价项后将继续正常工作。 要迁移到 Jackson 3,只需将 Jackson 3 添加到您的类路径并更新类引用以使用新的 Jackson 3 等价项。 当两种版本同时存在时,框架会自动检测并优先选择 Jackson 3。
向后兼容性: 所有 Jackson 2 类都已弃用但仍然完全功能正常。 它们将在未来的一个重大版本中移除。
见 序列化、反序列化和消息转换 中的配置示例。
Spring 重试 依赖移除
Spring for Apache Kafka 已移除对其上 Spring Retry 的依赖,转而使用在 Spring Framework 7 中引入的核心重试支持。 这是一个影响整个框架重试配置和 API 的重大变更。
BackOffValuesGenerator 会在启动时预先生成所需的BackOff值,现在可以直接与 Spring Framework 的BackOff接口配合,而不再使用BackOffPolicy。
这些值由监听器基础设施进行管理,Spring Retry 也不再参与。
从配置的角度来看,Spring Kafka 严重依赖于 Spring Retry 的 @Backoff 注解。
由于 Spring 框架中没有等效的注解,该注解已移动到 Spring Kafka 作为 @BackOff,并带有以下改进:
-
统一命名:使用
@BackOff代替@Backoff以保持一致性 -
表达式评估:所有字符串属性都支持SpEL表达式和属性占位符
-
Duration format support: String attributes accept
java.util.Durationformats (e.g., "2s", "500ms") -
增强文档:带有更清晰解释的改进型Javadoc
迁移示例:
// Before
@RetryableTopic(backoff = @Backoff(delay = 2000, maxDelay = 10000, multiplier = 2))
// After
@RetryableTopic(backOff = @BackOff(delay = 2000, maxDelay = 10000, multiplier = 2))
// With new duration format support
@RetryableTopic(backOff = @BackOff(delayString = "2s", maxDelayString = "10s", multiplier = 2))
// With property placeholders
@RetryableTopic(backOff = @BackOff(delayString = "${retry.delay}", multiplierString = "${retry.multiplier}"))
RetryingDeserializer 不再提供 RecoveryCallback,而是提供一个以 RetryException 为输入的等效功能。
此内容包含抛出的异常以及重试尝试的次数:
// Before
retryingDeserializer.setRecoveryCallback(context -> {
return fallbackValue;
});
// After
retryingDeserializer.setRecoveryCallback(retryException -> {
return fallbackValue;
});
使用 BinaryExceptionClassifier 已被新引入的 ExceptionMatcher 取代,后者提供了一个更精致的 API。
额外的更改包括:
-
DestinationTopicPropertiesFactory使用ExceptionMatcher代替BinaryExceptionClassifier -
The
uniformRandomBackoff方法在RetryTopicConfigurationBuilder中已弃用,推荐使用 jitter 支持 -
错误处理实用工具已更新以与新的异常匹配系统配合使用
-
Kafka Streams retry templates now use Spring Framework’s retry support
应用程序必须更新其配置以使用新的 Spring Framework 重试 API,但重试行为和功能保持不变。