【Kafka系列】Kafka安装与部署

【Kafka系列】Kafka安装与部署

欢迎关注,​分享更多原创技术内容~

微信公众号:ByteRaccoon、知乎:一只大狸花啊、稀土掘金:浣熊say

微信公众号海量Java、数字孪生、工业互联网电子书免费送~

Docker搭建Kafka单机版

​ 要在Docker中安装和运行Apache Kafka,你可以使用官方提供的Docker镜像。以下是在Docker上安装Kafka的基本步骤:

步骤 1:Zookeeper

​要在Docker中安装ZooKeeper,你可以使用ZooKeeper官方提供的Docker镜像。以下是安装ZooKeeper的步骤:

  1. 使用Docker运行ZooKeeper容器:
css 复制代码
docker run --name zookeeper -p 2181:2181 -d zookeeper

这将在Docker中启动一个ZooKeeper容器,将ZooKeeper默认端口2181映射到主机的2181端口。你可以根据需要更改端口映射。

  1. 验证ZooKeeper容器是否正在运行:

    docker ps

你应该看到名为"zookeeper"的容器正在运行。

  1. 使用ZooKeeper客户端连接到ZooKeeper服务器:

你可以使用ZooKeeper客户端工具连接到ZooKeeper服务器,例如Apache ZooKeeper提供的zkCli.sh脚本。执行以下命令以连接到ZooKeeper容器:

bash 复制代码
docker exec -it zookeeper zkCli.sh

现在,你可以在ZooKeeper容器上执行ZooKeeper操作,管理ZooKeeper数据。

这样,你就成功在Docker中安装和运行了ZooKeeper。你可以根据需要配置ZooKeeper的更多参数,但以上步骤会为你提供一个基本的ZooKeeper实例。

步骤 2:下载Kafka Docker镜像

你可以在Docker Hub上找到官方的Apache Kafka Docker镜像。使用以下命令从Docker Hub下载Kafka镜像:

bash 复制代码
docker pull wurstmeister/cp-kafka

这将下载最新版本的Kafka Docker镜像。

步骤 3:创建Kafka容器

使用以下命令创建一个Kafka容器:

arduino 复制代码
docker run -d --name kafka -p 9193:9092 -v /home/docker/kafka/config:/etc/kafka \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://xxx.25.208.118:9193 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-e KAFKA_ADVERTISED_HOST_NAME=xxx.25.208.118 \
-e KAFKA_ZOOKEEPER_CONNECT=xxx.25.208.118:2181 \
wurstmeister/kafka

上述命令做了以下几件事:

  • -d: 这是Docker命令的选项,表示在后台运行容器。

  • --name kafka: 这个选项为容器指定一个名字,即容器的名称为 "kafka"。

  • -p 9193:9092: 这个选项用于将容器端口映射到主机端口。容器内部的Kafka端口9092被映射到主机上的端口9193,主要是为了防止端口扫描。

  • -v /home/docker/kafka/config:/etc/kafka: 这个选项用于将主机文件系统上的Kafka配置目录/home/docker/kafka/config挂载到容器内部的/etc/kafka目录。这样你可以将自定义的Kafka配置文件放在主机上,并通过挂载使其在容器内生效。

  • --network host: 这个选项将容器连接到主机的网络命名空间,这允许容器与主机共享网络设置,以便容器可以使用主机的网络接口。

  • -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://xxx.215.208.118:9193: 这个选项通过环境变量KAFKA_ADVERTISED_LISTENERS设置了Kafka的广告监听器。它告诉Kafka容器要公开的监听地址和端口。在这里,Kafka容器会在地址xxx.215.208.118的端口9193上公开。

  • -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092: 这个选项通过环境变量KAFKA_LISTENERS设置了Kafka的监听器。它允许Kafka容器接受来自任何主机的连接,0.0.0.0表示所有可用的网络接口。

  • -e KAFKA_ADVERTISED_HOST_NAME=xxx.215.208.118: 这个选项通过环境变量KAFKA_ADVERTISED_HOST_NAME设置了Kafka的广告主机名。这是广告给客户端的Kafka主机名。

  • -e KAFKA_ZOOKEEPER_CONNECT=xxx.215.208.118:2181: 这个选项通过环境变量KAFKA_ZOOKEEPER_CONNECT设置了Kafka的ZooKeeper连接地址,以便Kafka能够与ZooKeeper协调器进行通信。

步骤 4:验证Kafka容器是否运行

使用以下命令检查Kafka容器是否正在运行:

复制代码
docker ps

你应该看到名为"kafka"的容器在运行中。

步骤 5:使用Kafka

现在,你可以使用Kafka了。你可以在容器中创建主题、生产消息和消费消息。你也可以在本地主机上使用Kafka客户端来连接到Kafka容器。就是在Docker中安装和运行Apache Kafka的基本步骤。请根据你的实际需求进行进一步配置和使用。

Docker搭建Kafka集群

​要在Docker上搭建Kafka集群,您需要执行以下步骤:

  1. 安装Docker和Docker Compose:如果您尚未安装Docker和Docker Compose,请先安装它们。您可以在Docker官方网站上找到安装说明。

  2. 创建一个Kafka集群配置文件:创建一个名为docker-compose.yml的文件,其中包含Kafka集群的定义。以下是一个简单的示例:

yaml 复制代码
version: '3.5'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
  kafka1:
    image: wurstmeister/kafka
    container_name: kafka1
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 42.193.22.180         ## 广播主机名称,一般用IP指定
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_LOG_RETENTION_HOURS: 120
      KAFKA_MESSAGE_MAX_BYTES: 10000000
      KAFKA_REPLICA_FETCH_MAX_BYTES: 10000000
      KAFKA_GROUP_MAX_SESSION_TIMEOUT_MS: 60000
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DELETE_RETENTION_MS: 1000
      KAFKA_LISTENERS: PLAINTEXT://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://42.193.22.180:9092
      KAFKA_BROKER_ID: 1
  kafka2:
    image: wurstmeister/kafka
    container_name: kafka2
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "9093:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 42.193.22.180         ## 广播主机名称,一般用IP指定
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_PORT: 9093
      KAFKA_LOG_RETENTION_HOURS: 120
      KAFKA_MESSAGE_MAX_BYTES: 10000000
      KAFKA_REPLICA_FETCH_MAX_BYTES: 10000000
      KAFKA_GROUP_MAX_SESSION_TIMEOUT_MS: 60000
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DELETE_RETENTION_MS: 1000
      KAFKA_LISTENERS: PLAINTEXT://:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://42.193.22.180:9093
      KAFKA_BROKER_ID: 2
  kafka3:
    image: wurstmeister/kafka
    container_name: kafka3
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "9094:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 42.193.22.180         ## 广播主机名称,一般用IP指定
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_PORT: 9094
      KAFKA_LOG_RETENTION_HOURS: 120
      KAFKA_MESSAGE_MAX_BYTES: 10000000
      KAFKA_REPLICA_FETCH_MAX_BYTES: 10000000
      KAFKA_GROUP_MAX_SESSION_TIMEOUT_MS: 60000
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DELETE_RETENTION_MS: 1000
      KAFKA_LISTENERS: PLAINTEXT://:9094
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://42.193.22.180:9094
      KAFKA_BROKER_ID: 3

  kafka-manager:
    image: sheepkiller/kafka-manager
    container_name: kafka-manager
    environment:
        ZK_HOSTS: 42.193.22.180                         ## 修改:宿主机IP
    ports:
      - "9009:9000"
      

下面是一个单机版的docker-compose.yml的配置文件

yaml 复制代码
version: '3.5'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka
    container_name: kafka
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 42.193.22.180         ## 广播主机名称,一般用IP指定
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_LOG_RETENTION_HOURS: 120
      KAFKA_MESSAGE_MAX_BYTES: 10000000
      KAFKA_REPLICA_FETCH_MAX_BYTES: 10000000
      KAFKA_GROUP_MAX_SESSION_TIMEOUT_MS: 60000
      KAFKA_NUM_PARTITIONS: 3
      KAFKA_DELETE_RETENTION_MS: 1000
      KAFKA_LISTENERS: PLAINTEXT://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://42.193.22.180:9092
      KAFKA_BROKER_ID: 1
  kafka-manager:
    image: sheepkiller/kafka-manager
    container_name: kafka-manager
    environment:
        ZK_HOSTS: 42.193.22.180                         ## 修改:宿主机IP
    ports:
      - "9009:9000"
      

在上面的示例中,我们定义了一个包含一个Zookeeper节点和两个Kafka节点的Docker Compose文件。您可以根据需要添加更多Kafka节点。请注意,您可以调整Kafka节点的配置参数,以满足您的需求。

  1. 启动Kafka集群:在包含docker-compose.yml文件的目录中,执行以下命令启动Kafka集群:

    docker-compose up -d

这将启动Zookeeper和Kafka节点,并将它们放入后台运行。

  1. 验证Kafka集群:您可以使用Kafka命令行工具来验证Kafka集群是否正常工作。首先,通过以下方式连接到其中一个Kafka节点:
bash 复制代码
docker exec -it <kafka_container_id> /bin/bash

然后,使用Kafka命令行工具执行一些命令,例如创建一个主题,生产消息,消费消息等。

  1. 清理:当您完成测试后,可以通过以下命令停止和删除Docker容器:

    docker-compose down

这样就完成了在Docker上搭建Kafka集群的过程。根据您的需求,您可以根据需要调整配置和节点数量。请注意,上述示例使用的是Confluent的Kafka镜像,您可以根据自己的要求选择其他Kafka镜像。

Spring Boot集成Kafka

  • pom文件中导入依赖:
xml 复制代码
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
  • 配置application.yml
yaml 复制代码
# Kafka服务器的地址和端口,以逗号分隔的列表
spring.kafka.bootstrap-servers: 42.193.22.180:9092,42.193.22.180:9093,42.193.22.180:9094

# Kafka生产者配置
spring.kafka.producer:
  # 用于键和值的序列化器
  key-serializer: org.apache.kafka.common.serialization.StringSerializer
  value-serializer: org.apache.kafka.common.serialization.StringSerializer
  # 指定生产者要求经纪人确认的方式(1表示leader确认)
  acks: 1

# Kafka消费者配置
spring.kafka.consumer:
  # 用于键和值的反序列化器
  key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
  value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
  # 消费者组的标识
  group-id: my-group
  # 允许自动提交消费位移
  enable-auto-commit: true
  # 自动提交消费位移的时间间隔
  auto-commit-interval: 1000
  # 其他Kafka消费者属性
  properties:
    # 安全协议(PLAINTEXT表示明文)
    security.protocol: PLAINTEXT
    # 请求超时时间
    request.timeout.ms: 60000

# Kafka消息监听器配置
spring.kafka.listener:
  # 消息监听器类型(batch表示批处理模式)
  type: batch

# Kafka配置属性
spring.kafka.properties:
  # Kafka版本
  kafka:
    version: 3.4.1
  # 每次拉取的最大记录数
  max.poll.records: 100
  # 消息监听器的并发消费者数
  concurrency: 3
  • 简单生产者:
typescript 复制代码
package com.ts.kafkademo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
@Service
@EnableScheduling
public class KafkaService {

    private final KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    public KafkaService(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendMessage(String topic, String message) {
        kafkaTemplate.send(topic, message);
    }

    public void sendMessgae(String topic,String message,String key,Integer partion){
        kafkaTemplate.send(topic,partion,key,message);
    }


    @Scheduled(cron = "* * * * * ?")
    public void sendMsg(){
        sendMessage("my-topic","msg...");
    }
}
  • 简单消费者:
less 复制代码
@Service
public class KafkaConsumerService {

    // 使用@KafkaListener注解来监听Kafka消息
    @KafkaListener(topicPartitions = {
            // 定义TopicPartition,指定要监听的主题("my-topic")和分区("0")
            @TopicPartition(topic = "my-topic", partitions = { "0" }),
    }, groupId = "my-group")
    public void consumeMessage(String message) {
        // 当接收到消息时,打印消息内容
        System.out.println("Received message: " + message);
    }
}

总结

本节主要介绍了Kafka单机版本和集群版本的搭建方式,所有的搭建方式都需要依赖Zookeeper来作为分布式协调中心,帮助Kafka进行选主等操作。最终通过Spring Boot快速集成了Kafka并进行了简单的用例测试,帮我们了解了Kafka的部署和简单应用。

相关推荐
Chen-Edward3 分钟前
有了Spring为什么还有要Spring Boot?
java·spring boot·spring
magic3341656322 分钟前
Springboot整合MinIO文件服务(windows版本)
windows·spring boot·后端·minio·文件对象存储
开心-开心急了32 分钟前
Flask入门教程——李辉 第一、二章关键知识梳理(更新一次)
后端·python·flask
掘金码甲哥44 分钟前
调试grpc的哼哈二将,你值得拥有
后端
陈小桔1 小时前
idea中重新加载所有maven项目失败,但maven compile成功
java·maven
小学鸡!1 小时前
Spring Boot实现日志链路追踪
java·spring boot·后端
xiaogg36781 小时前
阿里云k8s1.33部署yaml和dockerfile配置文件
java·linux·kubernetes
逆光的July1 小时前
Hikari连接池
java
微风粼粼2 小时前
eclipse 导入javaweb项目,以及配置教程(傻瓜式教学)
java·ide·eclipse
番茄Salad2 小时前
Spring Boot临时解决循环依赖注入问题
java·spring boot·spring cloud