Quarkus通过 SmallRye Reactive Messaging 框架为Apache Kafka提供支持。现将Quarkus框架集成Kafka分享下:
首先需引入maven包
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-smallrye-reactive-messaging-kafka</artifactId>
</dependency>
其次配置文件
在application.yml中增加配置
mp:
messaging:
outgoing: #生产者配置
data-out:
connector: smallrye-kafka
deserializer: org.apache.kafka.common.serialization.StringSerializer
topic: ${KAFKA_TOPIC}
bootstrap:
servers: ${KAFKA_SERVER}
incoming: #消费者配置
data-in:
connector: smallrye-kafka
group:
id: ${KAFKA_GROUP_ID}
serializer: org.apache.kafka.common.serialization.StringSerializer
topic: ${KAFKA_TOPIC}
bootstrap:
servers: ${KAFKA_SERVER}
或者增加application.properties文件,在此文件中配置
#kafka消费者配置
mp.messaging.incoming.data-in.connector=smallrye-kafka
mp.messaging.incoming.data-in.group.id=${KAFKA_GROUP_ID}
mp.messaging.incoming.data-in.topic=${KAFKA_TOPIC}
mp.messaging.incoming.iot-data.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
mp.messaging.incoming.data-in.auto.offset.reset=latest
mp.messaging.incoming.data-in.bootstrap.servers=${KAFKA_SERVER}
#kafka生产者配置
mp.messaging.outgoing.data-out.connector=smallrye-kafka
mp.messaging.outgoing.data-out.topic=${KAFKA_TOPIC}
mp.messaging.outgoing.data-out.value.serializer=org.apache.kafka.common.serialization.StringSerializer
mp.messaging.outgoing.iot-data.serializer=org.apache.kafka.common.serialization.StringSerializer
mp.messaging.outgoing.data-out.bootstrap.servers=${KAFKA_SERVER}
其中注意下:
kafka broker地址可通过两种方式进行配置,如未提供引属性,则默认为 localhost:9092
1. 全局环境配置,则可用以下配置即可
kafka: bootstrap: servers: ${KAFKA_HOST}
2. 若业务程度中需消费来源于不同kafka服务器的数据,则可在不同的channel中进行配置, 如下:
mp.messaging.outgoing.data-in.bootstrap.servers=${KAFKA_SERVER}
注意:其中data-in和data-out即channel-name。
常用配置说明:
incoming:消费者;outgoing:生产者
参数 | 说明 |
connector | 配置smallrye-kafka值,管理channel。 |
iot-data | channel名称,incoming和outgoing都需要,可根据业务设置,在应用配置里面,channel名称是唯一的。因此,如果您打算在相同topic上同时配置一个接收和一个发送的channel,您需要对这两个 channels 使用不同的名称(比如本指南的例子,mp.messaging.incoming.prices 和 mp.messaging.outgoing.prices-out )。 |
topic | incoming和outgoing都需要 |
value.deserializer | incoming消息反序列化,必需设置,outgoing无此参数 |
value.serializer | outgoing消息序列化,必需设置,incoming无此参数 |
group.id | 消费者group,生产者无此参数 |
auto.offset.reset | 消费顺序,earliest、latest。默认latest,即从最新消息开始消费;earliest即从最早消息开始消费。生产者无此参数 |
最后编写逻辑代码
Kafka生产者
@ApplicationScoped
public class KafkaProducerService {
@Inject
@Channel("data-out")
Emitter<String> iotDataEmitter;
public void sendMessage(String message) {
//发送消息
iotDataEmitter.send(message);
}
}
Kafka消费者
public class KafkaConsumerService {
@Incoming("data-in")
@Blocking
public void consume(String message) {
//TODO 处理消息
}
大家也可参考官网说明:Apache Kafka参考指南 - Quarkus