#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