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 集群。