kafka 生成者和消费者 案例

kafka 生成者案例

引入 jar 包
  1. Apache Kafka 相关依赖:
    kafka-clients:Kafka 客户端库,用于与 Kafka 集群进行通信。
    kafka_2.13:Kafka 核心库,包含 Kafka 的基本功能和工具。
  2. 相关依赖:
    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 到此为止。后续深入详细介绍生产者和消费者。

生产者详解

这段对于初学者不建议往后看了,对于想详细了解的继续。。。。。。。。

https://blog.csdn.net/sangewuxie/article/details/131277227

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值