Docker部署Kakfa——初体验

4 篇文章 0 订阅
1 篇文章 0 订阅
Docker部署Kakfa——初体验

周末啦,闲着没事干,就想找点事情做做,总不能一天都躺尸对吧,于是就想学学kafka,因为工作上可能需要用到,所以也就趁此机会去学习学习!

首先呢,先瞅一眼kafka的官网https://kafka.apache.org/,全是英文,很难受,没办法,只能去找点看得懂的来学了,虽然这个习惯很不好,但是效率高鸭!

B站上面搜了一圈Kafka的教学视频,挑了个觉着比较靠谱的看了下,然后心血来潮,想着腾讯云服务器还没过期,就想在上面部署一个kafka,看到教学中是通过官网下载tar包通过脚本进行部署的,可我对这些脚本不熟悉鸭,想着平时主要用Docker比较多,于是就想用Docker部署。

接下来咧,第一步,打开dockerhub,dockerhub是一个镜像仓库,里面存着许多镜像,有的是官方提供的,有的是第三方提供的,当然了,我们自己也可以打成镜像放到仓库中去。

搜索kafka,选择对应版本
搜索Kafka
点进去后,官方推荐我们通过docker-compose进行部署,并且提供了docker-compose文件

$ curl -sSL https://raw.githubusercontent.com/bitnami/containers/main/bitnami/kafka/docker-compose.yml > docker-compose.yml
$ docker-compose up -d

由于腾讯云服务器上是Ubuntu系统,所以没有curl这个命令,所以干脆就自己动手丰衣足食,自己写docker-compose文件
想要写docker-compose文件,首先得会通过命令将这些容器启动起来,再去编写docker-compose
kafka在2.8版本后去除了zookeeper,当然了,我没有其它想法,首先先让它跑起来,根据官方提供的命令去创建zookeeper和kafka

docker run -d --name zookeeper-server \
    -e ALLOW_ANONYMOUS_LOGIN=yes \
    bitnami/zookeeper:latest

创建zookeeper容器

docker run -d --name kafka-server \
    -e ALLOW_PLAINTEXT_LISTENER=yes \
    -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181 \
    bitnami/kafka:latest

创建kafka容器
有朋友可能会问,好像我的命令和官方有些不同,是的,没错,官方是创建了一个网络,然后将这两个容器共用同一个网络,而我没有指定,所以它会默认docker0这个网络。
zookeeper容器启动还算成功,但是到了kafka容器启动的时候,它秒停,这种情况下肯定是要去看它运行日志。

docker logs --tail=500 kafka-server

提示报的是内存不够,我服务器是2G的内存,跑了一些容器,还剩下不到1G可用内容,上一次遇到这种情况还是在启动ElasticSearch的时候。之前部署ES的时候也是内存不够,那时是不起ELK,并分配指定堆大小,最终才得以让ES跑起来,那现在这种情况应该也是可以设置堆大小的。
该如何去设置呢?
在官方镜像说明中给了一堆环境变量可以让我们去设置

  • ALLOW_PLAINTEXT_LISTENER: Allow to use the PLAINTEXT listener. Default: no.
  • KAFKA_INTER_BROKER_USER: Apache Kafka inter broker communication user. Default: admin. Default: user.
  • KAFKA_INTER_BROKER_PASSWORD: Apache Kafka inter broker communication password. Default: bitnami.
  • KAFKA_CERTIFICATE_PASSWORD: Password for certificates. No defaults.
  • KAFKA_HEAP_OPTS: Apache Kafka’s Java Heap size. Default: -Xmx1024m -Xms1024m.
  • KAFKA_ZOOKEEPER_PROTOCOL: Authentication protocol for Zookeeper connections. Allowed protocols: PLAINTEXT, SASL, SSL, and SASL_SSL. = Defaults: PLAINTEXT.
  • KAFKA_ZOOKEEPER_USER: Apache Kafka Zookeeper user for SASL authentication. No defaults.
  • KAFKA_ZOOKEEPER_PASSWORD: Apache Kafka Zookeeper user password for SASL authentication. No defaults.
  • KAFKA_ZOOKEEPER_TLS_KEYSTORE_PASSWORD: Apache Kafka Zookeeper keystore file password and key password. No defaults.
  • KAFKA_ZOOKEEPER_TLS_TRUSTSTORE_PASSWORD: Apache Kafka Zookeeper truststore file password. No defaults.
  • KAFKA_ZOOKEEPER_TLS_VERIFY_HOSTNAME: Verify Zookeeper hostname on TLS certificates. Defaults: true.
  • KAFKA_ZOOKEEPER_TLS_TYPE: Choose the TLS certificate format to use. Allowed values: JKS, PEM. Defaults: JKS.
  • KAFKA_CFG_SASL_ENABLED_MECHANISMS: Allowed mechanism when using SASL either for clients, inter broker, or zookeeper comunications. Allowed values: PLAIN, SCRAM-SHA-256, SCRAM-SHA-512 or a comma separated combination of those values. Default: PLAIN,SCRAM-SHA-256,SCRAM-SHA-512
  • KAFKA_CFG_SASL_MECHANISM_INTER_BROKER_PROTOCOL: SASL mechanism to use for inter broker communications. No defaults.
  • KAFKA_TLS_CLIENT_AUTH: Configures kafka brokers to request client authentication. Allowed values: required, requested, none. Defaults: required.
  • KAFKA_TLS_TYPE: Choose the TLS certificate format to use. Allowed values: JKS, PEM. Defaults: JKS.
  • KAFKA_CLIENT_USERS: Users that will be created into Zookeeper when using SASL for client communications. Separated by commas. Default: user
  • KAFKA_CLIENT_PASSWORDS: Passwords for the users specified atKAFKA_CLIENT_USERS. Separated by commas. Default: bitnami
  • KAFKA_CFG_MAX_PARTITION_FETCH_BYTES: The maximum amount of data per-partition the server will return. Default: 1048576
  • KAFKA_CFG_MAX_REQUEST_SIZE: The maximum size of a request in bytes. Default: 1048576
  • KAFKA_ENABLE_KRAFT: Whether to enable Kafka Raft (KRaft) mode. Default: no
  • KAFKA_KRAFT_CLUSTER_ID: Kafka cluster ID when using Kafka Raft (KRaft). No defaults.
    一下子看到这么多配置项,人有点麻了,但是稍微看一下还是看得懂的,比如KAFKA_HEAP_OPTS这项,HEAP是堆的意思,那应该就可以分配堆大小,然后再加上官方给的默认的配置,那docker-compose文件就会写了。
version: "2"

services:
  zookeeper:
    image: docker.io/bitnami/zookeeper:3.8
    container_name: zookeeper
    ports:
      - "2181:2181"
    volumes:
      - "zookeeper_data:/bitnami"
    environment:
      ALLOW_ANONYMOUS_LOGIN: "yes"
  kafka:
    image: docker.io/bitnami/kafka:3.2
    container_name: kafka
    ports:
      - "9092:9092"
    volumes:
      - "kafka_data:/bitnami"
    environment:
      KAFKA_CFG_ZOOKEEPER_CONNECT: zookeeper:2181
      ALLOW_PLAINTEXT_LISTENER: "yes"
      KAFKA_CFG_ADVERTISED_LISTENERS: "PLAINTEXT://服务器IP:9092"
      KAFKA_HEAP_OPTS: "-Xmx512M -Xms256M"
    depends_on:
      - zookeeper

volumes:
  zookeeper_data:
    driver: local
  kafka_data:
    driver: local

写好docker-compose文件,再执行docker-compose up -d命令,等待容器创建,然后再通过docker ps命令查看容器是否都跑起来了。
检查没问题,那接下来就可以去操作kafka啦!
PS:如果创建失败的朋友,你可以还需要创建一个交换内存
先是通过free -m命令查看你的swap分区是否有分配内存
如果没有那就创建后再去运行容器。

创建Swap分区

创建大小为500MB的swapfile文件

dd if=/dev/zero of=swapfile bs=1024 count=500000

将swapfile设置为swap空间(把这个文件变成swap文件)

mkswap swapfile

启用交换空间(启用这个swap文件)

swapon swapfile 

再去执行docker-compose up -d命令

Java连接Kafka

Java连接Kafka最简单的方式就是导入依赖,然后使用默认的KafkTemplate进行操作。

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

配置Kafka服务器地址

spring:
  kafka:
    producer:
      bootstrap-servers: Kafka服务器IP:9092
    consumer:
      group-id: consumer-group  #命令kafka的组id,可以随便起
      bootstrap-servers: Kafka服务器IP:9092
server:
  port: 8088

创建生产者

@RestController
@RequestMapping("/hello")
public class HelloController {

    @Autowired
    private KafkaTemplate<String,String> kafkaTemplate;

    @GetMapping("send")
    public String sendMsg(){
        kafkaTemplate.send("first","msg");
        return "ok";
    }
}

创建消费者

@Component
public class KafkaConsumer {

    @KafkaListener(topics = {"first"})
    public void listener(ConsumerRecord<?, ?> record){
        Optional<?> kafkaMessage = Optional.ofNullable(record.value());
        if (kafkaMessage.isPresent()) {
            Object message = kafkaMessage.get();
            System.out.println("数据接收完毕:"+message);
        }
    }
}

项目启动,访问send接口,再看控制台是否打印出你发送的消息,至此,Kafka部署已经完成,这次部署Zookeeper没有做集群部署。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不爱敲代码_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值