用Docker部署Kafka,用Java编写简单用例

写在前面,此文章意在记录工作中的总结,为他人提供一点点的帮助,对文章的内容欢迎大家提出意见,文章中提到的配置皆在虚拟机当中部署,故不作集群和其他完备处理,意在作简单了解和练习。


Kafka和Zookeeper的关系

Zookeeper在Kafka中扮演重要的角色,用于管理Kafka集群的元数据和实现Kafka集群的协调和管理。Zookeeper在Kafka集群中发挥了重要的角色,它管理着Kafka的发布/订阅机制、Broker状态信息、Topic的元数据信息等,使得Kafka集群的分布式协同和协调变得可能。

Kafka和Zookeeper的安装

  • 采用docker安装部署zookeeper和kafka,这里省去docker的安装
    • 在开始安装zookeeper和kafka之前需要确认自己的docker环境正常,使用 docker --version来查看自己的docker版本号,如果出现 即为正常
    • 使用docker pull wurstmeister/kafka:2.13-2.6.0来拉取kafka的docker镜像,在这一步可能会出现拉取失败,拉取超时,分别对应着版本号错误或者不存在,docker没有配置国内镜像源,请自行百度解决。
    • 使用docker pull zookeeper来安装kafka的老大哥zooKeeper,当docker命令未指出版本号时,都采用latest版本 -当镜像拉取完毕之后可以通过docker的docker run命令来创建并且运行容器,再首次创建之后使用docker startdocker stop来开启或者关闭容器

Kafka和Zookeepr的配置与部署

  • 当所有镜像拉取完成之后,可以用docker images来查看所有的镜像

  • 当容器启动完成之后,使用docker ps -a,可以查看所有启动的容器。

  • 在确认容器全都启动完成之后可以使用命令docker exec -it zk /bin/bash来进入Zookeeper容器内部 来启动Zookeeper客户端,尝试连接zookeeper客户端:zkCli.sh,最后使用ls /来确认客户端连接成功。

  • 使用docker exec -it kafka1 /bin/bash来进入kafka容器内部,在这之前你如果在Zookeeper容器内部无法关闭,可以选中虚拟机窗口,使用ctrl+p+q 来跳出容器内部。

  • 当进入容器之后可以运行消息的生产者来发送消息,首先切换cd /opt/kafka/bin下,使用./kafka-console-producer.sh --broker-list localhost:9092 --topic sun来启动一个生产者,当光标变换如下,即进入了消息编辑模式:

  • 发送消息

  • 使用命令/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic sun --from-beginning来接收消息

  • 当实现了上述过程,即完成了简单的消息生产和消费,但是!怎么能缺少Java参与!


  • 用Java创建一个生产者
java 复制代码
package com.example.kafka;

import org.apache.kafka.clients.producer.KafkaProducer;
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 Producer {
    public static String topic = "message_test";  //主题

    public static void main(String[] args) throws InterruptedException {
        Properties pro = new Properties();
        pro.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.49.128:9092");        //配置ip地址
        pro.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);    //配置key
        pro.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class);   //配置Value
        pro.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG,"50000000");
        pro.put(ProducerConfig.TIMEOUT_CONFIG,"50000000");
        pro.put(ProducerConfig.RETRIES_CONFIG, 3);
        KafkaProducer<String,String> kafkaProducer = new KafkaProducer<>(pro);
        try {
            while(true){
                String msg = "hellowrold";
                ProducerRecord<String,String> producerRecord = new ProducerRecord<>(topic,msg);
                kafkaProducer.send(producerRecord);
                System.out.println("消息发送成功");
                Thread.sleep(50000);
            }
        }finally {
            kafkaProducer.close();
        }


    }
  • 用Java实现一个消费者
java 复制代码
package com.example.kafka;

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.util.Collections;
import java.util.Properties;

public class Consumer {

    public static void main(String[] args) {
        Properties p = new Properties();
        p.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.49.128:9092");
        p.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        p.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        p.put(ConsumerConfig.GROUP_ID_CONFIG, "message_test");
        KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(p);
        kafkaConsumer.subscribe(Collections.singletonList(Producer.topic));// 订阅消息
        while (true) {
            ConsumerRecords<String, String> records = kafkaConsumer.poll(100);
            for (ConsumerRecord<String, String> record : records) {
                System.out.println(String.format("topic:%s,offset:%d,消息:%s", //
                        record.topic(), record.offset(), record.value()));
            }
        }
    }

当我们依次运行生产者和消费者,消息就可以被生产和消费啦!


总结

今天遇到用java代码链接kafka超时失败,设置了超时时间仍然没有成功,后重新启动虚拟机,先开Zookeeper后开kafka就运行正常了,猜测原因可能是虚拟机挂起状态回复,使得kafka没有正确被注册到Zookeeper上。 有两个比较好用的可视化客户端软件可以更直观的观察到消息的生产和消费这里记录地址,以后备用。 kafka toolZooInspector

相关推荐
c++之路17 分钟前
C++20概述
java·开发语言·c++20
Championship.23.2422 分钟前
Linux Top 命令族深度解析与实战指南
java·linux·服务器·top·linux调试
橘子海全栈攻城狮37 分钟前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
逻辑驱动的ken43 分钟前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
冷雨夜中漫步1 小时前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai
直奔標竿1 小时前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
one_love_zfl2 小时前
java面试-微服务组件篇
java·微服务·面试
一只大袋鼠2 小时前
Java进阶:CGLIB动态代理解析
java·开发语言
环流_2 小时前
HTTP 协议的基本格式
java·网络协议·http
爱滑雪的码农2 小时前
Java基础十三:Java中的继承、重写(Override)与重载(Overload)详解
java·开发语言