WSL下的Kafka开发容器:Docker搭建、API、整合

背景介绍

Kafka是一个分布式流处理平台,可以处理大规模数据流并支持实时数据流的处理。

本文介绍了如何在WSL下使用Docker搭建Kafka容器,并使用Python的kafka-python库和FastAPI框架实现了一个简单的API。同时,还将该服务整合到一个整体的docker-compose中。文章详细介绍了Docker网络、Kafka环境变量配置、Python连接Kafka的方法以及API的开发。

实验环境

WSL2 Ubuntu18.04 | Docker

⚙️容器配置与搭建

镜像选择

bitnami/kafka镜像

在这里插入图片描述

Bitnami是一个提供开发、部署和管理应用程序的软件公司。Bitnami提供了Kafka的Docker镜像,并有非常详细的文档。我们将使用这个镜像来搭建Kafka容器。

由于Kafka需要Zookeeper支持,我们可以通过docker-compose来快速组合多个容器。

按照官方的文档,我们可以通过如下的配置快速搭建一个Kafka+Zookeeper的中间件:

# docker-compose.yml

version: "3"

networks:
  app-tier:
    driver: bridge

services:
  zookeeper:
    restart: always
    image: 'bitnami/zookeeper:latest'
    networks:
      - app-tier
    ports:
      - '2181:2181'
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes

  kafka:
    restart: always
    image: 'bitnami/kafka:latest'
    networks:
      - app-tier
    ports:
      - '9092:9092'
      - '9093:9093'
    environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
      - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093
      - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://localhost:9093
      - KAFKA_CFG_INTER_BROKER_LISTENER_NAME=CLIENT
    depends_on:
      - zookeeper

在network部分,我们一个定义了一个 Docker 网络,名称为 “app-tier”,驱动程序为 “bridge”。

在 Docker 中,网络是一种虚拟网络,使容器之间可以进行通信。 “bridge” 驱动程序是 Docker 网络的默认驱动程序,它在单个 Docker 主机内创建一个内部网络,允许容器使用其 IP 地址相互通信。通过定义名称为 “app-tier”,驱动程序为 “bridge” 的网络,连接到该网络的任何容器都将能够使用其在网络内的 IP 地址相互通信。这可以用于创建微服务架构或其他分布式系统,其中多个容器需要彼此通信。

在Kafka的部分,我们设置了 Kafka 的环境变量:包括 Zookeeper 地址、允许明文监听器、监听器安全协议映射、监听器和广告监听器等。

注意,当前的配置将允许明文监听Kafka,这在实际生产环境中是不被允许的,我们在此为了便于开发环境的测试,允许直接监听。

剩余的环境配置可以在官网详细查询

在这里插入图片描述

容器使用

使用如下命令启动容器

docker-compose up

使用如下命令进入容器

sudo docker ps
sudo docker exec -it xx bash

注:其中xx是ps命令得到的Kafka容器的id前两位

进入容器后我们可以通过如下命令开启生产者和消费者

// 确保你在/opt/bitnami/kafka目录下

// 创建topic
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test

// 启动生产者
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

// 启动消费者
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

你可以打开两个终端,分别开启一个生产者和消费者。如果环境运行正常,就可以在消费者的端口同步查看到生产的输入。

基于此,我们快速地搭建了一个Kafka的开发环境,并且成功地启动了生产者和消费者。在实际的开发中,我们可以使用这个环境来进行Kafka相关的开发和测试工作。同时,在生产环境中,我们需要根据实际情况来进行更加严格和安全的配置,以确保Kafka的安全和可靠性。


🌐API构建与测试

除了命令行,我们还可以使用第三方框架实现对Kafka的连接和操作。下面用Python连接kafka并搭建一个简单的API供调试。

安装Python依赖

kafka-python
fastapi
uvicorn
pydantic

使用懒汉式的单例模式构建一个用于连接Kafka的上下文对象

# kafkaContext.py

import random
from kafka import KafkaProducer, KafkaClient
import time

def _get_kafka_producer_connection(host, port) -> KafkaProducer:
    while True:
        try:
            producer = KafkaProducer(bootstrap_servers=f'{
     host}:<
### 使用 Docker Compose 部署 Kafka 集群最佳实践 #### 1. 准备工作 确保本地已安装 DockerDocker Compose。对于 Windows 用户,建议使用 WSL2 (Windows Subsystem for Linux 2) 来提高性能并简化网络配置。 #### 2. 创建 `docker-compose.yml` 文件 创建一个新的目录作为项目根目录,在该目录下新建文件名为 `docker-compose.yml` 的 YAML 文件。此文件定义了服务、容器及其依赖关系。 ```yaml version: '3' services: zookeeper: image: wurstmeister/zookeeper:latest ports: - "2181:2181" kafka1: image: wurstmeister/kafka:latest depends_on: - zookeeper environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka1:9092,PLAINTEXT_HOST://localhost:29092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 networks: - kafka-net volumes: - /var/run/docker.sock:/var/run/docker.sock kafka2: image: wurstmeister/kafka:latest depends_on: - zookeeper environment: KAFKA_BROKER_ID: 2 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka2:9093,PLAINTEXT_HOST://localhost:39092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 networks: - kafka-net volumes: - /var/run/docker.sock:/var/run/docker.sock networks: kafka-net: ``` 上述配置中设置了两个 Kafka 节点 (`kafka1`, `kafka2`) 并指定了监听器的安全协议映射[^1]。通过设置不同的端口来区分各个节点的服务地址,并允许外部访问特定的代理监听器(`PLAINTEXT_HOST`)以便于从宿主机连接到集群内的不同 Broker 实例。 #### 3. 启动 Kafka 集群 进入包含 `docker-compose.yml` 文件所在的目录执行命令启动所有服务: ```bash docker-compose up -d ``` 这将会以后台模式启动 ZooKeeper 及两台 Kafka broker 容器实例。 #### 4. 测试连通性 为了验证部署成功与否以及确认可以从宿主机正常访问 Kafka Cluster,可以利用 kafkacat 或者其他客户端工具尝试发送消息给任意一台 broker: ```bash echo '{"foo":"bar"}' | docker run --rm --net=host edenhill/kafkacat:1.7.0 kafkacat -t testtopic ``` 以上命令会向主题 `testtopic` 发送一条 JSON 格式的测试消息至第一个 Kafka broker 上。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GUAPOchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值