基于Docker Desktop搭建Kafka集群并使用Java编程开发
一、引言
前段时间因课业要求使用Docker Desktop 部署Kafka集群并编写生产者消费者程序,折磨了我好几天,在查找大量资料后终于是把整个集群搭建完成了。现在我想要分享其中搭建的历程,希望能为大家解决问题。
二、Docker集群构建
安装环境:
- Windows 10
2.1 启用或关闭windows功能中勾选适用于linux的子系统,重启机器
启用或关闭windows功能
2.2 windows power shell 中检查wsl的更新:
- wsl --update
2.3 Docker官网下载Docker Desktop Installer
(下载链接:https://docs.docker.com/desktop/install/windows-install/)
2.4 Docker 安装
在power shell中下载存放Docker Desktop Installer.exe 路径下执行以下命令: (如果直接点击exe安装它会给你默认会安装到C盘)
- "Docker Desktop Installer.exe" install --installation-dir=<path>
注意: <path>替换为你需要安装Docker Desktop的路径
Docker Desktop启动界面
2.5 Docker相关配置
设置Docker 的镜像存储位置
Docker 的镜像存储位置
路径:Settings/Resources/Advanced
设置Dock 镜像源
Docker Desktop镜像仓库
- "registry-mirrors": [
- "https://registry.docker-cn.com",
- "http://hub-mirror.c.163.com",
- "https://docker.mirrors.ustc.edu.cn"
- ]
路径:Settings/Docker Engine
三、Kafka集群构建
3.1 创建docker 网络 (在不指定参数的情况下创建的是bridge网络)
- docker network create zk-net
查看创建的docker 网络
- docker network ls
3.2 编写kafka 与 zookeeper的yml文件
kafka.yml文件的编写
- version: "3"
- networks:
- zk-net:
- external:
- name: zk-net
- services:
- zoo1:
- image: 'zookeeper:3.8.2'
- container_name: zoo1
- hostname: zoo1
- environment:
- ZOO_MY_ID: 1
- ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
- ALLOW_ANONYMOUS_LOGIN: "yes"
- networks:
- - zk-net
- ports: #端口映射
- - 2181:2181
- - 8081:8080
- volumes: #挂载文件
- - /E/Kcluster/zookeeper/zoo1/data:/data
- - /E/Kcluster/zookeeper/zoo1/datalog:/datalog
- zoo2:
- image: 'zookeeper:3.8.2'
- container_name: zoo2
- hostname: zoo2
- environment:
- ZOO_MY_ID: 2
- ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
- ALLOW_ANONYMOUS_LOGIN: "yes"
- networks:
- - zk-net
- ports:
- - 2182:2181
- - 8082:8080
- volumes:
- - /E/Kcluster/zookeeper/zoo2/data:/data
- - /E/Kcluster/zookeeper/zoo2/datalog:/datalog
- zoo3:
- image: 'zookeeper:3.8.2'
- container_name: zoo3
- hostname: zoo3
- environment:
- ZOO_MY_ID: 3
- ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
- ALLOW_ANONYMOUS_LOGIN: "yes"
- networks:
- - zk-net
- ports:
- - 2183:2181
- - 8083:8080
- volumes:
- - /E/Kcluster/zookeeper/zoo3/data:/data
- - /E/Kcluster/zookeeper/zoo3/datalog:/datalog
- kafka01:
- image: 'bitnami/kafka:2.7.0'
- restart: always
- container_name: kafka01
- hostname: kafka01
- ports:
- - '9093:9093'
- environment:
- - ALLOW_NONE_AUTHENTICATION=yes
- - ALLOW_PLAINTEXT_LISTENER=yes
- - KAFKA_BROKER_ID=1
- - KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9093
- - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka01:9093
- - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2181,zoo3:2181
- volumes:
- - /E/Kcluster/kafka/kafka1:/bitnami/kafka
- networks:
- - zk-net
- kafka02:
- image: 'bitnami/kafka:2.7.0'
- restart: always
- container_name: kafka02
- hostname: kafka02
- ports:
- - '9094:9094'
- environment:
- - ALLOW_NONE_AUTHENTICATION=yes
- - ALLOW_PLAINTEXT_LISTENER=yes
- - KAFKA_BROKER_ID=2
- - KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9094
- - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka02:9094
- - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2181,zoo3:2181
- volumes:
- - /E/Kcluster/kafka/kafka2:/bitnami/kafka
- networks:
- - zk-net
- kafka03:
- image: 'bitnami/kafka:2.7.0'
- restart: always
- container_name: kafka03
- hostname: kafka03
- ports:
- - '9095:9095'
- environment:
- - ALLOW_NONE_AUTHENTICATION=yes
- - ALLOW_PLAINTEXT_LISTENER=yes
- - KAFKA_BROKER_ID=3
- - KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9095
- - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka03:9095 #kafka真正bind的地址
- - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2181,zoo3:2181 #暴露给外部的listeners,如果没有设置,会用listeners
- volumes:
- - /E/Kcluster/kafka/kafka3:/bitnami/kafka
- networks:
- - zk-net
需要注意的是,后续的Java API 的使用依赖于 KAFKA_CFG_ADVERTISED_LISTENERS
如果你使用的是 KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka03:9095 这种格式 需要在 C:\Windows\System32\drivers\etc 路径下修改host文件加入
- 127.0.0.1 kafka01
- 127.0.0.1 kafka02
- 127.0.0.1 kafka03
如果使用IP地址则不需要
3.3 拉取Kafka搭建需要的镜像,这里我选择zookeeper 和 kafka 镜像版本为:
- zookeeper:3.8.2
bitnami/kafka:2.7.0
键入命令拉取镜像:
- docker pull zookeeper:3.8.2
- docker pull bitnami/kafka:2.7.0
kafka镜像拉取
3.4 使用docker-compose 构建集群
在power shell中执行以下命令:
- docker-compose -f E:\Kcluster\docker-compose_kafka.yml up -d
docker-compose 构建集群
图中可以看到kafka集群已经被创建起来了:
kafka集群 展示
启动集群:
- docker-compose -f E:\Kcluster\docker-compose_kafka.yml start
停止集群:
- docker-compose -f E:\Kcluster\docker-compose_kafka.yml stop
删除集群:
- docker-compose -f E:\Kcluster\docker-compose_kafka.yml down
四、Kafka Java API
4.1 相关环境的配置
新建一个maven 项目 在xml中配置如下:
- <dependencies>
- <dependency>
- <groupId>org.apache.kafka</groupId>
- <artifactId>kafka-clients</artifactId>
- <version>2.0.0</version>
- </dependency>
- </dependencies>
拉取依赖
4.2 编写生产者代码
新建类:KafkaTest.class
- import org.apache.kafka.clients.producer.KafkaProducer;
- import org.apache.kafka.clients.producer.ProducerRecord;
- import java.util.Properties;
- public class KafkaTest {
- public static void main(String[] args) {
- Properties props = new Properties();
- //参数设置
- //1.指定Kafaka集群的ip地址和端口号
- props.put("bootstrap.servers", "kafka01:9093,kafka02:9094,kafka03:9095");
- //2.等待所有副本节点的应答
- props.put("acks", "all");
- //3.消息发送最大尝试次数
- props.put("retries", 1);
- //4.指定一批消息处理次数
- props.put("batch.size", 16384);
- //5.指定请求延时
- props.put("linger.ms", 1);
- //6.指定缓存区内存大小
- props.put("buffer.memory", 33554432);
- //7.设置key序列化
- props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
- //8.设置value序列化
- props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
- // 9、生产数据
- KafkaProducer<String, String> producer = new KafkaProducer<String, String>(props);
- for (int i = 0; i < 50; i++) {
- producer.send(new ProducerRecord<String, String>("mytopic", Integer.toString(i), "hello kafka-" + i));
- System.out.println(i);
- }
- producer.close();
- }
- }
注意,props.put("bootstrap.servers", "kafka01:9093,kafka02:9094,kafka03:9095");
如果是按上述yml配置,不需修改。如果你使用ip地址 替换kafka01,kafka02,kafka03 则使用IP地址:端口号
具体原因可见:
Kafka学习理解-listeners配置 - 孙行者、 - 博客园 (cnblogs.com)
docker 部署kafka,listeners配置 - 我的天啊~ - 博客园 (cnblogs.com)
4.3 编写消费者代码
新建类:ConsumerDemo.class
- 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.Objects;
- import java.util.Properties;
- public class ConsumerDemo{
- public static void main(String[] args) {
- Properties properties=new Properties();
- properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"kafka01:9093,kafka02:9094,kafka03:9095");
- properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
- properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
- //配置消费者组(必须)
- properties.put(ConsumerConfig.GROUP_ID_CONFIG,"group1");
- properties.put("enable.auto.commit", "true");
- // 自动提交offset,每1s提交一次
- properties.put("auto.commit.interval.ms", "1000");
- properties.put("auto.offset.reset","earliest ");
- properties.put("client.id", "zy_client_id");
- KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);
- // 订阅test1 topic
- consumer.subscribe(Collections.singletonList("mytopic"));
- while(true) {
- // 从服务器开始拉取数据
- ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
- if(Objects.isNull(records)){
- continue;
- }
- for(ConsumerRecord<String,String> record : records){
- System.out.printf("topic=%s,offset=%d,key=%s,value=%s%n", record.topic(), record.offset(), record.key(), record.value());
- }
- }
- }
- }
运行结果如下:
生产者:
消费者:
至此整个集群的构建与测试结束。
基于Docker Desktop搭建Kafka集群并使用Java编程开发的更多相关文章
- 用 Docker 快速搭建 Kafka 集群
开源Linux 一个执着于技术的公众号 版本 •JDK 14•Zookeeper•Kafka 安装 Zookeeper 和 Kafka Kafka 依赖 Zookeeper,所以我们需要在安装 Kaf ...
- 基于docker快速搭建hbase集群
一.概述 HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文"Bigtable:一个结构化数据的分布式存储系统".就像Bigt ...
- Docker实战之Kafka集群
1. 概述 Apache Kafka 是一个快速.可扩展的.高吞吐.可容错的分布式发布订阅消息系统.其具有高吞吐量.内置分区.支持数据副本和容错的特性,适合在大规模消息处理场景中使用. 笔者之前在物联 ...
- 什么是kafka以及如何搭建kafka集群?
一.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. Kafka场景比喻 接下来我大概比喻下Kafka的使用场景 消息中间件:生产者和消费者 妈妈:生产 ...
- 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群
庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介 前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...
- docker-compose 搭建kafka集群
docker-compose搭建kafka集群 下载镜像 1.wurstmeister/zookeeper 2.wurstmeister/kafka 3.sheepkiller/kafka-manag ...
- 如何基于Jupyter notebook搭建Spark集群开发环境
摘要:本文介绍如何基于Jupyter notebook搭建Spark集群开发环境. 本文分享自华为云社区<基于Jupyter Notebook 搭建Spark集群开发环境>,作者:apr鹏 ...
- 大数据平台搭建-kafka集群的搭建
本系列文章主要阐述大数据计算平台相关框架的搭建,包括如下内容: 基础环境安装 zookeeper集群的搭建 kafka集群的搭建 hadoop/hbase集群的搭建 spark集群的搭建 flink集 ...
- centos7搭建kafka集群-第二篇
好了,本篇开始部署kafka集群 Zookeeper集群搭建 注:Kafka集群是把状态保存在Zookeeper中的,首先要搭建Zookeeper集群(也可以用kafka自带的ZK,但不推荐) 1.软 ...
- Kafka学习之(六)搭建kafka集群
想要搭建kafka集群,必须具备zookeeper集群,关于zookeeper集群的搭建,在Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建博客有说明.需要具备两台以上装有zook ...
随机推荐
- 【pandas小技巧】--花哨的DataFrame
最近github上发现了一个库(plottable),可以用简单的方式就设置出花哨的 DataFrame 样式. github上的地址:https://github.com/znstrider/plo ...
- Laf & 中大猫谱:让每一只流浪猫都有家
猫谱简介 中大猫谱是一款辅助校园流浪猫救助的开源小程序项目,服务端使用 Laf 云开发. 猫谱主要功能包括:猫咪信息登记.照片分享.拍照识猫.公告和留言等.项目创立的初衷,是解决校园猫猫交流群里的一个 ...
- iOS发送探针日志到日志系统的简单实现
通过参考Testin的SDK实现方式,我们大致可以确定他们背后的实现方式: 首先,通过加载Testin的SDK,然后收集各种七七八八的数据,再通过socket发送数据到云端. 云端我们已经有了,就是h ...
- Solution -「营业」「ABC 209F」Deforestation
Description Link. 有 \(n\) 棵树,每棵的高度为 \(a(i)\),看到一棵树对答案的贡献为 \(a(i-1)+a(i)+a(i+1)\)(未定义范围为 \(0\)),求 ...
- nginx Ingress Controller Packaged by Bitnami
环境介绍 节点 master01 work01 work02 主机/ip calico-master01/192.168.195.135 calico-master01/192.168.195.135 ...
- PowerDotNet平台化软件架构设计与实现系列(16):财务平台
不同行业基本都会有自己独特的业务,甚至同行的不同企业之间的业务逻辑也会相差千里,只有最大程度抽象出通用性.标准性和普适性的系统才能够成为平台系统,平台系统开发的成本和难度可想而知. 个人深度参与或独立 ...
- linux日常运维(三) GRUB 2的维护
GRUB 2简介 GRUB GRUB是linux系统默认的引导加载程序.linux加载一个系统前,它必须有一个引导加载程序中特定指令(比如MBR记录)去引导系统.这个程序一般是位于系统的主硬盘驱动器或 ...
- 详解.NET依赖注入中对象的创建与“销毁”
在DI容器中注册类型,DI容器就可以帮我们创建类型的实例:如果注册类型实现了IAsyncDisposable或者IDisposable接口,对象销毁时DI容器还会帮我们调用DisposeAsync或D ...
- Full Tank 题解
Full Tank 题目大意 给定一张 \(n\) 个点,\(m\) 条边的连通无向图,在每个点有一个加油站,油价为该点的点权,每条边的油耗为该边的边权.现给出若干询问,问一辆油箱容量为 \(c\) ...
- Mac OS安装Python的pip
最近牛牛的同学在学习python,但当他使用numpy时出现了报错(。•́︿•̀。) 原因为他的python没有numpy这个库(这个故事很典).然鹅雪上加霜的是,他的电脑是Mac,没有Windows ...