記錄:458
場景:在Spring Boot微服務(wù)集成Kafka客戶端spring-kafka-2.8.2操作Kafka的Topic的創(chuàng)建和刪除。
版本:JDK 1.8,Spring?Boot 2.6.3,kafka_2.12-2.8.0,spring-kafka-2.8.2。
Kafka安裝:https://blog.csdn.net/zhangbeizhen18/article/details/129071395
1.微服務(wù)中配置Kafka信息
1.1在pom.xml添加依賴
pom.xml文件:
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.8.2</version>
</dependency>
解析:spring-kafka選擇一般是使用spring-boot集成的對應(yīng)版本。
請知悉:spring-kafka框架底層使用了原生的kafka-clients。本例對應(yīng)版本:3.0.0。
1.2在application.yml中配置Kafka信息
配置細節(jié)在官網(wǎng)的configuration:https://kafka.apache.org/documentation/
(1)application.yml配置內(nèi)容
spring:
kafka:
#kafka服務(wù)端的IP和端口,格式:(ip:port)
bootstrap-servers: 192.168.19.203:29001
#生產(chǎn)者
producer:
#客戶端發(fā)送服務(wù)端失敗的重試次數(shù)
retries: 2
#多個記錄被發(fā)送到同一個分區(qū)時,生產(chǎn)者將嘗試將記錄一起批處理成更少的請求.
#此設(shè)置有助于提高客戶端和服務(wù)器的性能,配置控制默認批量大小(以字節(jié)為單位)
batch-size: 16384
#生產(chǎn)者可用于緩沖等待發(fā)送到服務(wù)器的記錄的總內(nèi)存字節(jié)數(shù)(以字節(jié)為單位)
buffer-memory: 33554432
#指定key使用的序列化類
key-serializer: org.apache.kafka.common.serialization.StringSerializer
#指定value使用的序列化類
value-serializer: org.apache.kafka.common.serialization.StringSerializer
#生產(chǎn)者producer要求leader節(jié)點在考慮完成請求之前收到的確認數(shù),用于控制發(fā)送記錄在服務(wù)端的持久化
#acks=0,設(shè)置為0,則生產(chǎn)者producer將不會等待來自服務(wù)器的任何確認.該記錄將立即添加到套接字(socket)緩沖區(qū)并視為已發(fā)送.在這種情況下,無法保證服務(wù)器已收到記錄,并且重試配置(retries)將不會生效(因為客戶端通常不會知道任何故障),每條記錄返回的偏移量始終設(shè)置為-1.
#acks=1,設(shè)置為1,leader節(jié)點會把記錄寫入本地日志,不需要等待所有follower節(jié)點完全確認就會立即應(yīng)答producer.在這種情況下,在follower節(jié)點復(fù)制前,leader節(jié)點確認記錄后立即失敗的話,記錄將會丟失.
#acks=all,acks=-1,leader節(jié)點將等待所有同步復(fù)制副本完成再確認記錄,這保證了只要至少有一個同步復(fù)制副本存活,記錄就不會丟失.
acks: -1
consumer:
#開啟consumer的偏移量(offset)自動提交到Kafka
enable-auto-commit: true
#consumer的偏移量(offset)自動提交的時間間隔,單位毫秒
auto-commit-interval: 1000
#在Kafka中沒有初始化偏移量或者當前偏移量不存在情況
#earliest,在偏移量無效的情況下,自動重置為最早的偏移量
#latest,在偏移量無效的情況下,自動重置為最新的偏移量
#none,在偏移量無效的情況下,拋出異常.
auto-offset-reset: latest
#一次調(diào)用poll返回的最大記錄條數(shù)
max-poll-records: 500
#請求阻塞的最大時間(毫秒)
fetch-max-wait: 500
#請求應(yīng)答的最小字節(jié)數(shù)
fetch-min-size: 1
#心跳間隔時間(毫秒)
heartbeat-interval: 3000
#指定key使用的反序列化類
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
#指定value使用的反序列化類
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
(2)解析
配置類在spring boot自動注解包:spring-boot-autoconfigure-2.6.3.jar。
類:org.springframework.boot.autoconfigure.kafka.KafkaProperties。
使用@ConfigurationProperties注解使其生效,前綴是:spring.kafka。
1.3加載邏輯
Spring Boot微服務(wù)在啟動時,Spring Boot會讀取application.yml的配置信息,根據(jù)配置內(nèi)容在spring-boot-autoconfigure-2.6.3.jar找到KafkaProperties并注入到對應(yīng)屬性。Spring Boot微服務(wù)在啟動完成后,在Spring環(huán)境中就能取到KafkaProperties的配置信息。
Spring的spring-kafka框架將KafkaProperties配置信息注入到KafkaAdmin。
使用KafkaAdminClient創(chuàng)建AdminClient,再使用AdminClient操作Topic。
2.使用AdminClient創(chuàng)建Kafka的Topic
AdminClient全稱:org.apache.kafka.clients.admin.AdminClient
盡管集成spring-kafka,但是在操作Kafka的Topic方面,主要還是以kafka-clients的API為主。
(1)示例代碼
@RestController
@RequestMapping("/hub/example/topic")
@Slf4j
public class OperateKafkaTopicController {
@Autowired
private KafkaAdmin kafkaAdmin;
private String topicName = "hub-topic-city-01";
@GetMapping("/f01_1")
public Object f01_1() {
try {
//1.獲取Kafka配置信息
Map<String, Object> configs = kafkaAdmin.getConfigurationProperties();
//2.創(chuàng)建客戶端AdminClient
AdminClient adminClient = KafkaAdminClient.create(configs);
//3.獲取Topic清單
Set<String> topicSet = adminClient.listTopics().names().get();
log.info("在Kafka已建Topic數(shù)量: {} ,清單:", topicSet.size());
topicSet.forEach(System.out::println);
//4.創(chuàng)建Topic
if (!topicSet.contains(topicName)) {
log.info("新建Topic: {}", topicName);
// Topic名稱,分區(qū)Partition數(shù)目,復(fù)制因子(replication Factor)
NewTopic newTopic = new NewTopic(topicName, 1, (short) 1);
Collection<NewTopic> newTopics = Lists.newArrayList(newTopic);
adminClient.createTopics(newTopics);
}
} catch (Exception e) {
log.info("創(chuàng)建Topic異常.");
e.printStackTrace();
}
return "創(chuàng)建成功";
}
}
(2)解析代碼
注入spring-kafka框架的KafkaAdmin主要目的是獲取配置內(nèi)容。
操作Kafka的Topic需要先創(chuàng)建AdminClient,使用AdminClient的API創(chuàng)建Topic。
創(chuàng)建Topic一般只需指定Topic名稱,分區(qū)Partition數(shù)目,復(fù)制因子(replication Factor)就行。
3.使用AdminClient刪除Kafka的Topic
AdminClient全稱:org.apache.kafka.clients.admin.AdminClient
盡管集成spring-kafka,但是在操作Kafka的Topic方面,主要還是以kafka-clients的API為主。
(1)示例代碼
@RestController
@RequestMapping("/hub/example/topic")
@Slf4j
public class OperateKafkaTopicController {
@Autowired
private KafkaAdmin kafkaAdmin;
private String topicName = "hub-topic-city-01";
@GetMapping("/f01_2")
public Object f01_2() {
try {
//1.獲取Kafka配置信息
Map<String, Object> configs = kafkaAdmin.getConfigurationProperties();
//2.創(chuàng)建客戶端AdminClient
AdminClient adminClient = KafkaAdminClient.create(configs);
//3.獲取Topic清單
Set<String> topicSet = adminClient.listTopics().names().get();
//4.刪除Topic
if (topicSet.contains(topicName)) {
log.info("刪除Topic: {}", topicName);
Collection<String> topics = Lists.newArrayList(topicName);
DeleteTopicsResult deleteTopicsResult = adminClient.deleteTopics(topics);
deleteTopicsResult.all().get();
}
} catch (Exception e) {
log.info("刪除Topic異常.");
e.printStackTrace();
}
return "刪除成功";
}
}
(2)解析代碼
注入spring-kafka框架的KafkaAdmin主要目的是獲取配置內(nèi)容。
操作Kafka的Topic需要先創(chuàng)建AdminClient,使用AdminClient的API刪除Topic。
創(chuàng)建Topic一般只需指定Topic名稱就行。
4.測試
創(chuàng)建請求RUL:http://127.0.0.1:18208/hub-208-kafka/hub/example/topic/f01_1
刪除請求RUL:http://127.0.0.1:18208/hub-208-kafka/hub/example/topic/f01_2
以上,感謝。文章來源:http://www.zghlxwxcb.cn/news/detail-488204.html
2023年6月17日文章來源地址http://www.zghlxwxcb.cn/news/detail-488204.html
到了這里,關(guān)于使用Kafka客戶端(spring-kafka)的Java API操作Kafka的Topic的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!