kafka覆盖客户端java中的advertised.host.name

时间:2016-11-30 15:44:04

标签: java apache-kafka docker-compose kafka-producer-api

我们在单个docker容器上运行kafka 0.8.2.1。这是设置为与docker compose一起工作的几个容器之一。 docker compose还将kafka 9092端口暴露给主机。

kafka服务器的advertised.host.name设置为kafka,所有其他容器都可以使用此名称与之通信。

问题是java测试程序无法从主机向kafka服务器发送消息。

  • 使用kafka.javaapi.producer.Producer错误
  • 使用org.apache.kafka.clients.producer.KafkaProducer挂起多年,然后错误

在这两种情况下,如果我在主机上的/etc/hosts文件中添加一个条目,它就可以正常工作。但这并不理想,我希望任何人都可以在不弄乱hosts文件的情况下运行这些测试。

因此,java Kafka生成器中有一种方法可以覆盖元数据中指定的hostname / ip。我们只有一个kafka实例,因此获得“正确的”没有问题。

FAQ page上暗示可以这样做:

  

在另一种罕见的情况下,绑定主机/端口不同于   用于客户端连接的主机/端口,可以设置advertised.host.name和   advertised.port用于客户端连接

但是没有详细说明......

或者没有一个更通用的解决方案。 有没有办法在java运行时环境中设置hosts条目?没有弄乱系统/etc/hosts文件?

由于

1 个答案:

答案 0 :(得分:3)

可以设置一个dockerised代理,以便它可以在容器和主机上与消费者和生产者交谈。

将dockerised broker中的advertised.host.name设置为其docker-compose网络IP地址,将bootstrap.servers设置为localhost,以便任何非dockerised生产者或消费者ip -4 addr show scope global dev $(route -n | grep 'UG[ \t]' | awk '{print $8}' | head -1) | grep inet | awk '{print $2}' | cut -d / -f 1

要获取撰写网络IP,您可以在撰写文件中指定静态IP,或者在启动kafka之前将容器设置为运行shell命令。我使用的命令是id,但可能有更好的方法。

相关问题