一、 linux部署kafka
安装前要确保已经安装jdk,可参考我之前的文章
1. 下载kafka安装包(我自己是安装的2.5版本)
2. 解压到linux服务器的文件夹中
# tar -zxvf kafka_2.12-2.5.0.tgz
解压后的文件夹内容如下
[root@hecs-170265 kafka_2.12-2.5.0]# ls
bin config libs LICENSE logs NOTICE site-docs
3.进入config文件夹,修改zookeeper.properties 和server.properties
修改zookeeper.properties中的
dataDir=/opt/data/zookeeper #自己定义,先建一个这个文件夹
clientPort=2181 #zk的端口,我这里没有修改
修改server.properties中的
listeners=PLAINTEXT://自己服务器的ip:9092
advertised.listeners=PLAINTEXT://公网ip:9092 #我自己使用的是华为云服务器 需要配置这个代理地址,这个ip配的是对外的公网ip,之前没有配置会出现服务器kafka正常,java项目无法连接的情况
log.dirs=/data/kafka-logs #同dataDir
zookeeper.connect=localhost:2181 #这个端口就是你配置的zk端口
自己服务器ip可以使用ifconfig查看
4. 启动zookeeper
在bin文件夹下执行
./zookeeper-server-start.sh -daemon ../config/zookeeper.properties
5. 启动kafka
在bin文件夹下执行
./kafka-server-start.sh -daemon ../config/server.properties
6. 校验
输入netstat -tln命令查看kafka和zk端口是否启用
也可以本地测试下
bin文件夹下创建一个topic
./kafka-topics.sh --create --topic test-events --bootstrap-server 服务器ip:9092
创建一个生产者
./kafka-console-producer.sh --topic test-events --bootstrap-server
再开一个端口创建一个消费者
./kafka-console-consumer.sh --topic test-events --bootstrap-server
生产者输入消息,消费组那边打印就说明没问题
7. 注意事项
查看防火墙是否打开kafka和zk端口,如果是云服务器查看安全组是否打开对应端口
二、 springboot集成kafka
1. 引入依赖
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
2. 配置文件
spring.kafka.bootstrap-servers=服务器ip:9092
spring.kafka.listener.concurrency=3
spring.kafka.listener.ack-mode=manual
spring.kafka.producer.retries=1
spring.kafka.producer.acks=all
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.consumer.group-id=${spring.application.name}
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=false
spring.kafka.consumer.auto-commit-interval=5
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
3. 生产者
@Autowired
KafkaTemplate<String, String> kafkaTemplate;
@PostMapping("register")
public void useKafka() {
String data="要发送的数据";
kafkaTemplate.send("test-events", data).addCallback(success -> {
// 消息发送到的topic
String topic = success.getRecordMetadata().topic();
// 消息发送到的分区
int partition = success.getRecordMetadata().partition();
// 消息在分区内的offset
long offset = success.getRecordMetadata().offset();
log.info("发送消息成功:" + topic + "-" + partition + "-" + offset + "-" + data);
}, failure -> {
log.info("发送消息失败:" + failure.getMessage());
});
}
4. 消费者
@KafkaListener(topics = "test-events")
public void listen(ConsumerRecord<?, ?> record, Acknowledgment ack) throws IOException {
try {
System.out.println("process:" + record.topic() + record.partition() + record.toString());
}catch (Exception e){
}finally {
ack.acknowledge();
}
}