1. 官网下载kafka,其支持在windows环境运行。
2. zookeeper不用单独下载,其已自带。
3. kafka下载完成后,windows平台解压缩即可使用,当然需要安装 java jdk。启动命令如下:
1、启动zookeeper
bin\windows\zookeeper-server-start.bat config\zookeeper.properties
2、启动kafka
bin\windows\kafka-server-start.bat config\server.properties
3、创建主题topic,topic = demo
bin\windows\kafka-topics.bat --list --bootstrap-server localhost:9092
4、启动生产者 producer
bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic demo
5、启动消费者 customer
bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic demo --from-beginning
4. maven中加入
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.6.3</version>
</dependency>
5. 消费者
public class Consumer1 {
public void abc(){
String sdz = StringDeserializer.class.getName();
Properties prop = new Properties();
prop.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
prop.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, sdz);
prop.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, sdz);
prop.put(ConsumerConfig.GROUP_ID_CONFIG,"con-1"); // 指定消费者组id,在同一时刻消费组只有一个线程可以去消费一个分区的数据,不同的消费组可以消费同一个分区的消息
prop.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "latest"); // 自动提交偏移量
prop.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000"); //自动提交时间
ArrayList<String> topics = new ArrayList<>();
topics.add("test");
try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(prop)){
consumer.subscribe(topics);
while(true){
ConsumerRecords<String, String> poll = consumer.poll(Duration.ofSeconds(20));
for(ConsumerRecord<String, String> consumerRecord :poll){
System.out.println(consumerRecord.timestamp() + ":" + consumerRecord.topic() + ":" + consumerRecord.value());
}
}
}catch (Exception ignored){
}
}
}
6. 生产者
public class Producer1 {
KafkaProducer<String, String> producer = NewProducer();
public KafkaProducer<String, String> NewProducer(){
// 如果acks=0:表示需要Leader节点回复收到消息,这样生产者才会发送下一条数据
// 如果acks=1:只要Partition Leader接收到消息而且写入本地磁盘了,就认为成功了,不管他其他的Follower有没有同步过去这条消息了。
// 如果acks=all:表示需要所有Leader+副本节点回复收到消息(acks=-1),这样生产者才会发送下一条数 据
// retries 如果当前请求失败,则生产者可以自动重新连接,但是要是设置retries=0参数,则意味着请示失败不会重新连接,这样可以避免重复发送的可能
// key.serializer value.serializer 数据在网络中传输需要进行序列化
String ssz = StringSerializer.class.getName();
Properties prop = new Properties();
prop.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "127.0.0.1:9092");
prop.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, ssz);
prop.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ssz);
prop.put(ProducerConfig.ACKS_CONFIG, "all");
prop.put(ProducerConfig.RETRIES_CONFIG, 0);
prop.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);
prop.put(ProducerConfig.LINGER_MS_CONFIG, 1);
prop.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
return new KafkaProducer<>(prop);
}
public void close(){
producer.close();
}
public void send(String topic, String key, String val) {
producer.send(new ProducerRecord<>(topic, key, val));
}
}