一、引言

  前段时间因课业要求使用Docker Desktop 部署Kafka集群并编写生产者消费者程序,折磨了我好几天,在查找大量资料后终于是把整个集群搭建完成了。现在我想要分享其中搭建的历程,希望能为大家解决问题。

二、Docker集群构建

安装环境:

  1. Windows 10

2.1  启用或关闭windows功能中勾选适用于linux的子系统,重启机器

                                      启用或关闭windows功能

2.2 windows power shell 中检查wsl的更新:

  1. 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盘)

  1. "Docker Desktop Installer.exe" install --installation-dir=<path>

注意: <path>替换为你需要安装Docker Desktop的路径

                                    Docker Desktop启动界面

2.5 Docker相关配置

设置Docker 的镜像存储位置

                                      Docker 的镜像存储位置                

路径Settings/Resources/Advanced

设置Dock 镜像源

                                               Docker Desktop镜像仓库

  1. "registry-mirrors": [
  2. "https://registry.docker-cn.com",
  3. "http://hub-mirror.c.163.com",
  4. "https://docker.mirrors.ustc.edu.cn"
  5. ]

路径Settings/Docker Engine

三、Kafka集群构建

3.1 创建docker 网络 (在不指定参数的情况下创建的是bridge网络)

  1. docker network create zk-net

查看创建的docker 网络

  1. docker network ls

3.2 编写kafka 与 zookeeper的yml文件

kafka.yml文件的编写

  1. version: "3"
  2.  
  3. networks:
  4. zk-net:
  5. external:
  6. name: zk-net
  7.  
  8. services:
  9. zoo1:
  10. image: 'zookeeper:3.8.2'
  11. container_name: zoo1
  12. hostname: zoo1
  13. environment:
  14. ZOO_MY_ID: 1
  15. ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=zoo3:2888:3888;2181
  16. ALLOW_ANONYMOUS_LOGIN: "yes"
  17. networks:
  18. - zk-net
  19. ports: #端口映射
  20. - 2181:2181
  21. - 8081:8080
  22. volumes: #挂载文件
  23. - /E/Kcluster/zookeeper/zoo1/data:/data
  24. - /E/Kcluster/zookeeper/zoo1/datalog:/datalog
  25. zoo2:
  26. image: 'zookeeper:3.8.2'
  27. container_name: zoo2
  28. hostname: zoo2
  29. environment:
  30. ZOO_MY_ID: 2
  31. ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=0.0.0.0:2888:3888;2181 server.3=zoo3:2888:3888;2181
  32. ALLOW_ANONYMOUS_LOGIN: "yes"
  33. networks:
  34. - zk-net
  35. ports:
  36. - 2182:2181
  37. - 8082:8080
  38. volumes:
  39. - /E/Kcluster/zookeeper/zoo2/data:/data
  40. - /E/Kcluster/zookeeper/zoo2/datalog:/datalog
  41. zoo3:
  42. image: 'zookeeper:3.8.2'
  43. container_name: zoo3
  44. hostname: zoo3
  45. environment:
  46. ZOO_MY_ID: 3
  47. ZOO_SERVERS: server.1=zoo1:2888:3888;2181 server.2=zoo2:2888:3888;2181 server.3=0.0.0.0:2888:3888;2181
  48. ALLOW_ANONYMOUS_LOGIN: "yes"
  49. networks:
  50. - zk-net
  51. ports:
  52. - 2183:2181
  53. - 8083:8080
  54. volumes:
  55. - /E/Kcluster/zookeeper/zoo3/data:/data
  56. - /E/Kcluster/zookeeper/zoo3/datalog:/datalog
  57. kafka01:
  58. image: 'bitnami/kafka:2.7.0'
  59. restart: always
  60. container_name: kafka01
  61. hostname: kafka01
  62. ports:
  63. - '9093:9093'
  64. environment:
  65. - ALLOW_NONE_AUTHENTICATION=yes
  66. - ALLOW_PLAINTEXT_LISTENER=yes
  67. - KAFKA_BROKER_ID=1
  68. - KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9093
  69. - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka01:9093
  70. - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2181,zoo3:2181
  71. volumes:
  72. - /E/Kcluster/kafka/kafka1:/bitnami/kafka
  73. networks:
  74. - zk-net
  75. kafka02:
  76. image: 'bitnami/kafka:2.7.0'
  77. restart: always
  78. container_name: kafka02
  79. hostname: kafka02
  80. ports:
  81. - '9094:9094'
  82. environment:
  83. - ALLOW_NONE_AUTHENTICATION=yes
  84. - ALLOW_PLAINTEXT_LISTENER=yes
  85. - KAFKA_BROKER_ID=2
  86. - KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9094
  87. - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka02:9094
  88. - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2181,zoo3:2181
  89. volumes:
  90. - /E/Kcluster/kafka/kafka2:/bitnami/kafka
  91. networks:
  92. - zk-net
  93. kafka03:
  94. image: 'bitnami/kafka:2.7.0'
  95. restart: always
  96. container_name: kafka03
  97. hostname: kafka03
  98. ports:
  99. - '9095:9095'
  100. environment:
  101. - ALLOW_NONE_AUTHENTICATION=yes
  102. - ALLOW_PLAINTEXT_LISTENER=yes
  103. - KAFKA_BROKER_ID=3
  104. - KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9095
  105. - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka03:9095 #kafka真正bind的地址
  106. - KAFKA_CFG_ZOOKEEPER_CONNECT=zoo1:2181,zoo2:2181,zoo3:2181 #暴露给外部的listeners,如果没有设置,会用listeners
  107. volumes:
  108. - /E/Kcluster/kafka/kafka3:/bitnami/kafka
  109. networks:
  110. - zk-net

需要注意的是,后续的Java API 的使用依赖于  KAFKA_CFG_ADVERTISED_LISTENERS

如果你使用的是  KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka03:9095  这种格式 需要在 C:\Windows\System32\drivers\etc 路径下修改host文件加入

  1. 127.0.0.1 kafka01
  2. 127.0.0.1 kafka02
  3. 127.0.0.1 kafka03

如果使用IP地址则不需要

3.3 拉取Kafka搭建需要的镜像,这里我选择zookeeper 和 kafka 镜像版本为:

  1. zookeeper:3.8.2
    bitnami/kafka:2.7.0

键入命令拉取镜像:

  1. docker pull zookeeper:3.8.2
  2. docker pull bitnami/kafka:2.7.0

                                    kafka镜像拉取

3.4 使用docker-compose 构建集群

在power shell中执行以下命令:

  1. docker-compose -f E:\Kcluster\docker-compose_kafka.yml up -d

                                      docker-compose 构建集群

图中可以看到kafka集群已经被创建起来了:

                                        kafka集群 展示

启动集群:

  1. docker-compose -f E:\Kcluster\docker-compose_kafka.yml start

停止集群:

  1. docker-compose -f E:\Kcluster\docker-compose_kafka.yml stop

删除集群:

  1. docker-compose -f E:\Kcluster\docker-compose_kafka.yml down

四、Kafka Java API

4.1 相关环境的配置

新建一个maven 项目 在xml中配置如下:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.kafka</groupId>
  4. <artifactId>kafka-clients</artifactId>
  5. <version>2.0.0</version>
  6. </dependency>
  7. </dependencies>

拉取依赖

4.2 编写生产者代码

新建类:KafkaTest.class

  1. import org.apache.kafka.clients.producer.KafkaProducer;
  2. import org.apache.kafka.clients.producer.ProducerRecord;
  3.  
  4. import java.util.Properties;
  5.  
  6. public class KafkaTest {
  7. public static void main(String[] args) {
  8. Properties props = new Properties();
  9. //参数设置
  10. //1.指定Kafaka集群的ip地址和端口号
  11. props.put("bootstrap.servers", "kafka01:9093,kafka02:9094,kafka03:9095");
  12. //2.等待所有副本节点的应答
  13. props.put("acks", "all");
  14. //3.消息发送最大尝试次数
  15. props.put("retries", 1);
  16. //4.指定一批消息处理次数
  17. props.put("batch.size", 16384);
  18. //5.指定请求延时
  19. props.put("linger.ms", 1);
  20. //6.指定缓存区内存大小
  21. props.put("buffer.memory", 33554432);
  22. //7.设置key序列化
  23. props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  24. //8.设置value序列化
  25. props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
  26. // 9、生产数据
  27. KafkaProducer<String, String> producer = new KafkaProducer<String, String>(props);
  28. for (int i = 0; i < 50; i++) {
  29. producer.send(new ProducerRecord<String, String>("mytopic", Integer.toString(i), "hello kafka-" + i));
  30. System.out.println(i);
  31. }
  32. producer.close();
  33. }
  34.  
  35. }

注意,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

  1. import org.apache.kafka.clients.consumer.ConsumerConfig;
  2. import org.apache.kafka.clients.consumer.ConsumerRecord;
  3. import org.apache.kafka.clients.consumer.ConsumerRecords;
  4. import org.apache.kafka.clients.consumer.KafkaConsumer;
  5.  
  6. import java.time.Duration;
  7. import java.util.Collections;
  8. import java.util.Objects;
  9. import java.util.Properties;
  10.  
  11. public class ConsumerDemo{
  12.  
  13. public static void main(String[] args) {
  14. Properties properties=new Properties();
  15.  
  16. properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"kafka01:9093,kafka02:9094,kafka03:9095");
  17.  
  18. properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
  19. properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
  20.  
  21. //配置消费者组(必须)
  22. properties.put(ConsumerConfig.GROUP_ID_CONFIG,"group1");
  23.  
  24. properties.put("enable.auto.commit", "true");
  25. // 自动提交offset,每1s提交一次
  26. properties.put("auto.commit.interval.ms", "1000");
  27. properties.put("auto.offset.reset","earliest ");
  28. properties.put("client.id", "zy_client_id");
  29. KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);
  30. // 订阅test1 topic
  31. consumer.subscribe(Collections.singletonList("mytopic"));
  32.  
  33. while(true) {
  34. // 从服务器开始拉取数据
  35. ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
  36. if(Objects.isNull(records)){
  37. continue;
  38. }
  39. for(ConsumerRecord<String,String> record : records){
  40. System.out.printf("topic=%s,offset=%d,key=%s,value=%s%n", record.topic(), record.offset(), record.key(), record.value());
  41. }
  42.  
  43. }
  44. }
  45.  
  46. }

运行结果如下:

生产者:

消费者:

至此整个集群的构建与测试结束。

基于Docker Desktop搭建Kafka集群并使用Java编程开发的更多相关文章

  1. 用 Docker 快速搭建 Kafka 集群

    开源Linux 一个执着于技术的公众号 版本 •JDK 14•Zookeeper•Kafka 安装 Zookeeper 和 Kafka Kafka 依赖 Zookeeper,所以我们需要在安装 Kaf ...

  2. 基于docker快速搭建hbase集群

    一.概述 HBase是一个分布式的.面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文"Bigtable:一个结构化数据的分布式存储系统".就像Bigt ...

  3. Docker实战之Kafka集群

    1. 概述 Apache Kafka 是一个快速.可扩展的.高吞吐.可容错的分布式发布订阅消息系统.其具有高吞吐量.内置分区.支持数据副本和容错的特性,适合在大规模消息处理场景中使用. 笔者之前在物联 ...

  4. 什么是kafka以及如何搭建kafka集群?

    一.Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. Kafka场景比喻 接下来我大概比喻下Kafka的使用场景 消息中间件:生产者和消费者 妈妈:生产 ...

  5. 庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群

    庐山真面目之十微服务架构 Net Core 基于 Docker 容器部署 Nginx 集群 一.简介      前面的两篇文章,我们已经介绍了Net Core项目基于Docker容器部署在Linux服 ...

  6. docker-compose 搭建kafka集群

    docker-compose搭建kafka集群 下载镜像 1.wurstmeister/zookeeper 2.wurstmeister/kafka 3.sheepkiller/kafka-manag ...

  7. 如何基于Jupyter notebook搭建Spark集群开发环境

    摘要:本文介绍如何基于Jupyter notebook搭建Spark集群开发环境. 本文分享自华为云社区<基于Jupyter Notebook 搭建Spark集群开发环境>,作者:apr鹏 ...

  8. 大数据平台搭建-kafka集群的搭建

    本系列文章主要阐述大数据计算平台相关框架的搭建,包括如下内容: 基础环境安装 zookeeper集群的搭建 kafka集群的搭建 hadoop/hbase集群的搭建 spark集群的搭建 flink集 ...

  9. centos7搭建kafka集群-第二篇

    好了,本篇开始部署kafka集群 Zookeeper集群搭建 注:Kafka集群是把状态保存在Zookeeper中的,首先要搭建Zookeeper集群(也可以用kafka自带的ZK,但不推荐) 1.软 ...

  10. Kafka学习之(六)搭建kafka集群

    想要搭建kafka集群,必须具备zookeeper集群,关于zookeeper集群的搭建,在Kafka学习之(五)搭建kafka集群之Zookeeper集群搭建博客有说明.需要具备两台以上装有zook ...

随机推荐

  1. 【pandas小技巧】--花哨的DataFrame

    最近github上发现了一个库(plottable),可以用简单的方式就设置出花哨的 DataFrame 样式. github上的地址:https://github.com/znstrider/plo ...

  2. Laf & 中大猫谱:让每一只流浪猫都有家

    猫谱简介 中大猫谱是一款辅助校园流浪猫救助的开源小程序项目,服务端使用 Laf 云开发. 猫谱主要功能包括:猫咪信息登记.照片分享.拍照识猫.公告和留言等.项目创立的初衷,是解决校园猫猫交流群里的一个 ...

  3. iOS发送探针日志到日志系统的简单实现

    通过参考Testin的SDK实现方式,我们大致可以确定他们背后的实现方式: 首先,通过加载Testin的SDK,然后收集各种七七八八的数据,再通过socket发送数据到云端. 云端我们已经有了,就是h ...

  4. Solution -「营业」「ABC 209F」Deforestation

    Description   Link.   有 \(n\) 棵树,每棵的高度为 \(a(i)\),看到一棵树对答案的贡献为 \(a(i-1)+a(i)+a(i+1)\)(未定义范围为 \(0\)),求 ...

  5. nginx Ingress Controller Packaged by Bitnami

    环境介绍 节点 master01 work01 work02 主机/ip calico-master01/192.168.195.135 calico-master01/192.168.195.135 ...

  6. PowerDotNet平台化软件架构设计与实现系列(16):财务平台

    不同行业基本都会有自己独特的业务,甚至同行的不同企业之间的业务逻辑也会相差千里,只有最大程度抽象出通用性.标准性和普适性的系统才能够成为平台系统,平台系统开发的成本和难度可想而知. 个人深度参与或独立 ...

  7. linux日常运维(三) GRUB 2的维护

    GRUB 2简介 GRUB GRUB是linux系统默认的引导加载程序.linux加载一个系统前,它必须有一个引导加载程序中特定指令(比如MBR记录)去引导系统.这个程序一般是位于系统的主硬盘驱动器或 ...

  8. 详解.NET依赖注入中对象的创建与“销毁”

    在DI容器中注册类型,DI容器就可以帮我们创建类型的实例:如果注册类型实现了IAsyncDisposable或者IDisposable接口,对象销毁时DI容器还会帮我们调用DisposeAsync或D ...

  9. Full Tank 题解

    Full Tank 题目大意 给定一张 \(n\) 个点,\(m\) 条边的连通无向图,在每个点有一个加油站,油价为该点的点权,每条边的油耗为该边的边权.现给出若干询问,问一辆油箱容量为 \(c\) ...

  10. Mac OS安装Python的pip

    最近牛牛的同学在学习python,但当他使用numpy时出现了报错(。•́︿•̀。) 原因为他的python没有numpy这个库(这个故事很典).然鹅雪上加霜的是,他的电脑是Mac,没有Windows ...