一. 新版SpringBoot2.X项目搭建整合Kafka客户端
新版SpringBoot2.X介绍:
官网
Github地址
官方文档
相关软件环境和作用
JDK1.8+以上
Maven3.5+
编辑器IDEA(旗舰版)
在线创建
在SpringBoot整合kafka很简单:添加依赖 kafka-clients
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.4.0</version>
</dependency>
二. SpringBoot2.x整合Kafka客户端+adminApi单元测试
单元测试配置客户端+创建topic
/**
* 设置admin 客户端
* @return
*/
public static AdminClient initAdminClient(){
Properties properties = new Properties();
properties.setProperty(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG,"ip":9092");
AdminClient adminClient = AdminClient.create(properties);
return adminClient;
}
//创建
@Test
public void createTopic() {
AdminClient adminClient = initAdminClient();
// 2个分区,1个副本
NewTopic newTopic = new NewTopic(TOPIC_NAME, 2 , (short) 1);
CreateTopicsResult createTopicsResult = adminClient.createTopics(Arrays.asList(newTopic));
//future等待创建,成功不会有任何报错,如果创建失败和超时会报错。
try {
createTopicsResult.all().get();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("创建新的topic");
}
查看topic
./kafka-topics.sh --list --zookeeper ip:2181
查看broker节点topic状态信息
./kafka-topics.sh --describe --zookeeper ip:2181 --topic xdclass-sp-topic-test
三. Kafka使用JavaAPI-AdminClient删除和列举topic
list列举
//获取
@Test
public void listTopic() throws ExecutionException, InterruptedException {
AdminClient adminClient = initAdminClient();
//是否查看内部的topic,可以不用
ListTopicsOptions options = new ListTopicsOptions();
options.listInternal(true);
ListTopicsResult listTopics = adminClient.listTopics(options);
Set<String> topics = listTopics.names().get();
for (String topic : topics) {
System.err.println(topic);
}
}
删除
//删除
@Test
public void delTopicTest() {
AdminClient adminClient = initAdminClient();
DeleteTopicsResult deleteTopicsResult = adminClient.deleteTopics(Arrays.asList("xdclass-sp11-topic"));
try {
deleteTopicsResult.all().get();
} catch (Exception e) {
e.printStackTrace();
}
}
四. AdminClientApi查看Topic详情和增加分区数量
查看topic详情
//获取指定topic的详细信息
@Test
public void getTopicInfo() throws Exception {
AdminClient adminClient = initAdminClient();
DescribeTopicsResult describeTopicsResult = adminClient.describeTopics(Arrays.asList(TOPIC_NAME));
Map<String, TopicDescription> stringTopicDescriptionMap = describeTopicsResult.all().get();
Set<Map.Entry<String, TopicDescription>> entries = stringTopicDescriptionMap.entrySet();
entries.stream().forEach((entry)-> System.out.println("name :"+entry.getKey()+" , desc: "+ entry.getValue()));
}
增加分区数量
/**
* 增加分区数量
*
* 如果当主题中的消息包含有key时(即key不为null),根据key来计算分区的行为就会有所影响消息顺序性
*
* 注意:Kafka中的分区数只能增加不能减少,减少的话数据不知怎么处理
*
* @throws Exception
*/
@Test
public void incrPartitionsTest() throws Exception{
Map<String, NewPartitions> infoMap = new HashMap<>();
NewPartitions newPartitions = NewPartitions.increaseTo(5);
AdminClient adminClient = initAdminClient();
infoMap.put(TOPIC_NAME, newPartitions);
CreatePartitionsResult createPartitionsResult = adminClient.createPartitions(infoMap);
createPartitionsResult.all().get();
}