【Kafka系列·入门第四篇】Kafka实操入门:环境部署(Windows/Linux)+ 简单消息收发

大家好,接续上一篇《Kafka核心概念全解析:Topic、Partition、Replica与Consumer Group》,今天我们正式从"理论"走向"实操"------手把手教你完成Kafka环境部署,以及简单的消息收发操作。

上一篇我们吃透了Kafka的四大核心概念,搞懂了Topic、Partition、Replica、Consumer Group的作用和关联关系,这是我们实操的基础。对于新手来说,光懂理论远远不够,只有亲手部署环境、发送和接收消息,才能真正理解Kafka的工作流程,也能为后续的进阶学习(如集群部署、故障排查)打下实操基础。

本文将分为两大核心部分:第一部分是Kafka单机版环境部署,分别讲解Windows和Linux两种常用环境的部署步骤,每一步都标注清晰、避开坑点,新手也能轻松跟着操作;第二部分是简单消息收发实操,通过命令行和Java代码两种方式,实现生产者发送消息、消费者接收消息,让你直观感受Kafka的消息传递流程。

全程避开晦涩的底层源码和复杂配置,只讲新手必学、必用的实操内容,步骤清晰、可落地,跟着操作就能完成所有实操任务。

一、前置准备:明确部署核心依赖

在部署Kafka之前,我们需要先明确一个核心依赖------Kafka依赖Java环境(JDK),因为Kafka本身是基于Java开发的。无论Windows还是Linux环境,都需要先安装并配置好JDK,否则Kafka无法启动。

1. JDK安装要求

  • 版本要求:推荐JDK 1.8及以上(兼容性最好,避免高版本出现兼容问题);

  • 核心注意:安装后必须配置环境变量(JAVA_HOME),否则Kafka无法识别JDK路径;

  • 验证方法:打开命令行(Windows cmd/ Linux终端),输入"java -version",若能显示JDK版本信息,说明JDK安装配置成功。

2. Kafka版本选择

  • 推荐版本:Apache Kafka 2.8.0及以上(稳定版,支持KRaft模式,无需依赖ZooKeeper,新手更易部署);

  • 下载地址:Apache Kafka官方下载地址(https://kafka.apache.org/downloads),选择对应系统的二进制包(Binary downloads),无需下载源码包(源码包需要编译,新手不推荐)。

补充:Kafka 2.8.0之前的版本,必须依赖ZooKeeper管理集群元数据,部署相对复杂;2.8.0及以上版本支持KRaft模式(无ZooKeeper模式),单机部署时无需额外部署ZooKeeper,大幅简化部署步骤,本文将以"无ZooKeeper模式"为例,讲解部署流程。

二、Kafka单机版部署(Windows环境,新手首选)

Windows环境操作直观、适合新手,我们先讲解Windows环境的部署步骤,每一步都标注详细操作和注意事项,避开新手常踩的坑。

步骤1:下载并解压Kafka安装包

  1. 访问Apache Kafka官方下载地址,选择"Binary downloads",下载对应版本的二进制包(如kafka_2.13-3.6.0.tgz,其中2.13是Scala版本,3.6.0是Kafka版本,无需纠结Scala版本,直接下载即可);

  2. 将下载的压缩包解压到指定目录(建议解压到无中文、无空格的路径,避免出现路径错误,如"D:\Kafka\kafka_2.13-3.6.0");

  3. 解压完成后,进入Kafka目录,核心目录说明(新手重点关注):

  • bin:存放所有可执行命令(如启动Kafka、创建Topic、发送消息的命令);

  • config:存放配置文件(核心配置文件为kafka.properties,用于配置Kafka启动参数);

  • logs:存放Kafka运行日志(启动失败时,可查看日志排查问题)。

步骤2:修改核心配置文件(关键步骤)

进入Kafka目录下的config文件夹,找到"kafka.properties"文件,用记事本或Notepad++打开,修改以下3个核心配置(其他配置默认即可,新手无需修改):

  1. 配置Kafka监听地址(listeners):

找到"listeners=PLAINTEXT://:9092",修改为"listeners=PLAINTEXT://localhost:9092"(指定监听本地地址,避免外部访问,适合单机部署);

  1. 配置Kafka日志存储路径(log.dirs):

找到"log.dirs=/tmp/kafka-logs",修改为Kafka目录下的logs文件夹路径(如"log.dirs=D:\Kafka\kafka_2.13-3.6.0\logs"),避免日志存储在临时目录(重启电脑后日志丢失);

  1. 配置KRaft模式(无ZooKeeper):

找到"process.roles=broker,controller"(默认注释,去掉注释),确保Kafka同时承担broker和controller角色(单机部署无需额外部署controller);

补充:如果下载的Kafka版本低于2.8.0,没有KRaft相关配置,需额外部署ZooKeeper,本文不讲解该场景,建议新手直接下载2.8.0及以上版本。

步骤3:初始化KRaft元数据(无ZooKeeper模式必备)

  1. 打开Windows命令行(cmd),切换到Kafka的bin目录(如"cd D:\Kafka\kafka_2.13-3.6.0\bin");

  2. 输入初始化命令,生成KRaft元数据:

kafka-storage.bat format --cluster-id abc123 --config .../config/kafka.properties

说明:--cluster-id 后面可以自定义集群ID(如abc123,任意字符串即可),--config 指定配置文件路径(.../config/kafka.properties 表示上级目录的config文件夹下的kafka.properties);

  1. 执行成功后,会提示"Formatting complete",表示KRaft元数据初始化完成,此时logs目录下会生成相关元数据文件。

步骤4:启动Kafka服务

  1. 保持命令行在Kafka的bin目录下,输入启动命令:

kafka-server-start.bat .../config/kafka.properties

  1. 启动成功后,命令行会持续输出日志,且不会退出(退出命令行则Kafka服务停止);

  2. 验证启动是否成功:打开新的命令行,输入"netstat -ano | findstr 9092",若能看到9092端口被占用(Kafka默认端口),说明Kafka启动成功。

步骤5:停止Kafka服务(可选)

如果需要停止Kafka服务,直接关闭启动Kafka的命令行窗口,或在新的命令行(bin目录下)输入停止命令:

kafka-server-stop.bat

Windows部署常见坑点(新手必看)

  1. 路径错误:解压路径包含中文、空格,导致启动失败,解决方案:重新解压到无中文、无空格的路径;

  2. JDK环境变量未配置:启动时提示"java不是内部或外部命令",解决方案:重新配置JAVA_HOME环境变量,重启命令行;

  3. 9092端口被占用:启动时提示"Address already in use",解决方案:关闭占用9092端口的程序(如其他Kafka实例、其他服务),或修改kafka.properties中的监听端口。

三、Kafka单机版部署(Linux环境,生产环境常用)

Linux环境是生产环境中Kafka的常用部署环境,步骤与Windows类似,但命令略有不同,以下以CentOS 7为例,讲解部署步骤(其他Linux发行版如Ubuntu,命令基本一致)。

步骤1:安装JDK并配置环境变量

  1. 安装JDK(以JDK 1.8为例):

    yum install java-1.8.0-openjdk-devel -y

  2. 配置环境变量:

编辑/etc/profile文件,输入"vi /etc/profile",在文件末尾添加以下内容:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk

export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH

  1. 生效环境变量:

source /etc/profile

  1. 验证JDK:输入"java -version",显示版本信息即配置成功。

步骤2:下载并解压Kafka安装包

  1. 进入/usr/local目录(常用软件安装目录):

cd /usr/local

  1. 下载Kafka二进制包(使用wget命令,若未安装wget,先执行"yum install wget -y"):

wget https://dlcdn.apache.org/kafka/3.6.0/kafka_2.13-3.6.0.tgz

  1. 解压压缩包:

tar -zxvf kafka_2.13-3.6.0.tgz

  1. 重命名文件夹(可选,方便后续操作):

mv kafka_2.13-3.6.0 kafka

步骤3:修改核心配置文件

进入Kafka的config目录,编辑kafka.properties文件:

vi /usr/local/kafka/config/kafka.properties

修改以下3个核心配置(与Windows环境一致,仅路径不同):

  1. listeners=PLAINTEXT://localhost:9092(监听本地地址);

  2. log.dirs=/usr/local/kafka/logs(日志存储路径,需确保该目录存在,若不存在,执行"mkdir /usr/local/kafka/logs");

  3. 去掉"process.roles=broker,controller"的注释,启用KRaft模式。

步骤4:初始化KRaft元数据

  1. 切换到Kafka的bin目录:

cd /usr/local/kafka/bin

  1. 执行初始化命令:

./kafka-storage.sh format --cluster-id abc123 --config .../config/kafka.properties

执行成功后,提示"Formatting complete"即可。

步骤5:启动Kafka服务(后台启动)

  1. 在bin目录下,执行后台启动命令(避免关闭终端后Kafka停止):

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

  1. 验证启动是否成功:

方式1:查看进程,输入"ps -ef | grep kafka",若能看到kafka相关进程,说明启动成功;

方式2:查看端口,输入"netstat -an | grep 9092",若9092端口被占用,说明启动成功。

步骤6:停止Kafka服务(可选)

  1. 查看Kafka进程ID:

ps -ef | grep kafka

  1. 杀死进程(替换为实际的进程ID):

kill -9 进程ID

Linux部署常见坑点(新手必看)

  1. 权限不足:执行命令时提示"Permission denied",解决方案:在命令前加sudo(如sudo ./kafka-server-start.sh),或修改Kafka目录权限(chmod -R 777 /usr/local/kafka);

  2. 防火墙拦截:外部无法访问9092端口,解决方案:开放9092端口(firewall-cmd --add-port=9092/tcp --permanent,然后执行firewall-cmd --reload);

  3. 日志目录不存在:启动时提示"log directory not found",解决方案:手动创建logs目录(mkdir /usr/local/kafka/logs)。

四、实操:简单消息收发(命令行方式,新手首选)

Kafka启动成功后,我们通过命令行方式,实现"创建Topic → 生产者发送消息 → 消费者接收消息"的完整流程,直观感受Kafka的消息传递过程,步骤简单,无需编写代码。

说明:Windows和Linux命令行操作基本一致,仅脚本后缀不同(Windows为.bat,Linux为.sh),以下统一讲解,差异处会特别标注。

步骤1:创建Topic(消息分类容器)

  1. 打开命令行(Windows cmd / Linux终端),切换到Kafka的bin目录;

  2. 输入创建Topic的命令:

bash 复制代码
Windows:kafka-topics.bat --create --topic test_topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1
Linux:./kafka-topics.sh --create --topic test_topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

命令说明(新手必懂):

- --create:表示创建Topic;

- --topic test_topic:指定Topic名称为test_topic(可自定义,如order_topic);

- --bootstrap-server localhost:9092:指定Kafka服务地址(单机部署,即本地地址+默认端口);

- --partitions 1:指定Topic的分区数量为1(新手先从1个分区开始,后续可增加);

- --replication-factor 1:指定每个分区的副本数量为1(单机部署,无需备份,生产环境建议设为2-3)。
  1. 执行成功后,会提示"Created topic test_topic",表示Topic创建成功。

步骤2:启动生产者(发送消息)

  1. 保持命令行在bin目录下,输入启动生产者的命令:

Windows:kafka-console-producer.bat --broker-list localhost:9092 --topic test_topic

Linux:./kafka-console-producer.sh --broker-list localhost:9092 --topic test_topic

  1. 启动成功后,命令行会显示">"提示符,此时可以输入消息,每输入一条消息,按回车即可发送到Kafka;

  2. 示例:输入"Hello Kafka!""Kafka实操入门""新手学习Kafka",每条输入后按回车,这些消息会被发送到test_topic中。

步骤3:启动消费者(接收消息)

  1. 打开一个新的命令行(不要关闭生产者的命令行),切换到Kafka的bin目录;

  2. 输入启动消费者的命令:

Windows:kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test_topic --from-beginning

Linux:./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test_topic --from-beginning

命令说明:

  • --from-beginning:表示从Topic的起始位置开始消费消息(即消费所有已发送的消息),如果不添加该参数,消费者只会消费启动后发送的消息;
  1. 启动成功后,消费者命令行会立即显示生产者发送的所有消息,后续生产者发送的消息,消费者会实时接收,实现消息的实时传递。

步骤4:停止生产者和消费者

  • 生产者:直接关闭生产者的命令行窗口,或按"Ctrl+C"停止;

  • 消费者:同样按"Ctrl+C"停止,或关闭命令行窗口。

五、进阶实操:Java代码实现消息收发(可选)

除了命令行方式,实际开发中,我们通常通过代码(如Java、Python)实现Kafka消息的收发。以下提供简单的Java代码示例,基于Kafka官方客户端,步骤清晰,新手可跟着编写,感受实际开发中的消息收发流程。

前置准备:导入Kafka依赖(Maven)

创建一个Java Maven项目,在pom.xml中添加Kafka客户端依赖(版本与部署的Kafka版本一致,如3.6.0):

bash 复制代码
<dependency>
    <groupId>org.apache.kafka</groupId>

    <artifactId>kafka-clients</artifactId>

    <version>3.6.0</version>

</dependency>

1. Java生产者代码(发送消息)

创建ProducerDemo类,实现消息发送,代码注释详细,新手可直接复制使用:

bash 复制代码
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;

import org.apache.kafka.clients.producer.ProducerRecord;

import java.util.Properties;



public class ProducerDemo {

 public static void main(String[] args) {

        // 1. 配置生产者参数

        Properties props = new Properties();

        // Kafka服务地址

        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");

        // 消息key的序列化方式(String类型)

        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

        // 消息value的序列化方式(String类型)

        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringSerializer");

        // 消息确认机制(ACK=1,兼顾效率和可靠性)

        props.put(ProducerConfig.ACKS_CONFIG, "1");



        // 2. 创建Kafka生产者实例

        KafkaProducer<String, String> producer = new KafkaProducer<>(props);



        // 3. 发送消息(发送3条测试消息)

        for (int i = 1; i <= 3; i++) {

            // 创建消息对象(参数:Topic名称、消息key、消息value)

            ProducerRecord<String, String> record = new ProducerRecord<>("test_topic", "key-" + i, "Java发送的消息-" + i);

            // 发送消息(异步发送,无需等待返回)

            producer.send(record, (metadata, exception) -> {

                if (exception == null) {

                    // 发送成功,打印消息发送的位置(Topic、分区、偏移量)

                    System.out.println("消息发送成功:" + metadata.topic() + "-" + metadata.partition() + "-" + metadata.offset());

                } else {

 // 发送失败,打印异常信息

                    exception.printStackTrace();

                }

            });

        }



        // 4. 关闭生产者(释放资源)

        producer.close();

    }

}

2. Java消费者代码(接收消息)

创建ConsumerDemo类,实现消息接收,代码注释详细,可直接复制使用:

bash 复制代码
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 java.time.Duration;

import java.util.Collections;

import java.util.Properties;



public class ConsumerDemo {

    public static void main(String[] args) {

        // 1. 配置消费者参数

        Properties props = new Properties();

        // Kafka服务地址

        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");

        // 消费者组ID(自定义,如test_group)

        props.put(ConsumerConfig.GROUP_ID_CONFIG, "test_group");

        // 消息key的反序列化方式

        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");

        // 消息value的反序列化方式

        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");

        // 自动提交offset(新手首选,简单便捷)

        props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "true");

        // 自动提交offset的时间间隔(1000毫秒)

        props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");

        // 从Topic起始位置开始消费消息

        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");



        // 2. 创建Kafka消费者实例

        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);



        // 3. 订阅Topic(订阅test_topic)

        consumer.subscribe(Collections.singletonList("test_topic"));



        // 4. 循环消费消息(持续监听消息)

        while (true) {

            // 拉取消息(超时时间为1秒,若没有消息,等待1秒后继续拉取)

            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));

            // 遍历消息并打印

            for (ConsumerRecord<String, String> record : records) {

                System.out.println("收到消息:key=" + record.key() + ", value=" + record.value() + ", 分区=" + record.partition() + ", offset=" + record.offset());

            }

        }

    }

}

代码实操注意事项

  1. 确保Kafka服务已启动,否则代码会连接失败;

  2. 代码中Kafka服务地址(localhost:9092)需与部署时的配置一致;

  3. 先启动消费者代码,再启动生产者代码,否则生产者发送的消息,消费者可能无法接收(若未配置"从起始位置消费");

  4. 若出现"连接超时""Topic不存在"等异常,检查Kafka服务是否启动、Topic是否创建、端口是否开放。

六、实操总结:新手必掌握的核心要点

通过本文的实操,你已经完成了Kafka环境部署和简单消息收发,总结3个核心要点,帮你巩固实操内容:

  1. 部署核心:Kafka依赖JDK,2.8.0及以上版本支持无ZooKeeper模式,部署步骤简化,新手优先选择该版本;

  2. 消息流程:创建Topic → 生产者发送消息(指定Topic) → 消费者订阅Topic → 消费者接收消息,这是Kafka消息传递的核心流程;

  3. 新手避坑:部署时避免中文路径、配置好JDK环境变量;实操时先启动Kafka服务,再启动生产者和消费者,确保Topic已创建。

七、下一篇预告+互动交流

恭喜你,完成了Kafka系列第四篇的实操学习!通过本文,你已经亲手部署了Kafka环境,实现了消息的发送和接收,真正从"理论"走向了"实操",迈出了Kafka学习的关键一步。

下一篇文章,我们将深入实操细节------《Kafka实操进阶:Topic/Partition管理 + 消息可靠性配置》。

下一篇我们将讲解如何管理Topic(修改分区数量、删除Topic)、如何配置消息可靠性(ACK机制、副本配置)、如何排查常见的实操故障(消息丢失、消费异常),帮你进一步提升Kafka实操能力,敬请期待!

在部署Kafka或消息收发实操中,你遇到了哪些问题?比如启动失败、消息发送/接收不到,或者代码运行异常?欢迎在评论区留言分享,我们一起交流排查,共同进步!

相关推荐
gfdhy2 小时前
【Linux服务器】基础服务实战部署|Nginx+MySQL+PHP+WordPress,让服务器真正可用
linux·服务器·mysql·nginx·php·毕设
Cosmoshhhyyy2 小时前
《Effective Java》解读第46条:优先选择Stream中无副作用的函数
java·windows·python
风酥糖2 小时前
Android上部署Linux环境的方案总结对比
android·linux·运维
今夕资源网2 小时前
LANDrop 跨平台局域网文件传输工具 支持 iOS、Android、macOS、Windows、Linux、Android TV 等操作系统
android·linux·macos·跨平台·文件传输·局域网文件共享·局域网文件传输
飘忽不定的bug2 小时前
RK3588 linux+rtos(mcu)串口适配
linux·单片机·elasticsearch
chase。2 小时前
Ubuntu 22.04 解决 nvblox 编译依赖冲突:libgoogle-glog-dev 安装问题全记录
linux·运维·ubuntu
百事牛科技4 小时前
Word密码管理:修改打开密码的两种实用方法
windows·word
123过去4 小时前
wordlists使用教程
linux·网络·测试工具·安全
有毒的教程10 小时前
Ubuntu 虚拟机磁盘空间不足完整解决教程
linux·运维·ubuntu