Kafka的基礎使用

在代碼中使用Kafka其實也是非常簡單的,首先肯定是需要引入相關的依賴,如下:

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

其中引入依賴的版本建議和使用的Kafka保持一致,和Zookeeper一樣的,這裏我們也是可以通過在Kafka的安裝包下的/lib目錄下查看到其相關版本,如下:
在這裏插入圖片描述



然後我們需要創建一個的主題,創建主題我們可以使用之前Kafka的安裝、管理和配置中,介紹的命令行的方式,如主題名爲my-topic,1副本,2分區的主題,如下:
kafka-topics.bat --zookeeper localhost:2181/kafka --create --replication-factor 1 --partitions 2 --topic my-topic


當然我們也可以不用手動創建,因爲Kafka是允許自動創建主題。
在這裏插入圖片描述




接來下其實和其它MQ類似,我們肯定是需要生產者發送消息,和消費者接受消息。這裏我們就先來看一看生產者發送消息的過程,其中創建生產者對象時有三個屬性必須指定。

bootstrap.servers

該屬性指定Broker的地址清單,地址的格式爲host:port 。如果是Kafka集羣,清單裏也不需要包含所有的Broker地址,生產者會從給定的Broker裏查詢其他Broker的信息。不過最少提供2個broker的信息,一旦其中一個宕機,生產者仍能連接到集羣上。


key.serializer

生產者接口允許使用參數化類型,可以把Java對象作爲鍵和值傳Broker,但是Broker希望收到的消息的鍵和值都是字節數組,所以必須提供將對象序列化成字節數組的序列化器。

key.serializer必須設置爲實現org.apache.kafka.common.serialization.Serializer的接口類,Kafka的客戶端默認提供了ByteArraySerializer、IntegerSerializer、StringSerializer等等,當然也可以實現自定義的序列化器。


value.serializer

該參數和上述key.serializer其作用及要求是一致的。

public class MyKafkaProducer {
    public static void main(String[] args) {
        Properties properties = new Properties();

        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092,127.0.0.1:9093");
        //properties.put("bootstrap.servers", "127.0.0.1:9092,127.0.0.1:9093");

        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        //properties.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        //properties.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        KafkaProducer<String, String> producer = new KafkaProducer<>(properties);

        try {
            ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "name", "BXS");
            producer.send(record);
        } finally {
            producer.close();
        }
    }
}



然後我們繼續來看看消費者接受消息時,其必需的參數,如下:

bootstrap.servers

同上生產者的bootstrap.servers配置


key.deserializer

生產者在使用了序列化器將其對象序列化爲字節數據,那麼消費者在接收到消息後,肯定也是需要進行反序列化處理的,所有這裏就需要誰知
生產者接口允許使用參數化類型,可以把Java對象作爲鍵和值傳Broker,但是Broker希望收到的消息的鍵和值都是字節數組,所以必須提供將對象序列化成字節數組的序列化器。

key.deserializer必須設置爲實現org.apache.kafka.common.serialization.Deserializer的接口類,Kafka的客戶端默認提供了ByteArrayDeserializer、IntegerDeserializer、StringDeserializer等等,當然也可以實現自定義的序列化器。

value.deserializer

該參數和上述key.deserializer其作用及要求是一致的。

group.id

並非完全必需,它指定了消費者屬於哪一個羣組,但是創建不屬於任何一個羣組的消費者並沒有問題。

public class MyKafkaConsumer {
    public static void main(String[] args) {
        Properties properties = new Properties();

        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092,127.0.0.1:9093,127.0.0.1:9094");
        //properties.put("bootstrap.servers", "127.0.0.1:9092,127.0.0.1:9093");

        properties.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        //properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        properties.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        //properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        properties.put(ConsumerConfig.GROUP_ID_CONFIG, "group_0");
        //properties.put("group.id", "group_0");

        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(properties);

        consumer.subscribe(Collections.singletonList("my-topic"));
        try {
            while (true) {
                ConsumerRecords<String, String> records = consumer.poll(500);
                for (ConsumerRecord<String, String> record : records) {
                    System.out.println(String.format("主題:%s, 分區:%d, 偏移量:%d, key:%s, value:%s",
                            record.topic(), record.partition(), record.offset(), record.key(), record.value()));
                }
            }
        } finally {
            consumer.close();
        }
    }
}

在這裏插入圖片描述

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