今天是写博客的第十六天。前面一直在写高并发、链路优化和职场感悟,今天想换个口味,聊聊最近项目里用到的 Kafka。其实我之前对消息队列没什么实际经验,这次因为业务需求,正好趁机好好研究了一下,也踩了不少坑。下面就把我的一些实践过程和心得记录下来,希望能帮到有类似需求的同学。
- Kafka到底是啥?为啥要用它?
简单来说,Kafka 是一个高吞吐、分布式的消息中间件,最常见的用途就是解耦系统、削峰填谷、异步处理任务、数据流转等。比如我们项目里的用户行为埋点、订单异步通知、日志收集等等,都是天然适合用 Kafka 来做的。
为什么不用 RabbitMQ、RocketMQ?其实各有优缺点,这里就不展开了。我们选 Kafka 主要是因为它社区活跃、生态丰富、性能也不错,而且大数据体系里也常用。
- CentOS 下用 Docker 部署 Kafka
说实话,第一次装 Kafka 还是挺头疼的,尤其是依赖 ZooKeeper(虽然新版本支持 KRaft 模式,但生产上还是习惯配 ZooKeeper)。不过现在有 Docker,部署效率高很多。
步骤一:准备环境
假设你已经有了 Docker 和 Docker Compose 环境,没有的话先装好:
# 安装docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
# 安装docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
步骤二:写 docker-compose.yml
直接贴配置,简单明了:
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper:3.4.6
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka:2.12-2.2.1
ports:
- "9092:9092"
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
volumes:
- /var/run/docker.sock:/var/run/docker.sock
把这个文件保存为 docker-compose.yml,然后在同级目录下执行:
docker-compose up -d
- Java 项目中如何用 Kafka?
Kafka 的 Java 客户端其实非常成熟,Spring Boot 里更是开箱即用。这里简单演示下最常见的 Spring Boot 场景。
步骤一:引入依赖
如果你的项目是 Spring Boot,可以直接加如下依赖:
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.8.0</version>
</dependency>
spring:
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: test-group
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
步骤三:写生产者和消费者代码
生产者代码:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
@Service
public class MyKafkaProducer {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void sendMessage(String topic, String msg) {
kafkaTemplate.send(topic, msg);
}
}
消费者代码:
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;
@Service
public class MyKafkaConsumer {
@KafkaListener(topics = "test-topic", groupId = "test-group")
public void listen(String message) {
System.out.println("收到消息:" + message);
}
}
这样配置好后,只要调用 sendMessage(“test-topic”, “hello kafka”) 就能发消息,对应的消费者就会自动收到。
- 实践中的注意事项和小坑
本地和服务器 IP 问题
如果你在本地发消息给服务器上的 Kafka,要确保 KAFKA_ADVERTISED_LISTENERS 用的是外网 IP,不然会连不上。
ZooKeeper版本兼容
不同 Kafka 镜像可能对 ZooKeeper 有版本要求,建议用官方推荐组合。
Topic 创建
默认情况下,Kafka 会自动创建 topic,但建议还是提前手动创建,避免分区数等参数不合理。
docker exec -it kafka_kafka_1 \
kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 3 --topic test-topic
最后的最后,springboot集成kafka 以及一系列相关操作,包括前后端可使用面板,我放在最后啦,大家可以拉下来借鉴一下
https://gitee.com/cheng-lexiang/regular-knowledge.git
1561

被折叠的 条评论
为什么被折叠?



