前言
- kafka版本:2.11-2.1.1
- 基于Kafka Java API
- 主要是通过封装
Consumer.partitionsFor
方法实现此功能
代码
/**
* <p>
* 用于寻找指定Brokers-Topic-Partition对应的Leader.
* 主要是封装了{@link KafkaConsumer#partitionsFor}方法.
*
* @param brokers 指定的Kafka集群,格式为<"host","port">
* @param topic 指定的Topic
* @param partition 指定的Partition ID
* @return Node {@link Node}
* @date 2020/3/17
*/
public static Node findLeader(Map<String, Integer> brokers, String topic, int partition) {
// 1.通过接收到的配置信息创建KafkaConsumer实例
Properties props = new Properties();
for (String broker : brokers.keySet()) {
props.put("bootstrap.servers",
broker + ":" + brokers.getOrDefault(broker, 9092));
}
// 指定Consumer所属的ConsumerGroup
props.put("group.id", "test");
// 设置手动提交Offset,由于只是获取部分数据所以不需要自动提交Offset
props.put("enable.auto.commit", "false");
// 设置键值对<K,V>反序列化器,使用String对象反序列化器
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
// 2.定义KafkaConsumer实例,采用try{}catch{}finally{}的方式获取资源
KafkaConsumer<String, String> kafkaConsumer = null;
try {
// 3.创建KafkaConsumer实例
kafkaConsumer = new KafkaConsumer<>(props);
// 4.通过KafkaConsumer实例获取指定Topic对应的Partition信息
List<PartitionInfo> partitionInfos = kafkaConsumer.partitionsFor(topic);
// 5.遍历返回的指定Topic的所有Partition信息
for (PartitionInfo partitionInfo : partitionInfos) {
// 若当前Partition是指定的Partition,则保存此Partition的Replication并将其Leader返回
if (partitionInfo.partition() == partition) {
/*// 保存指定Partition的所有副本
replications = partitionInfo.replicas();*/
// 6.返回指定的TopicPartition对应的Leader
return partitionInfo.leader();
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (kafkaConsumer != null) kafkaConsumer.close();
}
// 如果没有找到Leader则返回null
return null;
}