Наконец-то разобрался, как обойти «Ошибка: подключить ETIMEDOUT», когда я вижу, как программа nodejs в Windows подключается, но не удается выполнить.
Вот простой рецепт.
Во-первых, в Vagrantfile, в дополнение к линиям перенаправленных портов, перечисленным выше, укажите правильное имя Oracle Virtualbox vm со строкой:
# after line: config.vm.provider :virtualbox do |vb|
vb.name = "kafkadocker"
Запустите виртуальную машину с:
vagrant up
Далее в командной строке Windows выполните:
ipconfig
Обратите внимание на IP-адрес Oracle Virtualbox vm, для меня строки импорта были:
Ethernet adapter VirtualBox Host-Only Network:
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::9900:a662:107f:3420%11
IPv4 Address. . . . . . . . . . . : 192.168.56.1
Далее нам нужно настроить Windows, чтобы понять, когда ей говорят, что для подключения к серверу «kafkadocker» необходимо перейти на IP-адрес 192.168.56.1, поэтому откройте Notepad ++ как АДМИНИСТРАТОР и добавьте следующую строку в файл C: \ Windows \ System32 \ drivers \ etc \ hosts:
192.168.56.1 kafkadocker
Далее, в vm, отредактируйте docker-compose.yml и измените его на:
version: '2'
services:
zookeeper:
image: "wurstmeister/zookeeper:latest"
network_mode: "host"
ports:
- "2181:2181"
kafka:
image: "wurstmeister/kafka:latest"
network_mode: "host"
ports:
- 9092
environment:
KAFKA_LISTENERS: PLAINTEXT://:9092
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafkadocker:9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_CREATE_TOPICS: "BertTopic:3:1"
Важной строкой является KAFKA_ADVERTISED_LISTENERS. При подключении, Кафка скажет клиенту на Windows вставить сервер "kafkadocker". Теперь, благодаря файлу хостов Windows, нодовая программа будет знать, на какой IP-адрес перейти.
Теперь запустите kafka-docker в виртуальной машине с:
docker-compose up -d
Далее в Windows откройте код Visual Studio:
cd c:\nodecode
code .
И запустить программы nodejs. Для производителя:
var kafka = require('kafka-node'),
Producer = kafka.Producer,
KeyedMessage = kafka.KeyedMessage,
client = new kafka.Client(),
producer = new Producer(client),
km = new KeyedMessage('key', 'message'),
payloads = [
{ topic: 'BertTopic', messages: 'first message', partition: 0 },
{ topic: 'BertTopic', messages: 'second message', partition: 0 },
{ topic: 'BertTopic', messages: 'third message', partition: 0 }
];
producer.on('ready', function () {
producer.send(payloads, function (err, data) {
console.log(data);
process.exit(0);
});
});
producer.on('error', function (err) {
console.log('ERROR: ' + err.toString());
});
Для потребителя (чтение всех сообщений с начала):
var kafka = require('kafka-node'),
Consumer = kafka.Consumer,
client = new kafka.Client(),
consumer = new Consumer(
client,
[
{ topic: 'BertTopic', partition: 0, offset: 0 }
],
{ fromOffset: true }
);
consumer.on('message', function (message)
{
console.log(message);
});
consumer.on('error', function (err)
{
console.log('ERROR ' + err.toString());
});
Надеюсь, это кому-нибудь поможет.