kafka2.0系列之(6) Kafka客戶端API實現數據生產消費

前言

發佈和訂閱是kafka的重要功能之一,而實現這一功能最好的方式可能就是使用kafka提供的客戶端進行編碼開發,下面使用kafka官方文檔進行示例程序實現數據生成消費,Kafka服務使用之間搭建的環境。

客戶端依賴

  1. 打開文檔頁面,API文檔
  2. 將生產者API,消費者API依賴加入maven項目pom.xml文件
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>2.2.0</version>
</dependency>

Producer API Consumer API AdminClient API 這個三個API封裝在依賴kafka-clients

Producer程序示例

  1. 生產者屬性配置
Properties props = new Properties();
props.put("bootstrap.servers", "10.231.129.20:9092");
props.put("acks", "all");
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

其中,bootstrap.servers指定kafka服務地址,acks指定認爲請求完成的標準的策略爲最強,涉及到數據備份的可用性,key.serializer指定消息key的序列化類,value.serializer指定消息value的序列化類

  1. 實例化生產者對象
Producer<String, String> producer = new KafkaProducer<>(props);

使用上面的配置信息進行生產者實例化

  1. 發送數據
for (int i = 0; i < 100; i++)
    producer.send(new ProducerRecord<String, String>("foo", Integer.toString(i), Integer.toString(i)));

producer.close();

將要發送的消息和要發送的主題foo消息發送對象ProducerRecord中,然後使用producer.send()方法發送,循環100次之後關閉生產者

Consumer程序示例

  1. 消費者屬性配置
Properties props = new Properties();
props.setProperty("bootstrap.servers", "10.231.129.20:9092");
props.setProperty("group.id", "test");
props.setProperty("enable.auto.commit", "true");
props.setProperty("auto.commit.interval.ms", "1000");
props.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

其中,bootstrap.servers指定kafka服務地址,group.id指定指定消費者組ID,enable.auto.commit指定消費者自動提交偏移量,auto.commit.interval.ms指定自動提交偏移量的週期,key.serializer指定消息key的序列化類,value.serializer指定消息value的序列化類

  1. 實例化消費者對象
Consumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Arrays.asList("foo", "bar"));

使用上面的配置信息進行消費者實例化,然後訂閱生產者主題foo

  1. 接收數據
while (true) {
    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records)
        System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
}

使用consumer.poll(Duration.ofMillis(100))方法獲取主題爲foo以及bar的消息接收對象CconsumerRecord,方法內指定拉取週期。

測試

分別正常執行生產者,消費者程序,然後看到消費者控制檯打印如下:

offset = 3, key = 0, value = 0
offset = 4, key = 1, value = 1
offset = 5, key = 2, value = 2
offset = 6, key = 3, value = 4
...
offset = 99, key = 96, value = 96
offset = 100, key = 97, value = 97
offset = 101, key = 98, value = 98
offset = 102, key = 99, value = 99

後記

這是來源於官方文檔的一個示例,是一個基本程序,後續所有東西會基於該程序。通過客戶端的API開發,實現生產者,消費者之間的消息數據流通。kafka還是很牛逼的,像我們就經常用於 商業數據實時大屏,ETL中數據傳輸等等。
最後:

  • 本文示例完整代碼Github,代碼地址:todo
  • 本文錄製有操作視頻,可以在今日頭條上進行觀看,視頻地址:todo
  • 歡迎關注頭條號:行走的IT

參考文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章