上传 kafka_2.12-2.5.0.tgz 文件到linux服务器上。
解压Kafka压缩包:
tar -xzf kafka_2.12-2.5.0.tgz
进入Kafka目录
cd kafka_2.12-2.5.0
因为Kafka使用了zookeeper,所以我们要先启动zookeeper。如果Linux服务器上没安装过zookeeper,可以直接执行下面的命令:
bin/zookeeper-server-start.sh config/zookeeper.properties
不过,有些时候我们已经在服务器上安装了zookeeper了,所以需要改一下kafka的配置,让它访问已经安装好的zookeeper。打开 kafka 目录下的 config/zookeeper.properties 文件,搜索 zookeeper.connect 配置项,这里可以配置zookeeper的地址和端口号。因为我的服务器上已经安装了zookeeper,并且给zookeeper的zoo.cfg文件配置了 clientPort=8091
,所以我在config/server.properties 中配置了:
# 只改了这一项,其他配置不变
zookeeper.connect=localhost:8091
启动kafka:
bin/kafka-server-start.sh config/server.properties &
创建一个topic
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
查看已经创建的topic:
> bin/kafka-topics.sh --list --bootstrap-server localhost:9092
test
删除已经创建的topic,要确保删除的时候此topic没有被使用:
bin/kafka-topics.sh --delete --bootstrap-server localhost:9092 --topic test
Kfka生产者
Java代码加入生产者Maven依赖:
<dependency>
<groupId>org.apache.kafkagroupId>
<artifactId>kafka-clientsartifactId>
<version>2.5.0version>
dependency>
Kafka 生产者工具类,我是用了SpringBoot 2.1.6
import org.apache.kafka.clients.producer.Callback;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Properties;
/**
* Kafka队列工具类
*/
@Component
public final class KafkaUtils {
protected Logger logger = LoggerFactory.getLogger(getClass());
// 这里你也可以配置到 yml 文件里面,使用 @Value 取值
private String bootstrapServers = "192.168.1.124:9092";
/**
* 发送异步消息
* @param topic kafka话题
* @param key kafka key
* @param value kafka 消息的取值
*/
public void sendAsyncMsg(String topic, String key, String value) {
Properties kafkaProps = new Properties();
kafkaProps.put("bootstrap.servers", bootstrapServers);
kafkaProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
kafkaProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer<String, String> producer = new KafkaProducer<String, String>(kafkaProps);
ProducerRecord<String, String> record = new ProducerRecord<String, String>(topic, key, value);//Topic Key Value
producer.send(record, new Callback() {
@Override
public void onCompletion(RecordMetadata recordMetadata, Exception e) {
if (null != e) {
logger.error("kafka producer error ", e);
}
}
});
}
/**
* 发送异步消息
* @param topic kafka话题
* @param value kafka 消息的取值
*/
public void sendAsyncMsg(String topic, String value) {
sendAsyncMsg(topic, null, value);
}
/**
* 发送异步消息
* @param topic kafka话题
* @param value kafka 消息的对象
*/
public void sendAsyncMsgObj(String topic, Object value) {
sendAsyncMsg(topic, null, JSONUtils.beanToJson(value));
}
}
Kafka消费者
我使用了spring boot。
pom.xml Kafka依赖:
<dependency>
<groupId>org.apache.kafkagroupId>
<artifactId>kafka-clientsartifactId>
<version>2.5.0version>
dependency>
<dependency>
<groupId>org.springframework.kafkagroupId>
<artifactId>spring-kafkaartifactId>
<version>2.5.0.RELEASEversion>
dependency>
同时要确保你的spring boot 版本是 2.3.0.RELEASE
yml 文件需要做如下配置:
spring:
kafka:
consumer:
group-id: yqlwlog
auto-offset-reset: earliest
bootstrap-servers: 192.168.1.124:9092
然后我们编写一个监听类,消费 Kafka 队列中的消息:
package com.centling.consumer.modules.kafka.listener;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
@Component
public class TestListener {
@KafkaListener(topics = {"test"})
public void listenTest(String data) {
System.out.println(data);
}
}
这里要注意,需要先在服务器上启动好 Kafka 服务器,并创建好 topic ,生产者和消费者才能正常使用。