在代碼中使用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();
}
}
}