Docker部署kafka并使用Java客户端连接

本文详细介绍了如何使用Docker在单机环境下部署Zookeeper和Kafka,包括创建和验证Kafka topic,创建生产者和消费者进行消息交互,并提供了Java客户端远程连接的示例代码。此外,还展示了如何通过Docker部署Kafka管理平台Kafka-Manager,便于监控和管理Kafka集群。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

docker部署kafka(单机)

注意:ip 换成你宿主机的真实ip !!!

环境搭建

第一步 搭建zookeeper环境
docker pull zookeeper
docker run -d --name zookeeper -p 2181:2181 -t zookeeper
第二步 创建kafka环境 (ip换成你宿主机的真实ip)
docker pull wurstmeister/kafka 
docker run  -d --name kafka -p 9092:9092  --env KAFKA_ADVERTISED_HOST_NAME=localhost  -e KAFKA_ZOOKEEPER_CONNECT=ip:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://ip:9092  -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e KAFKA_HEAP_OPTS="-Xmx256M -Xms128M"  wurstmeister/kafka
第三步 验证kafka是否正确安装
docker exec -it kafka bash 
cd /opt/kafka_*/bin
# 创建topic
./kafka-topics.sh --create --zookeeper ip:2181 --replication-factor 1 --partitions 3 --topic test 
第四步 创建生产者去生产消息
./kafka-console-producer.sh --broker-list ip:9092 --topic test
第五步 创建消费者去消费消息
./kafka-console-consumer.sh --bootstrap-server ip:9092 --topic test
第六步 搭建kafka管理平台
docker pull sheepkiller/kafka-manager
docker run -it -d --rm  -p 9000:9000 -e ZK_HOSTS="ip:2181"  sheepkiller/kafka-manager

​ 创建成后,在浏览器中访问http://ip:9000

Java客户端远程连接

配置pom.xml文件
	<!-- 添加kafka依赖包(根据自己使用的版本选择版本号)-->
	<dependency>
      <groupId>org.apache.kafka</groupId>
      <artifactId>kafka-clients</artifactId>
      <version>2.0.0</version>
    </dependency>
创建生产者
package com.frank.exercise.kafka;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

public class CustomProducer {
    private final static String IP = "your ip"
        
    public static void main(String[] args){
        Properties prop = new Properties();
        //kafka连接地址
        prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,IP+":9092");
        //用于实现Serializer接口的密钥的串行器类。
        prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        //生产者数据安全
        prop.put(ProducerConfig.ACKS_CONFIG,"-1");

        //创建生产者对象
        KafkaProducer<String,String> producer=new KafkaProducer<String, String>(prop);
        //生成10条数据
        for (int i = 0; i <10; i++) {
            //创建消息对象
            ProducerRecord<String, String> producerRecord = new ProducerRecord<>("test", "hello world" + i);
            //调用生产者消息发送方法
            producer.send(producerRecord);
            try {
                //每条消息间隔100毫秒
                Thread.sleep(100);
            } catch (InterruptedException e) {

                e.printStackTrace();
            }
        }
        System.out.println("game over!!!");

    }
}
在服务器端查看Topic分区内数据条数
kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list ip:9092 --topic test -time -1 --offsets 1
在服务器端消费数据
./kafka-console-consumer.sh --bootstrap-server ip:9092 --topic test
创建消费者
package com.frank.exercise.kafka;

import org.apache.kafka.clients.consumer.*;
import org.apache.kafka.common.TopicPartition;
import org.apache.kafka.common.serialization.StringDeserializer;

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Properties;

public class CustomConsumer {
    private final static String IP = "your ip"

    public static void main(String[] args) {
        Properties prop = new Properties();
        //kafka连接地址       
        prop.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, IP + ":9092");
        prop.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        prop.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        //会话响应的时间,超过这个时间kafka可以选择放弃消费或者消费下一条消息      
        prop.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "30000");
        //false:非自动提交偏移量     \
        prop.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, "false");
        //自动提交偏移量周期 
        prop.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
        //earliest:拉取最早的数据        //latest:拉取最新的数据        //none:报错 
        prop.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        //一个消费者组G1里只有一个消费者    
        prop.put(ConsumerConfig.GROUP_ID_CONFIG, "G1");
        //创建kafka消费者对象    
        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(prop);
        //设置自动分配topic与消费者对象      
        consumer.subscribe(Collections.singleton("test"));
        while (true) {
            //消费数据,一次10条    
            ConsumerRecords<String, String> poll = consumer.poll(10);
            //遍历输出       
            for (ConsumerRecord<String, String> record : poll) {
                System.out.println(record.offset() + "\t" + record.key() + "\t" + record.value());
            }
        }
    }
}

参考文章

  • https://blog.csdn.net/weixin_38468167/article/details/110823356
  • https://zhuanlan.zhihu.com/p/354217865
### 通过 Docker 部署 Kafka 配置鉴权 #### 使用 Docker Compose 部署 Kafka 和 Zookeeper 为了在 Docker部署 Kafka,通常会结合 Zookeeper 进行管理。可以通过 `docker-compose` 文件定义服务启动它们。 以下是用于部署 Kafka 的基本 `docker-compose.yml` 文件: ```yaml version: '3' services: zookeeper: image: confluentinc/cp-zookeeper:latest environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 ports: - "2181:2181" kafka: image: confluentinc/cp-kafka:latest depends_on: - zookeeper ports: - "9092:9092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:plaintext,PLAINTEXT_HOST:plaintext KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 ``` 此文件定义了一个简单的 Kafka 和 Zookeeper 设置[^1]。 --- #### 配置 Kafka 认证机制 (Authentication Setup) Kafka 支持多种认证方式,常见的有 SASL/PLAIN、SSL 或者两者组合的方式。下面介绍如何设置基于 SASL/PLAIN 的简单用户名密码验证。 ##### 修改 `docker-compose.yml` 添加 SASL/PLAIN 验证支持 更新后的 `docker-compose.yml` 如下所示: ```yaml version: '3' services: zookeeper: image: confluentinc/cp-zookeeper:latest environment: ZOOKEEPER_CLIENT_PORT: 2181 ZOOKEEPER_TICK_TIME: 2000 ports: - "2181:2181" kafka: image: confluentinc/cp-kafka:latest depends_on: - zookeeper ports: - "9092:9092" - "29092:29092" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: | SASL_PLAINTEXT://kafka:29092,SASL_PLAINTEXT_HOST://localhost:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_PLAINTEXT_HOST:SASL_PLAINTEXT KAFKA_SASL_ENABLED_MECHANISMS: PLAIN KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: PLAIN KAFKA_AUTHORIZER_CLASS_NAME: kafka.security.authorizer.AclAuthorizer KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: "false" KAFKA_AUTO_CREATE_TOPICS_ENABLE: "true" KAFKA_INTER_BROKER_LISTENER_NAME: SASL_PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 volumes: - ./security:/etc/kafka/secrets ``` 在此配置中,启用了 SASL/PLAIN 协议作为安全层,指定了 ACL 授权器来控制访问权限[^2]。 --- #### 创建 JAAS 配置文件 JAAS(Java Authentication and Authorization Service)是实现 Kafka 用户名和密码验证的核心组件。创建一个名为 `jaas.conf` 的文件,内容如下: ```conf KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="password123" user_admin="password123"; }; ``` 将该文件挂载到容器中的 `/etc/kafka/secrets/jaas.conf` 路径下。 --- #### 启动服务 运行以下命令以启动 Kafka 和 Zookeeper 容器: ```bash docker-compose up -d ``` 这将在后台启动所有指定的服务。 --- #### 测试连接 可以使用 Kafka 提供的工具测试客户端是否能够成功连接到服务器。例如,尝试生产消息或消费消息时需提供相应的用户名和密码。 ```bash kafkacat -b localhost:9092 -X security.protocol=SASL_PLAINTEXT \ -X sasl.mechanisms=PLAIN -X sasl.username=admin -X sasl.password=password123 \ -L ``` 上述命令列出了可用的主题列表,验证了身份验证功能的工作状态。 --- ### 总结 以上方法展示了如何利用 Docker Compose 部署带有 SASL/PLAIN 鉴权的 Kafka 实例。通过自定义环境变量以及挂载必要的配置文件,实现了对用户的强安全性保护。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值