Контейнеры Kafka и zookeeper docker взаимодействуют с моим API на хост-машине

#java #docker #apache-kafka

#java #докер #apache-kafka

Вопрос:

шаг 1:

Я выполнил некоторые шаги в этом руководстве и создал контейнер zookeeper и подключил его к контейнеру Kafka, чтобы они могли взаимодействовать друг с другом через локальные порты. Я также создал раздел «foo» с 1 разделом и отправил 42 сообщения с помощью команды docker. Насколько я понимаю, в моей локальной ОС (localhost: 29092) есть порт Kafka, который доступен для создания и прослушивания сообщений.

команды docker для запуска контейнера zookeeper:

 docker run -d --net=host --name=zookeeper -e ZOOKEEPER_CLIENT_PORT=32181 confluentinc/cp-zookeeper:4.0.0   
 

команды docker для запуска контейнера kafka:

 docker run -d --net=host --name=kafka -e KAFKA_ZOOKEEPER_CONNECT=localhost:32181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:29092 -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 confluentinc/cp-kafka:4.0.0
 

введите описание изображения здесь

шаг 2:

Затем я пытаюсь подключить свои скрипты Kafka producer и consumer в моем загрузочном API Springboot без какой-либо компоновки docker к этому порту, как показано ниже (я хотел бы доказать, могут ли эти два контейнера работать как обычный дистрибутив Kafka на моей хост-ОС):

 public class KafkaProducer {private static final String TOPIC = "foo";...}
public class KafkaConsumer { @KafkaListener(topics = "foo", groupId = "group1")...}

spring.kafka.producer.bootstrap-servers: localhost:29092
spring.kafka.consumer.bootstrap-servers: localhost:29092
 

в результате я получаю следующие ОШИБКИ:

 2020-12-23 14:38:45.937  WARN 14056 --- [ntainer#0-0-C-1] org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-group1-1, groupId=group1] Connection to node -1 (localhost/127.0.0.1:29092) could not be established. Broker may not be available.
2020-12-23 14:38:45.937  WARN 14056 --- [ntainer#0-0-C-1] org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-group1-1, groupId=group1] Bootstrap broker localhost:29092 (id: -1 rack: null) disconnected.
 

Не могли бы вы сказать мне, что я понял неправильно? Я совершенно новичок в Java, Kafka и Docker. Что я должен прочитать, чтобы лучше понять это?

Комментарии:

1. Как вы запускаете контейнеры Kafka? Можете ли вы запустить Kafka непосредственно на хосте, чтобы у вас было на одну совершенно новую технологию меньше для работы? (В частности, есть запутанный момент, когда при первоначальном подключении Kafka сервер сообщает клиенту, куда подключиться, и это может быть сложно исправить в смешанной среде Docker / non-Docker.)

2. @DavidMaze для запуска контейнера zookeeper: docker run -d --net=host --name=zookeeper -e ZOOKEEPER_CLIENT_PORT=32181 confluentinc/cp-zookeeper:4.0.0 для запуска контейнера kafka: docker run -d --net=host --name=kafka -e KAFKA_ZOOKEEPER_CONNECT=localhost:32181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:29092 -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 confluentinc/cp-kafka:4.0.0 да, он отлично работает с папкой kafka_2.13-2.6.0 на моем хосте. Я знаю, что это запутанная структура, и мой api должен работать в третьем контейнере, но я пытаюсь понять, насколько реален контейнер Kafka.

3. Что значит «насколько реально»? 1) Вам не нужно использовать --net=host , и в любом случае это работает только так, как ожидалось, в Linux 2) Пожалуйста, прочитайте confluent.io/blog/kafka-listeners-explained 3) Использование Compose было бы проще (см. Сообщение в блоге) 4) почему вы хотите / должны использовать старую версиюплатформы Confluent?

4. 4) Вы можете прочитать предупреждение в верхней части страницы, которое ссылается на текущую версию 😉

5. В любом случае ключевым выводом будет то, что вам нужен объявленный прослушиватель из контейнера, который предоставляет и возвращает адрес Kafka. С помощью этой информации вы можете запускать приложение Spring в контейнере или из контейнера, но вам придется использовать разные адреса и порты в зависимости от того, как вы настроили Kafka

Ответ №1:

По какой-то причине он работает с новой версией руководства.

https://docs.confluent.io/platform/current/quickstart/ce-docker-quickstart.html