如何在Kafka中获取经纪人的连接字符串

时间:2017-03-01 20:10:54

标签: java apache-kafka apache-zookeeper broker

我是卡夫卡的新手。试图实现消费者和生产者类来发送和接收消息。需要为这两个类配置bootstrap.servers,这是由,分隔的代理的ip和端口列表。例如,

producerConfig.put("bootstrap.servers", 
                "172.16.20.207:9946,172.16.20.234:9125,172.16.20.36:9636");

由于应用程序将在群集的主节点上运行,因此它应该能够从ZooKeeper检索代理信息,就像Kafka: Get broker host from ZooKeeper的答案一样。

public static void main(String[] args) throws Exception {
    ZooKeeper zk = new ZooKeeper("localhost:2181", 10000, null);
    List<String> ids = zk.getChildren("/brokers/ids", false);
    for (String id : ids) {
        String brokerInfo = new String(zk.getData("/brokers/ids/" + id, false, null));
        System.out.println(id + ": " + brokerInfo);
    }
}

但是这个brokerInfo采用Json格式,如下所示:     { “jmx_port”: - 1, “时间戳”: “1428512949385”, “宿主”: “192.168.0.11”, “版本”:1, “端口”:9093}

在同一篇文章中,另一篇文章提出了以下获取每个代理的连接字符串的方法,并用逗号将它们连接在一起。

for (String id : ids) {
        String brokerInfoString = new String(zk.getData("/brokers/ids/" + id, false, null));
        Broker broker = Broker.createBroker(Integer.valueOf(id), brokerInfoString);
        if (broker != null) {
            brokerList.add(broker.connectionString());
        }
    }

如果此Broker课程来自org.apache.kafka.common.requests.UpdateMetadataRequest.Broker,则它没有方法createBrokerconnectionString

发现了另一篇类似的帖子Getting the list of Brokers Dynamically。但它没有说明如何从hostport等经纪人信息中获取该属性。我可以为json写一个像字符串一样的解析器来提取它们,但我怀疑有更多的Kafka本地方法来做到这一点。有什么建议吗?

编辑:我意识到Broker课程来自kafka.cluster.Broker。它仍然没有方法connectionstring()

1 个答案:

答案 0 :(得分:1)

您可以使用ZkUtils检索群集中的所有代理信息,如下所示:

ZkUtils zk = ZkUtils.apply("zkHost:2181", 6000, 6000, true);
List<Broker> brokers = JavaConversions.seqAsJavaList(zk.getAllBrokersInCluster());
for (Broker broker : brokers) {  
    //assuming you do not enable security    
    System.out.println(broker.getBrokerEndPoint(SecurityProtocol.PLAINTEXT).host());
}
zk.close();