Запустить kafka в docker, и получить к ней доступ из внешнего сервиса
Только начал изучать докер. Идея следующая: Есть 2 spring boot сервиса, между которыми общение осуществляется через кафку. Хочу попробовать перенести все это в докер. Для начала решил перенести в докер кафку. Используя docker-compose поднимаю zooKeeper и кафку так:
networks:
kafka-net:
driver: bridge
services:
zookeeper-server:
image: 'bitnami/zookeeper:latest'
networks:
- kafka-net
ports:
- '2181:2181'
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
kafka-server1:
image: 'bitnami/kafka:latest'
networks:
- kafka-net
ports:
- '9092:9092'
environment:
- KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zookeeper-server
используя команду docker-compose -f ./compose.yaml up -d у меня получается поднять и zookeeper и кафку, но почему то, мои сервисы не видят ее.
Вот конфиг класс consumer'a из сервиса:
@Configuration
public class KafkaConsumerConfig {
@Value("${kafka.server}")
private String kafkaServer;
@Value("${kafka.group.id}")
private String kafkaGroupId;
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, kafkaServer);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, LongDeserializer.class);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
props.put(ConsumerConfig.GROUP_ID_CONFIG, kafkaGroupId);
return props;
}
@Bean
public KafkaListenerContainerFactory<?> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<Long, BookingReceiptDto> factory =
new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
@Bean
public ConsumerFactory<Long, BookingReceiptDto> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}
И проперти файл данного сервиса:
server.port=8081
kafka.consumer.id=consumerServer
kafka.producer.id=producerServer
kafka.server=localhost:9092
kafka.group.id=server.broadcast
Думаю, что возможно, причина в том что порты как то не так проброшены. Но вроде бы все делаю по мануалам, а эффекта нет. В чем может быть причина?
Ответы (2 шт):
Оказалось, что необходимо прокидывать другие порты. Вот как должен выглядеть zookeeper:
zookeeper:
image: confluentinc/cp-zookeeper:latest
environment:
ZOOKEEPER_CLIENT_PORT: 2181
ZOOKEEPER_TICK_TIME: 2000
ports:
- 22181:2181
А вот так кафка:
kafka:
image: confluentinc/cp-kafka:latest
depends_on:
- zookeeper
ports:
- 29092:29092
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
Тогда все поднимается отлично. Если же вам надо из своего сервиса, развернутого в контейнере получить доступ к кафке, это делается так:
receipt:
container_name: receipt
build: ./receipt
ports:
- 8081:8081
environment:
KAFKA_SERVER: kafka:9092
depends_on:
- kafka
[QUESTION] Flush returned with error code -185: 'Local: Timed out' - название ошибки, которое я пытался исправить. Данная ошибка возникла при добавлении в Laravel - Kafka и соответственно добавлении в инфраструктуру новых сервисов, это Kafka контейнер и Zookeeper контейнер. Мне помогли следующие 2 ответа:
- Пояснение git
- Откуда брал информацию stackoverflow