我们在单个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
文件夹?
谢谢
1条答案
按热度按时间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
,但可能有更好的方法。