客户端 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服务器。
- 使用
kafka.javaapi.producer.Producer
错误
- 使用
org.apache.kafka.clients.producer.KafkaProducer
挂起很久然后出错
在这两种情况下,如果我在主机上的 /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
,但可能还有更好的方法。
我们在单个 docker 容器上安装了 kafka 0.8.2.1 运行ning。这是设置为与 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 实例,所以获取 "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
,但可能还有更好的方法。