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

kafka override advertised.host.name in client java

我们在单个 docker 容器上安装了 kafka 0.8.2.1 运行ning。这是设置为与 docker compose 一起工作的几个容器之一。 docker compose 还向主机公开了 kafka 9092 端口。

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

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

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

那么在 java Kafka 生产者中有没有一种方法可以覆盖元数据中指定的 hostname/ip。我们只有一个 kafka 实例,所以获取 "right one".

没有问题

FAQ page 上暗示可以这样做:

In another rare case where the binding host/port is different from the host/port for client connection, you can set advertised.host.name and advertised.port for client connection

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

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

谢谢

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

将 dockerised 代理中的 advertised.host.name 设置为其 docker-compose 网络 IP 地址,并为任何非 dockerised 生产者设置 bootstrap.servers或消费者 localhost

要获取撰写网络 IP,您可以在撰写文件中指定一个静态 IP,或者在启动 kafka 获取它之前将容器设置为 运行 一个 shell 命令。我使用的命令是 ip -4 addr show scope global dev $(route -n | grep 'UG[ \t]' | awk '{print }' | head -1) | grep inet | awk '{print }' | cut -d / -f 1,但可能还有更好的方法。