kafka 生成者案例
引入 jar 包
- Apache Kafka 相关依赖:
kafka-clients:Kafka 客户端库,用于与 Kafka 集群进行通信。
kafka_2.13:Kafka 核心库,包含 Kafka 的基本功能和工具。 - 相关依赖:
slf4j-api:用于日志记录,作为日志框架的接口。
log4j 或 logback:具体的日志实现,根据你的选择使用其中之一。
<dependencies>
<!-- Kafka 相关依赖 -->
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.13</artifactId>
<version>2.8.0</version>
</dependency>
<!-- 日志依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<!-- 选择一个日志实现 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.32</version>
</dependency>
<!-- 或者使用 logback -->
<!-- <dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.5</version>
</dependency> -->
</dependencies>
事例代码:
package org.example;
import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;
import java.util.Properties;
public class KafkaProducerExample {
public static void main(String[] args) {
Producer<String, String> producer = getProducer();
// Kafka 主题名称
String topic = "mytopic";
// 发送消息
String message = "Hello, Kafka!";
ProducerRecord<String, String> record = new ProducerRecord<>(topic, message);
producer.send(record, new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
if (exception != null) {
System.err.println("Error sending message: " + exception.getMessage());
} else {
System.out.println("Message sent successfully! Topic: " + metadata.topic() +
", Partition: " + metadata.partition() + ", Offset: " + metadata.offset());
}
}
});
// 关闭 Kafka 生产者
producer.close();
}
private static Producer<String, String> getProducer() {
Properties properties = getProperties();
// 创建 Kafka 生产者
Producer<String, String> producer = new KafkaProducer<>(properties);
return producer;
}
private static Properties getProperties() {
// Kafka 服务器地址和端口
String bootstrapServers = "localhost:9092";
// Kafka 生产者配置
Properties properties = new Properties();
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
return properties;
}
}
必要参数配置
bootstrap.servers
是 Kafka 生产者和消费者配置中的一个属性,用于指定 Kafka 集群的地址。它是一个逗号分隔的字符串,每个地址由主机名和端口号组成,用于连接到 Kafka 集群中的一个或多个 Kafka 代理(broker)。
例如,bootstrap.servers 的配置值可以是:
单个 broker:bootstrap.servers=localhost:9092
多个 broker:bootstrap.servers=broker1:9092,broker2:9092,broker3:9092
当 Kafka 客户端(生产者或消费者)启动时,它会使用 bootstrap.servers 配置的地址来发现 Kafka 集群中的可用 broker,并与其中的一个 broker 建立连接。一旦连接建立成功,客户端将能够与整个 Kafka 集群进行通信。
请注意,bootstrap.servers 是 Kafka 客户端连接 Kafka 集群的入口点,因此需要指定至少一个可用的 broker 地址。
key.serializer
指定消息键的序列化器类。常见的键序列化器包括字符串序列化器(org.apache.kafka.common.serialization.StringSerializer)和整数序列化器(org.apache.kafka.common.serialization.IntegerSerializer)等。
value.serializer
指定消息值的序列化器类。常见的值序列化器也包括字符串序列化器、整数序列化器,以及常用的 JSON 序列化器(org.apache.kafka.connect.json.JsonSerializer)和 Avro 序列化器(io.confluent.kafka.serializers.KafkaAvroSerializer)等。
kafka消费者案例
引入的 jar 包和生产者一致
package org.example;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.serialization.StringDeserializer;
import java.time.Duration;
import java.util.Collections;
import java.util.Properties;
public class KafkaConsumerExample {
public static void main(String[] args) {
KafkaConsumer<String, String> consumer = getConsumer();
// 订阅的主题
String topic = "mytopic";
// 订阅主题
consumer.subscribe(Collections.singleton(topic));
// 持续消费消息
while (true) {
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
System.out.println("Received message: key=" + record.key() + ", value=" + record.value());
}
}
}
private static KafkaConsumer<String, String> getConsumer() {
Properties props = getProperties();
// 创建 Kafka 消费者
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
return consumer;
}
private static Properties getProperties() {
// Kafka 服务器地址
String bootstrapServers = "localhost:9092";
// 消费者组ID
String groupId = "my-consumer-group";
// 配置消费者属性
Properties props = new Properties();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);
props.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
return props;
}
}
必要参数
bootstrap.servers
同生产者配置,broker列表
group.id
消费者组的唯一标识符。消费者组是一组具有相同逻辑功能的消费者,用于实现负载均衡和容错。同一个消费者组内的消费者共同消费订阅的主题,并且每个分区只会被一个消费者组内的一个消费者消费。
自主命名
key.deserializer
键的反序列化器。需要和生产者保持一致
value.deserializer
值的反序列化器。需要和生产者保持一致
简单的 demo 到此为止。后续深入详细介绍生产者和消费者。
生产者详解
这段对于初学者不建议往后看了,对于想详细了解的继续。。。。。。。。