kafka重写客户端java中的adverted.host.name

zvokhttg  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(636)

我们在单个docker容器上运行kafka 0.8.2.1。这是为与docker compose一起工作而设置的几个容器之一。docker compose还将kafka 9092端口暴露给主机。
这个 advertised.host.name Kafka服务器的 kafka 所有其他容器都可以用这个名字和它很好地交谈。
问题是java测试程序无法从主机向kafka服务器发送消息。
使用 kafka.javaapi.producer.Producer 错误
使用 org.apache.kafka.clients.producer.KafkaProducer 挂起很长时间然后出错
在这两种情况下,如果我在 /etc/hosts 文件在主机上运行正常。但这并不理想,我希望任何人都能够运行这些测试,而不干扰他们的工作 hosts 文件。
那么在javakafka生产者中有没有一种方法可以覆盖元数据中指定的主机名/ip呢。我们只有一个Kafka的例子,所以没有问题,在得到“正确的一个”。
在faq页面上,这意味着可以这样做:
在绑定主机/端口与客户端连接的主机/端口不同的另一种罕见情况下,可以为客户端连接设置advised.host.name和advised.port
但是没有细节说明。。。
或者说,如果不能找到更普遍的解决办法。有没有办法定一个目标 hosts java运行时环境中的入口?不干扰系统 /etc/hosts 文件夹?
谢谢

dgiusagp

dgiusagp1#

可以设置停靠的代理,以便它可以在容器和主机上与消费者和生产者进行对话。
advertised.host.name 在dockerised broker中向其docker组成网络ip地址,并 bootstrap.servers 任何非对接生产商或消费者 localhost .
要获取compose网络ip,可以在compose文件中指定一个静态ip,或者在启动kafka获取它之前将容器设置为运行shell命令。我使用的命令是 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 ,但可能有更好的方法。

相关问题