我是卡夫卡的新手。试图实现消费者和生产者类来发送和接收消息。需要为这两个类配置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
,则它没有方法createBroker
和connectionString
。
发现了另一篇类似的帖子Getting the list of Brokers Dynamically。但它没有说明如何从host
和port
等经纪人信息中获取该属性。我可以为json写一个像字符串一样的解析器来提取它们,但我怀疑有更多的Kafka本地方法来做到这一点。有什么建议吗?
编辑:我意识到Broker
课程来自kafka.cluster.Broker
。它仍然没有方法connectionstring()
。
答案 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();