我们在单个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
文件?
由于
答案 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
,但可能有更好的方法。