一、kafka核心功能
高性能的消息发送与高性能消息消费!
二、快速简单入门
1、kafka下载,地址:https://www.apache.org/dyn/closer.cgi?path=/kafka/2.3.0/kafka_2.12-2.3.0.tgz
2、jdk准备:
链接:https://pan.baidu.com/s/1hNOmq995aRl9i22vQsqfsw 提取码:kudu
3、zookeeper 我使用的3.4.6版本。
4、由于下载的是kafka2.3.0版本,jdk一定是jdk8以上的,而且jdk8中的低版本在过程中可能会出现启动问题。我使用的jdk版本:
jdk-8u161-linux-x64.tar.gz。
5、kafka 开启: ./kafka-server-start.sh ../config/server.properties &
要是连接自己的zookeeper,地址信息在server.properties中的改下IP
如果要使用kafka自带的,可以在kafka/bin/下使用zookeeper-server-start.sh ../config/zookeeper.properties
6、以上完成kafka简单安装
7、创建topic,后面再详细介绍每个的含义,这里只想快速完成一个示例。创建topic 用于消息发送与接收,名称为test,一个分区(partition)、一个副本
kafka-topics.sh --create --zookeeper localhost:2181 --topic test --partitions 1 --replication-factor 1
8、查看topic.kafka-topics.sh --describe --zookeeper localhost:2181 --topic test
9、发送消息。kafka默认提供发送消息的脚本。执行下面命令后输入的字符会进入kafka
kafka-console-producer.sh --broker-list localhost:9092 --topic test
10,消费数据。kafka提供的消费脚本。
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
三、Java Kafka生产消费数据(0.9.x之后的api)
1、生产者
package com.back.kafka;
import java.util.Properties;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
/**
*
* <p>Title: TestKafka</p>
* <p>Description: kafka 生产数据 此为0.9.x的代码方式</p>
* @author back
* @date 2019年9月5日
*/
public class TestKafka {
public static void main(String[] args) throws InterruptedException, ExecutionException {
Properties prop = new Properties();
prop.put("bootstrap.servers", "192.168.231.135:9092");
prop.put("acks", "all");
prop.put("retries", 0);
prop.put("batch.size", 16384);
prop.put("linger.ms", 1);
prop.put("buffer.memory", 33554432);
prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
Producer<String,String> producer = new KafkaProducer<>(prop);
for (char i = 'a'; i < 'z'; i++) {
Thread.sleep(2000);
Future<RecordMetadata> send =
producer.send(new ProducerRecord<String, String>("test","words", String.valueOf(i)+" message"), new Callback() {
@Override
public void onCompletion(RecordMetadata metadata, Exception exception) {
System.out.println("发送成功!");
}
});
}
producer.close();
}
}
2、消费者
package com.back.kafka;
import java.util.Arrays;
import java.util.Properties;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
/**
*
* <p>Title: ConsumeKafka</p>
* <p>Description: 此为0.9.x之后的kafka消费方式</p>
* @author back
* @date 2019年9月6日
*/
public class ConsumeKafka {
public static void main(String[] args) {
Properties prop = new Properties();
prop.put("bootstrap.servers", "192.168.231.135:9092");
prop.put("group.id", "test");
prop.put("enable.auto.commit", "true");
prop.put("auto.commit.interval.ms", "1000");
prop.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
prop.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
KafkaConsumer<String, String> comsumer = new KafkaConsumer<String,String>(prop);
comsumer.subscribe(Arrays.asList("test"));
while(true){
ConsumerRecords<String, String> records = comsumer.poll(100);
for (ConsumerRecord<String, String> consumerRecord : records) {
System.out.printf("offset = %d,key = %s, value = %s%n",consumerRecord.offset()
,consumerRecord.key(),consumerRecord.value());
}
}
}
}