Lá estava eu estudando Kafka e me deparei com a seguinte situação: O Kafka instalado no Ubuntu através do WSL 2, rodando legal e eu criando produtores e consumidores a partir do Java usando o Intellij no Windows. Daí o que ocorre é: o Kafka sobe normal, mas o projeto Java não consegue encontrar o serviço, mesmo colocando no projeto o IP do WSL.
Então descobri que para fazer o projeto Java se comunicar com o Kafka no WSL 2 era preciso configurar a propriedade advertised.listeners no arquivo server.properties no diretório config do Kafka:
advertised.listeners=PLAINTEXT://ip_do_wsl:9092
Dessa forma a aplicação mesmo em outra rede consegue encontrar o Kafka e criar e ler os tópicos, produzindo e consumindo suas menagens. A propriedade advertised.listeners no Apache Kafka desempenha um papel crucial na comunicação entre os clientes (produtores e consumidores) e os brokers do Kafka, especialmente em cenários de redes distribuídas ou ambientes com várias interfaces de rede.
Ela especifica os endereços IP ou nomes de host e portas que os brokers Kafka devem anunciar para os clientes (produtores, consumidores, etc.). Esses são os endereços que os clientes usarão para se conectar ao broker após receberem a metadata inicial do Kafka.
Uma questão é: o IP do WSL pode mudar toda vez que for iniciado. Ficar mudando isso tanto no arquivo de configuração do Kafka quanto na aplicação (ou aplicações como é o caso microsseviços) é chato. Então pra mudar na aplicação (no meu caso Java) muda muito de caso pra caso, mas a ideia inicial seria usar variável de ambiente ou arquivo de propriedades tirando do código a dependência.
Para o Kafka recorri ao GPT que gerou o script bash a seguir que troca o IP no arquivo config/server.properties:
#!/bin/bash
# Passo 1: Obter o IP do WSL 2
WSL_IP=$(hostname -I | awk '{print $1}')
# Passo 2: Caminho para o arquivo server.properties do Kafka
KAFKA_CONFIG_PATH="/caminho/para/seu/kafka/config/server.properties"
# Passo 3: Atualizar o advertised.listeners com o IP atual do WSL 2
# Verifique se o arquivo existe
if [ -f "$KAFKA_CONFIG_PATH" ]; then
# Usar sed para substituir o advertised.listeners existente ou adicionar se não existir
if grep -q "^advertised.listeners=" "$KAFKA_CONFIG_PATH"; then
# Substitui a linha existente
sed -i "s/^advertised.listeners=.*/advertised.listeners=PLAINTEXT:\/\/$WSL_IP:9092/" "$KAFKA_CONFIG_PATH"
else
# Adiciona a linha se não existir
echo "advertised.listeners=PLAINTEXT://$WSL_IP:9092" >> "$KAFKA_CONFIG_PATH"
fi
echo "advertised.listeners atualizado com o IP: $WSL_IP"
else
echo "Erro: Arquivo server.properties não encontrado em $KAFKA_CONFIG_PATH"
exit 1
fi
# Passo 4: Iniciar ou reiniciar o Kafka para aplicar as mudanças
# Ajuste o comando abaixo para iniciar ou reiniciar seu Kafka
# Exemplo para iniciar Kafka:
# /caminho/para/seu/kafka/bin/kafka-server-start.sh -daemon $KAFKA_CONFIG_PATH
echo "Script concluído. Certifique-se de reiniciar o Kafka para aplicar as mudanças."
Basta salvar o script como atualiza_kafka.sh na pasta do Kafka, dar permissão de execução com chmod +x atualiza_kafka.sh e executar antes de subir o Kafka.
Ainda não executei o Kafka pelo Docker subindo também os produtores e consumidores em uma mesma rede com Docker Compose então não sei se muda muita coisa, mas como seria a mesma rede, acredito que essa configuração de advertised.listeners não seja necessária, de qualquer forma esse artigo pode ser útil pra mim mesmo no futuro e outros que estão aprendendo a ferramenta.