Day16|项目实战:Kafka从部署到Java调用的那些事儿

今天是写博客的第十六天。前面一直在写高并发、链路优化和职场感悟,今天想换个口味,聊聊最近项目里用到的 Kafka。其实我之前对消息队列没什么实际经验,这次因为业务需求,正好趁机好好研究了一下,也踩了不少坑。下面就把我的一些实践过程和心得记录下来,希望能帮到有类似需求的同学。

  1. Kafka到底是啥?为啥要用它?
    简单来说,Kafka 是一个高吞吐、分布式的消息中间件,最常见的用途就是解耦系统、削峰填谷、异步处理任务、数据流转等。比如我们项目里的用户行为埋点、订单异步通知、日志收集等等,都是天然适合用 Kafka 来做的。

为什么不用 RabbitMQ、RocketMQ?其实各有优缺点,这里就不展开了。我们选 Kafka 主要是因为它社区活跃、生态丰富、性能也不错,而且大数据体系里也常用。

  1. 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
  1. 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”) 就能发消息,对应的消费者就会自动收到。

  1. 实践中的注意事项和小坑
    本地和服务器 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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值