kafka安装和使用的入门教程

这篇文章简单介绍如何在ubuntu上安装kafka,并使用kafka完成消息的发送和接收。


目录

一、安装JDK

二、安装kafka

三、启动kafka

四、kafka发送、接收消息

创建topic

生产消息

消费消息

消费最新的消息

消费之前的消息

指定偏移量消费

消息的分组消费

五、Java中使用kafka

1、创建项目

2、添加依赖

3、创建消息生产者

生产者工厂类

测试发送消息

4、创建消息消费者

消费者工厂类

测试消费消息

六、springboot整合kafka

1、创建项目

2、添加依赖

3、修改配置

4、创建消息生产者

5、创建消息消费者


一、安装JDK

因为zookeper启动要依赖java,需要先安装jdk。

如果你的Ubuntu没有安装jdk,可以参考博主的文章完成jdk的安装。

通过finalshell快速在ubuntu上安装jdk1.8icon-default.png?t=O83Ahttps://blog.csdn.net/heyl163_/article/details/132770166

二、安装kafka

访问kafka官网Apache Kafka,然后点击快速开始

紧接着,点击Download

最后点击下载链接下载安装包

如果下载缓慢,博主已经把安装包上传到百度网盘:

链接:https://pan.baidu.com/s/1sdSqc3Yjw1ZeqFh-GWiQfg?pwd=xwl9
提取码:xwl9
复制这段内容后打开百度网盘手机App,操作更方便哦

三、启动kafka

经过上一步下载完成后,按照页面的提示启动kafka

1、通过远程连接工具,如finalshell、xshell上传kafka_2.13-3.5.0.tgz到服务器上的usr目录

2、切换到usr目录,解压kafka_2.13-3.5.0.tgz

cd /usr

tar -zxzf kafka_2.13-3.5.0.tgz

3、启动zookeeper

修改配置文件confg/zookeeper.properties,修改一下数据目录

dataDir=/usr/local/zookeeper

然后通过以下命令启动kafka自带的zookeeper

bin/zookeeper-server-start.sh config/zookeeper.properties

4、启动kafka

修改配置文件confg/server.properties,修改一下kafka保存日志的目录

log.dirs=/usr/local/kafka/logs

然后新开一个连接窗口,通过以下命令启动kafka

bin/kafka-server-start.sh config/server.properties

四、kafka发送、接收消息

创建topic

bin/kafka-topics.sh --create --topic hello --bootstrap-server localhost:9092

生产消息

往刚刚创建的topic里发送消息,可以一次性发送多条消息,点击Ctrl+C完成发送

bin/kafka-console-producer.sh --broker-list localhost:9092 --topic hello

消费消息

消费最新的消息

新开一个连接窗口,在命令行输入以下命令拉取topic为hello上的消息

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic hello

消费之前的消息

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic hello

指定偏移量消费

 指定从第几条消息开始消费,这里--offset参数设置的偏移量是从0开始的。

bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --partition 0 --offset 1 --topic hello

消息的分组消费

每个消费者都可以指定一个消费者组, kafka 中的同一条消息,只能被同一个消费者组下的某一个消费 者消费。而不属于同一个消费者组的其他消费者,也可以消费到这一条消息。
通过以下命令在启动消费者时设置分组:
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --consumer-property group.id=helloGroup --topic hello

五、Java中使用kafka

通过maven官网搜索kafka的maven依赖版本

https://central.sonatype.com/search?q=kafkaicon-default.png?t=O83Ahttps://central.sonatype.com/search?q=kafka

1、创建项目

在IntelliJ IDEA创建一个maven项目java-kafka

2、添加依赖

在pom.xml中添加kafka的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.edu.sgu.www</groupId>
    <artifactId>java-kafka</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka_2.12</artifactId>
            <version>3.6.0</version>
        </dependency>
    </dependencies>
</project>

3、创建消息生产者

生产者工厂类

package cn.edu.sgu.www.kafka.producer;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerConfig;

import java.util.Properties;

/**
 * 消息生产者工厂类
 * @author heyunlin
 * @version 1.0
 */
public class MessageProducerFactory {

    private static final String IP_ADDRESS = "192.168.145.128"; // 这个修改为自己的Ubuntu的IP地址
    private static final String BOOTSTRAP_SERVERS = IP_ADDRESS + ":9092";

    public static Producer<String, String> getProducer() {
        // 设置消息生产者(发送者)相关属性
        Properties properties = new Properties();

        // 此处配置的是kafka的端口
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS);
        // 配置key的序列化类
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");
        // 配置value的序列化类
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

        return new KafkaProducer<>(properties);
    }

}

测试发送消息

package cn.edu.sgu.www.kafka.producer;

import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;

/**
 * @author heyunlin
 * @version 1.0
 */
public class MessageProducer {

    private static final String TOPIC = "hello";

    public static void main(String[] args) {
        ProducerRecord<String, String> record = new ProducerRecord<>(TOPIC, "1", "Message From Producer.");
        Producer<String, String> producer = MessageProducerFactory.getProducer();

        // 同步发送消息
        producer.send(record);

        // 异步发送消息
        producer.send(record, new Callback() {
            @Override
            public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                String topic = recordMetadata.topic();
                long offset = recordMetadata.offset();
                int partition = recordMetadata.partition();
                String message = recordMetadata.toString();

                System.out.println("topic = " + topic);
                System.out.println("offset = " + offset);
                System.out.println("message = " + message);
                System.out.println("partition = " + partition);
            }
        });

        // 加上这行代码才会发送消息
        producer.close();
    }

}

4、创建消息消费者

消费者工厂类

package cn.edu.sgu.www.kafka.consumer;

import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.util.Properties;

/**
 * 消息消费者工厂类
 * @author heyunlin
 * @version 1.0
 */
public class MessageConsumerFactory {

    private static final String IP_ADDRESS = "192.168.145.128"; // 这个修改为自己的Ubuntu的IP地址
    private static final String BOOTSTRAP_SERVERS = IP_ADDRESS + ":9092";

    public static Consumer<String, String> getConsumer() {
        // 设置消息消费者(接收者)相关属性
        Properties properties = new Properties();

        //kafka地址
        properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS);
        //每个消费者要指定一个group
        properties.put(ConsumerConfig.GROUP_ID_CONFIG, "helloGroup");
        //key序列化类
        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
        //value序列化类
        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");

        return new KafkaConsumer<>(properties);
    }

}

测试消费消息

package cn.edu.sgu.www.kafka.consumer;

import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;

import java.time.Duration;
import java.util.Collections;

/**
 * @author heyunlin
 * @version 1.0
 */
public class MessageConsumer {

    private static final String TOPIC = "hello";

    public static void main(String[] args) {
        Consumer<String, String> consumer = MessageConsumerFactory.getConsumer();
        consumer.subscribe(Collections.singletonList(TOPIC));

        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofNanos(100));

            for (ConsumerRecord<String, String> record : records) {
                System.out.println(record.key() + ": " + record.value());
            }

            // 提交偏移量,避免消息重复推送
            consumer.commitSync(); // 同步提交
            // consumer.commitAsync(); // 异步提交
        }
    }

}

依次运行MessageConsumer、MessageProducer的main方法。

MessageConsumer在无限循环地接受topic为hello的消息。

MessageProducer运行完成后,会输出消息的信息,然后结束。

MessageConsumer会打印刚刚MessageProducer发送的两条消息(同步+异步)。

项目的包结构如下:

六、springboot整合kafka

1、创建项目

在IntelliJ IDEA中创建一个springboot项目springboot-kafka

2、添加依赖

在pom.xml中添加kafka的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.9</version>
        <relativePath />
    </parent>

    <groupId>cn.edu.sgu.www</groupId>
    <artifactId>springboot-kafka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-kafka</name>
    <description>Spring Boot整合Kafka案例项目</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3、修改配置

然后修改application.yml,添加kafka相关配置。(注意修改IP地址为自己Ubuntu的地址)

spring:
  kafka:
    bootstrap-servers: 192.168.254.128:9092
    producer:
      acks: 1
      retries: 3
      batch-size: 16384
      properties:
        linger:
          ms: 0
      buffer-memory: 33554432
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer:
      group-id: helloGroup
      enable-auto-commit: false
      auto-commit-interval: 1000
      auto-offset-reset: latest
      properties:
        request:
          timeout:
            ms: 18000
        session:
          timeout:
            ms: 12000
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

4、创建消息生产者

package cn.edu.sgu.www.kafka.producer;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author heyunlin
 * @version 1.0
 */
@RestController
@RequestMapping(path = "/producer", produces = "application/json;charset=utf-8")
public class KafkaProducer {

    private final KafkaTemplate<String, Object> kafkaTemplate;

    @Autowired
    public KafkaProducer(KafkaTemplate<String, Object> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    @RequestMapping(value = "/sendMessage", method = RequestMethod.GET)
    public String sendMessage(String message) {
        kafkaTemplate.send("hello", message);

        return "发送成功~";
    }

}

5、创建消息消费者

package cn.edu.sgu.www.kafka.consumer;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

/**
 * @author heyunlin
 * @version 1.0
 */
@Component
public class KafkaConsumer {

    @KafkaListener(topics = "hello")
    public void receiveMessage(ConsumerRecord<String, String> record) {
        String topic = record.topic();
        long offset = record.offset();
        int partition = record.partition();

        System.out.println("topic = " + topic);
        System.out.println("offset = " + offset);
        System.out.println("partition = " + partition);
    }

}

然后访问网址http://localhost:8080/producer/sendMessage?message=hello往topic为hello的消息队列发送消息。

控制台打印了参数,成功监听到发送的消息。

好了,文章就分享到这里了,看完不要忘了点赞+收藏哦~


文章涉及的项目已经上传到gitee,可按需获取~

Java中操作Kafka的简单案例项目icon-default.png?t=O83Ahttps://gitee.com/muyu-chengfeng/java-kafka.git

Spring Boot整合Kafka案例项目icon-default.png?t=O83Ahttps://gitee.com/muyu-chengfeng/springboot-kafka.git


Kafka教程PDF是一份关于Kafka消息系统的教学材料,用于指导用户学习理解Kafka的基本概念、架构使用方式。 Kafka是一个分布式的高吞吐量消息队列系统,广泛应用于大规模数据处理分布式系统中。它基于发布订阅模型,消息以topics的形式进行分类,发送者(producer)将消息发送到指定topic,消费者(consumer)则从topic中读取消息。 在Kafka教程PDF中,首先会介绍Kafka的概念架构。Kafka由多个broker组成,每个broker负责存储处理一部分消息。教程将详细解释每个组件的角色功能,帮助读者理解Kafka的整体工作原理。 接下来,教程会介绍如何在本地或集群环境中安装配置Kafka。读者将学习如何设置Zookeeper,用于Kafka的协调管理。然后,教程将展示如何创建管理topics,包括设置partitionreplication等参数。 在使用Kafka之前,了解如何创建producerconsumer是很重要的。教程会详细介绍如何编写代码创建producerconsumer,并演示如何发送接收消息。 此外,Kafka教程还会讨论一些高级功能用法,例如Kafka Streams(用于实时流处理)、Kafka Connect(用于与外部系统的数据传输)Kafka REST Proxy(用于通过REST API与Kafka交互)等。 最后,教程还会提供一些实用的技巧最佳实践,帮助读者更好地使用优化Kafka。 总之,Kafka教程PDF提供了一个系统而全面的学习资源,可以帮助读者快速入门掌握Kafka的核心概念使用方法。无论是初学者还是有一定经验的开发人员都可以从中受益。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐雨橙风ιε

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值