docker-compose部署kafka集群(阿里云ECS也适用)

记录下怎么使用docker-compose部署kafka集群并 通过SpringBoot进行测试。

前言:根据网络里的大佬使用docker-compose构建kafka集群但还是遇到了许多问题,要么是服务器跑通了但是测试用例跑不通等奇奇怪怪的原因。遂当自己构建成功的时候觉得时候觉得是时候回报社会了。

遇到的问题:(文末附链接地址以及解决方法)
1.两个kafka之间服务通信不了
2.springboot访问不到kafka的host等

1.首先构建docker的内部网络用于kafka节点间的通讯

docker network create --subnet=172.18.0.0/24 br17218

查看构建的docker网络

docker network ls

当看到下图中显示的内容时则表示docker已经安装成功了
在这里插入图片描述

2.创建目录存放编排脚本并运行

2.1
创建一个目录,刷新后可以看到刚刚创建的目录结构

mkdir -p /usr/local/docker/kafka

2.2
在编辑框内编写服务编排脚本 docker-compose.yml

vi docker-compose.yml
:set paste # 用于把下面的yaml复制粘贴

docker-compose.yml文件

version: '3'

services:
  zoo1:
    image: wurstmeister/zookeeper
    restart: always
    hostname: zoo1
    container_name: zoo1
    ports:
      - 2181:2181
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=0.0.0.0:2888:3888 
    networks:
      br17218:
        ipv4_address: 172.18.0.11

  kafka1:
    image: wurstmeister/kafka
    restart: always
    hostname: kafka1
    container_name: kafka1
    ports:
      - 9092:9092
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka1
      KAFKA_ADVERTISED_PORT: 9092
      KAFKA_ZOOKEEPER_CONNECT: zoo1:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://xx.xx.xx.xx:9092  #自己的虚拟机ip地址  (注意这里一定要自己的虚拟机ip地址不然java程序访问不到)
      KAFKA_LISTENERS: PLAINTEXT://kafka1:9092
      KAFKA_HEAP_OPTS: "-Xmx256M -Xms128M" # 我的阿里云虚拟机内存小所以设置kafka的内存大小
    external_links:
      - zoo1
    networks:
      br17218:
        ipv4_address: 172.18.0.14

  kafka2:
    image: wurstmeister/kafka
    restart: always
    hostname: kafka2
    container_name: kafka2
    ports:
      - 9093:9093
    environment:
      KAFKA_ADVERTISED_HOST_NAME: kafka2
      KAFKA_ADVERTISED_PORT: 9093
      KAFKA_ZOOKEEPER_CONNECT: zoo1:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://xx.xx.xx.xx:9093  #自己的虚拟机ip地址
      KAFKA_LISTENERS: PLAINTEXT://kafka2:9093
      KAFKA_HEAP_OPTS: "-Xmx256M -Xms128M" 
    external_links:
      - zoo1
    networks:
      br17218:
        ipv4_address: 172.18.0.15
  kafka-manager:
    image: sheepkiller/kafka-manager              ## 镜像:开源的web管理kafka集群的界面
    environment:
        ZK_HOSTS: xx.xx.xx.xx                   ## 修改:宿主机IP
    ports:
      - "9000:9000"                               ## 暴露端口

networks:
  br17218:
    external:
      name: br17218

2.3
在 /usr/local/docker/kafka目录下
执行docker-compose的启动命令

docker-compose up -d

查看docker容器,当有下图的时候就是成功了

docker ps

在这里插入图片描述

3.在kafka里创建topic1、topic2用于测试

3.1
进入dockder里的kafka容器

docker exec -it kafka1  /bin/sh

创建topic1

kafka-topics.sh --create --zookeeper 47.112.252.218:2181 --replication-factor 2 --partitions 2 --topic topic1
Created topic topic1

创建topic2

kafka-topics.sh --create --zookeeper 47.112.252.218:2181 --replication-factor 2 --partitions 2 --topic topic2
Created topic topic2

看到下图就是创建成功了

kafka-topics.sh --list --zookeeper xx.xx.xx.xx:2181 #xx填写自己的虚拟机ip地址

在这里插入图片描述

3.2
阿里云ECS的小伙伴得去安全组开放相应的端口
在这里插入图片描述
虚拟机的小伙伴得关闭防火墙开放端口

4.构建Springboot项目测试

4.1
引入下面的依赖

 <dependency>
 <groupId>org.springframework.kafka</groupId>
 <artifactId>spring-kafka</artifactId>
 </dependency>

只需要增加这一个依赖

这里有大坑,版本不能随便用。kafka的client包必须和安装的kafka版本对应

下面是spring官方给的对应关系https://spring.io/projects/spring-kafka

在这里插入图片描述
我装的kafka是2.1.0版本,所以应该使用的kafka-client是1.0.x或1.1.x或2.0.0

但是spring-kafka已经依赖了kafka-client,我们需要确认依赖进的是哪个版本

项目的spring-boot-starter-parent版本:2.0.5.RELEASE

点spring-kafka进去看到

 <groupId>org.apache.kafka</groupId>
 <artifactId>kafka-clients</artifactId>
 <version>1.0.2</version>

kafka-client的版本是1.0.2,满足要求

项目结构
在这里插入图片描述

yml配置文件:

server:
  port: 8190
spring:
  application:
    name: service-kafka
  kafka:
    producer:
      bootstrap-servers: xx.xx.xx.xx:9092, xx.xx.xx.xx:9093 # xxx是自己的虚拟机的ip地址
    consumer:
      bootstrap-servers: xx.xx.xx.xx:9092, xx.xx.xx.xx:9093
      group-id: topic1
      enable-auto-commit: true
      auto-offset-reset: latest

生产者 KafkaProducer

/**
 * 生产者
 * 使用@EnableScheduling注解开启定时任务
 */
@Component
@EnableScheduling
public class KafkaProducer {
    @Autowired
    private KafkaTemplate kafkaTemplate;
    /**
     * 定时任务
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void send(){
        String message = UUID.randomUUID().toString();
        ListenableFuture future = kafkaTemplate.send("topic1", message);
        future.addCallback(o -> System.out.println("send-消息发送成功:" + message), throwable -> System.out.println("消息发送失败:" + message));
    }
}

消费者 KafkaConsumer

@Component
public class KafkaConsumer {
    @KafkaListener(topics = {"topic1"})
    public void receive(String message){
        System.out.println("消费消息:" + message);
    }
}

启动类

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan({"com.atguigu.guli"})
@EnableScheduling
public class ServiceKafkaApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceKafkaApplication.class, args);
    }

}

成功跑通的结果图:
在这里插入图片描述

附链接地址:
zookeeper搭建:https://zhuanlan.zhihu.com/p/110677319
kafka集群:https://zhuanlan.zhihu.com/p/110905106
使用docker部署kafka集群【Contos7】:https://blog.youkuaiyun.com/weixin_42831855/article/details/91980398
docker-compose部署zk集群、kafka集群以及kafka-manager,及其遇到的问题和解决:https://blog.youkuaiyun.com/weixin_34004750/article/details/94625801

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值