问题描述
在服务器或者虚拟机中安装完zookeeper和kafka后,在服务器端使用kafka的bin
目录下的kafka-console-producer.sh
和kafka-console-consumer.sh
这两个脚本启动生产者和消费者测试是kafka是有效的,但是在本地机器使用java代码或者python代码连接时,可能会出现这样一个问题,就是producer和consumer代码可以启动,连接没有报错,但是生产和消费的消息好像都没有到达kafka,也就是本地机器上的kafka生产者和消费者代码和服务器上的kafka连接不通。
下面以python为例:
生产者代码:
import sys
sys.path.append('..')
from kafka import KafkaProducer, KafkaConsumer
import json
import time
if __name__ == '__main__':
producer = KafkaProducer(
bootstrap_servers=['10.19.1.218:9092'],
value_serializer=lambda value: json.dumps(value).encode('utf-8')
)
print("connect succ....")
alert_result = {
"line": '1', #
"id": '123',
"result": {"md_id": "45",
"car": "M1",
"fault_code": "001"
}
}
# 异步发送
for i in range(10):
producer.send('test_kafka', value=alert_result)
# producer.flush()
time.sleep(0.5)
print('ok')
print('完成')
消费者代码:
import sys
sys.path.append('..')
from datetime import datetime
from kafka import KafkaConsumer
import json
if __name__ == '__main__':
consumer = KafkaConsumer('test_kafka',
auto_offset_reset='latest', # latest/earliest
group_id='group1',
enable_auto_commit=True,
value_deserializer=lambda m: json.loads(m.decode('utf-8')),
bootstrap_servers=['10.19.1.218:9092'])
print(consumer)
print(type(consumer))
for message in consumer:
print(message)
解决方式:
通过修改本地主机的hosts,将服务器的ip和hostname加入本机hosts文件中,然后重启电脑即可
windows系统的hosts文件夹为于C:\Windows\System32\drivers\etc
目录下,修改需要管理员权限,如果连接的服务器是集群,那么集群中的所有服务器ip都需要加上。