springboot2.x整合kafka【详细】

文章目录

  • 一、中间件部署
    • 1. 环境
    • 2. 版本选择依据
    • 3. 解压安装
      • 3.1 zookeeper安装部署
      • 3.2 kafka安装部署
  • 二、springboot整合
    • 1. pom.xml添加依赖
    • 2. application.yml添加kafka配置
    • 3. service下创建kafka文件夹,新建生产者
    • 4. service.kafka文件夹下,新建消费者
    • 5. 测试

一、中间件部署

1. 环境

  • 服务器系统版本:CentOS 7.3.1611
  • zookeeper使用版本:zookeeper-3.4.14
  • kafka使用版本:kafka_2.12-2.3.1

2. 版本选择依据

  • kafka-zookeeper对应版本(最新可参考官网:http://kafka.apache.org/downloads):
    springboot2.x整合kafka【详细】_第1张图片

  • springboot-kafka客户端对应版本(https://spring.io/projects/spring-kafka):
    springboot2.x整合kafka【详细】_第2张图片
    下载地址(多个镜像仓库可选):https://www.apache.org/dyn/closer.cgi?path=/kafka/2.3.1/kafka_2.12-2.3.1.tgz

3. 解压安装

3.1 zookeeper安装部署

  1. 下载并拷贝zookeeper-3.4.14.tar.gz文件到指定目录下(下面假设安装在/home/tools下)

  2. 解压、进入到/home/tools目录执行命令:tar -xvf zookeeper-3.4.14.tar.gz

  3. 解压完成后,cd /home/tools/zookeeper-3.4.14/conf

  4. 拷贝文件、执行命令:cp zoo_sample.cfg zoo.cfg

  5. 创建数据文件夹/data/dataDir和日志文件夹/data/dataLogDir

    cd /home/tools/zookeeper-3.4.14/
    mkdir /data
    mkdir /data/dataDir
    mkdir /data/dataLogDir
    
  6. 编辑zoo.cfg文件,修改dataDir和dataLogDir的路径
    springboot2.x整合kafka【详细】_第3张图片

  7. 启动zookeeper
    执行命令:/home/tools/zookeeper-3.4.14/bin/zkServer.sh start

  8. 扩展:方便起见,为zookeeper设置启动脚本

  • 进入到/etc/rc.d/init.d目录下: cd /etc/rc.d/init.d
  • 新建一个名为zookeeper的文件: touch zookeeper
  • 修改zookeeper内容: vim zookeeper
    注意文件中JAVA_HOME每个机子配置不同,查询命令:echo $JAVA_HOME
    #!/bin/bash
    #chkconfig: 2345 10 90
    #description: service zookeeper
    export JAVA_HOME=/usr/java/jdk1.8.0_181
    export ZOOKEEPER_HOME=/home/tools/zookeeper-3.4.14
    case "$1" in
      start) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh start;;
      start-foreground) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh start-foreground;;
      stop) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh stop;;
      status) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh status;;
      restart) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh restart;;
      upgrade)su root ${ZOOKEEPER_HOME}/bin/zkServer.sh upgrade;;
      print-cmd)su root ${ZOOKEEPER_HOME}/bin/zkServer.sh print-cmd;;
      *) echo "requirestart|start-foreground|stop|status|restart|print-cmd";;
    esac
    
  • 为新建的/etc/rc.d/init.d/zookeeper文件添加可执行权限:chmod +x /etc/rc.d/init.d/zookeeper
  • 把zookeeper这个脚本添加到开机启动项里面: chkconfig --add zookeeper
  • 查看是否添加成功:chkconfig --list
  • 最后就可以执行:service zookeeper start/restart/stop/status 来快速启动、停止

3.2 kafka安装部署

  1. 下载并拷贝kafka_2.12-2.3.1.tgz文件到/home/tools目录下

  2. 在/home/tools目录下解压,执行命令:tar -xvf kafka_2.12-2.3.1.tgz

  3. 进入/home/tools/kafka_2.12-2.3.1/config目录

  4. 编辑server.properties文件
    注意:不修改listeners(本地访问),只修改advertised.listeners(远程访问),否则本地和远程都无法获取数据
    springboot2.x整合kafka【详细】_第4张图片
    修改日志路径:
    springboot2.x整合kafka【详细】_第5张图片
    配置zookeeper:
    springboot2.x整合kafka【详细】_第6张图片

  5. 修改producer.properties和consumer.properties,都只修改地址
    在这里插入图片描述

  6. 前台启动kafka
    执行命令:/home/tools/kafka_2.12-2.3.1/bin/kafka-server-start.sh /home/tools/kafka_2.12-2.3.1/config/server.properties
    查看日志是否报错,如果没有报错可以ctrl+c然后进行后台启动

  7. 后台启动kafka
    执行命令:/home/tools/kafka_2.12-2.3.1/bin/kafka-server-start.sh -daemon /home/tools/kafka_2.12-2.3.1/config/server.properties

  8. 登录zookeeper验证是否连接成功
    cd /home/tools/zookeeper-3.4.14/bin
    ./zkCli.sh -server localhost:2181
    进入zookeeper命令行后执行
    get /brokers/ids/0
    在这里插入图片描述

  9. 创建topic
    /home/tools/kafka_2.12-2.3.1/bin/kafka-topics.sh --create --bootstrap-server ip:9092 --replication-factor 1 --partitions 1 --topic test

  10. 多窗口测试消息收发
    开两个窗口分别 cd /home/tools/kafka_2.12-2.3.1
    一个执行:
    ./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
    在这里插入图片描述
    另一个执行:
    ./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
    在这里插入图片描述
    获取到了数据则说明部署成功。

  11. kafka数据维护

  • 清空指定topic的数据(实测只清空数据,topic不会被删除):./bin/kafka-topics.sh --zookeeper ip:2181 --delete --topic test
  • 清空所有数据,比较麻烦,自行查阅。

二、springboot整合

1. pom.xml添加依赖

<dependency>
    <groupId>org.springframework.kafkagroupId>
    <artifactId>spring-kafkaartifactId>
dependency>

2. application.yml添加kafka配置

spring:
  application:
    name: XXX
  datasource:
    ...#其他配置项
  kafka:
    bootstrap-servers: kafka's-ip:9092
    #=============== provider  =======================
    producer:
      retries: 0
      # 每次批量发送消息的数量
      batch-size: 16384
      buffer-memory: 33554432
      # 指定消息key和消息体的编解码方式,StringSerializer支持Json对象的序列化
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    #=============== consumer  =======================
    # 指定默认消费者group id
    consumer:
      group-id: test-consumer-group
      auto-offset-reset: earliest
      enable-auto-commit: true
      auto-commit-interval: 100
      # 指定消息key和消息体的编解码方式,StringDeserializer支持Json对象的反序列化
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

3. service下创建kafka文件夹,新建生产者

@Component
public class KafkaProducer {

    private static Logger logger = LoggerFactory.getLogger(KafkaProducer.class);

    @Resource
    private KafkaTemplate<String, String> kafkaTemplate;

    private Gson gson = new GsonBuilder().create();

    //发送消息方法
    public void send() {
        for(int i=0;i<5;i++){
            Message message = new Message();
            message.setId(System.currentTimeMillis());
            message.setMsg(UUID.randomUUID().toString()+ "---" +i);
            message.setSendTime(new Date());
            logger.info("发送消息 => message = {}", gson.toJson(message));
            kafkaTemplate.send("test", gson.toJson(message));
        }
    }
}

其中的Message对象如下:

//@Data使用了lombok,也可以手动写get/set
@Data
public class Message {

    private long id;

    private String msg;

    private Date sendTime;
}

4. service.kafka文件夹下,新建消费者

@Component
public class KafkaReceiver {

    private static Logger logger = LoggerFactory.getLogger(KafkaReceiver.class);

    @KafkaListener(topics = {"test"})
    public void listen(ConsumerRecord<?, ?> record) {
        Optional<?> kafkaMessage = Optional.ofNullable(record.value());
        if (kafkaMessage.isPresent()) {
            Object message = kafkaMessage.get();
            logger.info("----------------- record =" + record);
            logger.info("----------------- message =" + message);
            Gson gson = new GsonBuilder().create();
            Message msg = gson.fromJson(message.toString(), Message.class);
            System.out.println("content => "+msg.getMsg());
        }
    }
}

注意:上面两段代码中的 topics 均对应第一节中在中间件所在服务器创建的 topic

5. 测试

可以在服务器创建消息,也可以在本地项目中调用 producer.send() 方法测试。
springboot2.x整合kafka【详细】_第7张图片
在这里插入图片描述
在这里插入图片描述
完毕!

你可能感兴趣的:(Java,Spring,java,kafka,zookeeper,中间件)