kafka2.0-入門demo_03

上一篇文章簡單的講了搭建kafka的環境以及如何啓動。

現在來講講kafka的簡單使用,然後使用java寫個小的測試程序。

首先假設你已經啓動了kafka集羣,我們來創建一個topic,使用如下命令:

bin/kafka-topics.sh --create --zookeeper 192.168.1.3:2181,192.168.1.128:2181,192.168.130:2181 --replication-factor 3 --partitions 1 --topic mr-yang

192.168.1.3:2181,192.168.1.128:2181,192.168.130:2181是我的zk集羣IP,mr-yang爲topic名稱。

然後我們使用如下命令查看topic的一些信息:

bin/kafka-topics.sh --describe --zookeeper 192.168.1.3:2181,192.168.1.128:2181,192.168.130:2181 --topic mr-yang

結果如下:
這裏寫圖片描述

以下是輸出內容的解釋,第一行是所有分區的概要信息,之後的每一行表示每一個partition的信息。因爲目前我們只有一個partition,因此關於partition的信息只有一行。

leader節點負責給定partition的所有讀寫請求。如果一個topic有多個partitions,那麼每個節點都會其中一部分partition的leader。

replicas 表示某個partition在哪幾個broker上存在備份。不管這個幾點是不是”leader“,甚至這個節點掛了,也會列出。

isr 是replicas的一個子集,它只列出當前還存活着的,並且備份了該partition的節點。

現在開始使用java編寫測試程序,首先引入maven依賴。

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>2.0.0</version>
</dependency>

程序分爲兩部分,一個是生產,一個是消費者,請先啓動消費者程序,如下:

生產者代碼:

/**
 * kafka生產者
 * @author yangyaming
 */
public class MyProducer {

    public static void main(String args[]){
         Properties props = new Properties();
         props.put("bootstrap.servers", "192.168.1.3:9092,192.168.1.128:9092,192.168.1.130:9092");
         props.put("acks", "all");
         props.put("retries", 0);
         props.put("batch.size", 16384);
         props.put("linger.ms", 1);
         props.put("buffer.memory", 33554432);
         props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
         props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

         Producer<String, String> producer = new KafkaProducer<>(props);
         for (int i = 0; i < 100; i++){
             /**
              * ProducerRecord 參數解析
              * 第一個:mr-yang爲生產者 topic名稱,
              * 第二個:對於生產者kafka2.0需要你指定一個key,在企業應用中,我們一般會把他當做businessId來用,比如訂單ID,用戶ID等等。
              * 第三個:消息的主要信息
              */
             producer.send(new ProducerRecord<String, String>("mr-yang", Integer.toString(i), Integer.toString(i)));
         }

         producer.close();
    }
}

消費者代碼如下,具體詳細註釋見代碼註釋

/**
 * kafka消費者
 */
public class MyConsumer {

    public  static void main(String args[]){
         Properties props = new Properties();
         /** kafka集羣ip **/
         props.put("bootstrap.servers", "192.168.1.3:9092,192.168.1.128:9092,192.168.1.130:9092");

         /** 由於kafka有消費組的概念,每個消費者要制定一個group **/
         props.put("group.id", "test");

         /** 我們這裏使用kafka high level模式,自動提交offset**/
         props.put("enable.auto.commit", "true");

         /** 自動提交的時間間隔 **/
         props.put("auto.commit.interval.ms", "1000");

         /** 制定key合value的序列化方式,這裏制定的是kafka的字符串序列化 **/
         props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
         props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

         KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
         consumer.subscribe(Arrays.asList("mr-yang"));
         while (true) {
             ConsumerRecords<String, String> records = consumer.poll(100);
             for (ConsumerRecord<String, String> record : records)
                 System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
         }
    }
}

程序運行結果:
這裏寫圖片描述

具體的java文檔如下:
kafka2.0 producer javadoc
http://kafka.apache.org/20/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html

kafka2.0 consumer javadoc
http://kafka.apache.org/20/javadoc/index.html?org/apache/kafka/clients/consumer/KafkaConsumer.html

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