1. 概述
Apache Kafka 是一个广为人知的分布式流式平台,用于实时流式记录。它允许开发人员通过 Kafka 主题使用Kafka主题发布和订阅记录流。我们可以使用docker-compose来管理使用多容器Docker应用程序的 Kafka 流或 Kafka 订阅者。
在这篇教程中,我们将学习如何使用 Docker Compose 创建 Kafka 主题。此外,我们还将使用单个 Kafka 节点从该主题发布和消费消息。
2. 使用 Docker Compose 设置 Kafka
Docker Compose 工具非常适合管理多个服务设置。Kafka 集群需要 Zookeeper 和 Kafka 节点,这对于这种场景非常有用。为了设置 Kafka 集群,我们需要运行两个服务:Zookeeper 和 Kafka 节点。
让我们查看 docker-compose.yml 来设置并运行 Kafka 服务器:
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
networks:
- kafka-net
kafka:
image: wurstmeister/kafka
container_name: kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9092,OUTSIDE://localhost:9093
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_LISTENERS: INSIDE://0.0.0.0:9092,OUTSIDE://0.0.0.0:9093
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_CREATE_TOPICS: "baeldung:1:1"
networks:
- kafka-net
networks:
kafka-net:
driver: bridge
在上述 docker-comose.yml 中,我们运行了两个不同的服务。Zookeeper 服务使用 “wurstmeister/zookeeper” 作为基础镜像。此外,我们将容器的 2181 端口暴露给主机机器,这允许外部访问 Zookeeper。另外,我们用 “wurstmeister/Kafka” 运行 Kafka 服务作为基础镜像。为了让外部访问 Kafka 服务器,我们暴露了 9092 端口。
我们向 Kafka 服务提供了关键的 ENV 变量。这些 ENV 变量配置了内部和外部 Docker 网络的监听设置。它使用 PLAINTEXT 协议,定义了两个监听器的绑定地址(0.0.0.0),指定了 “INSIDE” 作为内部节点监听器名称,提供了到 Zookeeper 的连接字符串(使用容器名 “zookeeper” 和端口 2181),并设置了名为 “baeldung” 的主题,复制因子为 1,分区计数为 1。
3. 启动 Kafka 集群
到目前为止,我们已经看到了使用 docker-compose.yml 创建服务以运行 Zookeeper 和 Kafka。为了演示,让我们看看启动 Kafka 集群的命令:
$ docker-compose up -d
[+] Running 2/2
✔ Container zookeeper Running 0.0s
✔ Container kafka Started
上述命令将仅启动 Zookeeper 和 Kafka 容器并在后台模式下。这意味着我们在终端保持空闲的同时可以与 Kafka 和 Zookeeper 进行交互。使用 -d 模式确保容器在后台运行,这有助于我们妥善管理 Kafka 环境。
3.1. 验证 Kafka 集群
为了验证 Kafka 集群是否成功运行,让我们运行以下命令查看正在运行的容器:
$ docker-compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
kafka wurstmeister/kafka "start-kafka.sh" kafka 27 seconds ago Up 27 seconds 0.0.0.0:9092->9092/tcp
zookeeper wurstmeister/zookeeper "/bin/sh -c '/usr/sb…" zookeeper 3 minutes ago Up 3 minutes 22/tcp, 2888/tcp, 3888/tcp, 0.0.0.0:2181->2181/tcp
在上述输出中,我们可以看到 Zookeeper 和 Kafka 容器都已上线并运行。这个验证步骤确认 Kafka 集群准备好处理主题和消息,因此来自各种来源的数据可以被摄取。
3.2. 创建 Kafka 主题
到目前为止,Kafka 集群已上线并运行。现在,让我们创建一个 Kafka 主题:
$ docker-compose exec kafka kafka-topics.sh --create --topic baeldung_linux
--partitions 1 --replication-factor 1 --bootstrap-server kafka:9092
在上述命令中,我们创建了一个名为 baeldung_linux 的新主题,具有 1 个分区和 1 个副本集,并通过 Kafka 节点在端口 9092 上使用 Kafka 节点。现在,我们可以将 Kafka 数据流化。这将允许我们为各种应用程序交换消息和事件。
3.3. 发布和消费消息
有了 Kafka 主题在位,让我们发布和消费一些消息。首先,通过运行以下命令启动消费者:
$ docker-compose exec kafka kafka-console-consumer.sh --topic baeldung_linux
--from-beginning --bootstrap-server kafka:9092
使用上述命令,我们将能够消费所有发送到此主题的消息。此外,我们使用 –from-beginning 来从主题的开头消费所有消息。让我们也看看如何将数据发布到此 Kafka 主题:
$ docker-compose exec kafka kafka-console-producer.sh --topic baeldung_linux
--broker-list kafka:9092
通过使用上述命令,我们可以生成并发送消息到 baeldung_linux 主题。使用 Docker 发布到 Kafka 主题上的消息既简单又高效。
4. 总结
在这篇文章中,我们探索了如何使用 Docker Compose 创建 Kafka 主题。首先,我们使用两个不同服务设置了一个完整的 Kafka 集群。我们使用 Docker Compose 运行 Kafka Zookeeper 和 Kafka 节点。然后,我们创建了一个 Kafka 主题来发布和订阅消息使用 Kafka 集群。
简而言之,我们使用 docker-compose 服务创建了一个简单的 Kafka 集群。整个设置帮助我们在基于 Kafka 的应用程序中通过 docker-compose 服务实时分布和通信数据。此外,它帮助我们节省资源,因为我们不必一直运行 Kafka 集群。