Spring Boot2.x 集成kafka (windows集成環境+實例講解)

學習kafka,這一篇文章帶你入門。

1. windows集成環境搭建

1.1 java8安裝

這個不用詳解了吧,既然學習這篇文章,我相信都是已經會安裝java的,實在沒有安裝過的,找度娘吧。

1.2 zookeeper安裝

由於Kafka的運行依賴於Zookeeper,所以在運行Kafka之前需要安裝並運行Zookeeper

1.2.1 下載zookeeper

Zookeeper下載路徑:http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.7/ 如上圖所示。
在這裏插入圖片描述

1.2.2 安裝並修改zoo.cfg配置文件

1.解壓到文件下(我的目錄是  D:\webserver\apache-zookeeper-3.5.7-bin),我習慣修改目錄名稱爲:apache-zookeeper-3.5.7

2.打開D:\webserver\apache-zookeeper-3.5.7\conf,複製zoo_sample.cfg重命名成zoo.cfg

3.編輯zoo.cfg,修改dataDir爲【dataDir=D:\webserver\apache-zookeeper-3.5.7\data】,
 在D:\webserver\apache-zookeeper-3.5.7目錄下創建data目錄。

//zookeeper默認用的是8080端口,和tomcat的默認端口衝突,因此這個地方最好修改。
在文件的最後增加一行:admin.serverPort=8888

1.2.3 設置zookeeper環境變量

 ZOOKEEPER_HOME          D:\webserver\apache-zookeeper-3.5.7
 Path 在現有的值後面添加     %ZOOKEEPER_HOME%\bin

如圖所示:
在這裏插入圖片描述
在這裏插入圖片描述

1.2.4 驗證安裝是否成功

打開cmd,輸入zkServer.cmd,運行如下:
在這裏插入圖片描述
說明運行成功了。

1.3 kafka安裝

1.3.1 下載kafka

Kafka下載路徑 http://kafka.apache.org/downloads
在這裏插入圖片描述
在這裏插入圖片描述

1.3.2 解壓

.解壓文件kafka_2.13-2.4.0.tgz(我的目錄是D:\webserver\kafka_2.13-2.4.0 【這裏不要在Program Files等文件名之間有空格的目錄下,不然一會執行會不識別路徑】

1.3.3 修改server.properties配置文件

打開目錄D:\webserver\kafka_2.13-2.4.0\config下server.properties文件,把log.dirs修改爲:log.dirs=D:\webserver\kafka_2.13-2.4.0\kafka-logs

1.3.4 啓動kafka服務

打開命令窗口cmd,進入目錄D:\webserver\kafka_2.13-2.4.0

在這裏插入圖片描述
執行以下命令,啓動kafka通訊的服務器:.\bin\windows\kafka-server-start.bat .\config\server.properties
在這裏插入圖片描述
如上圖所示,kafka啓動成功!!!其中包括了版本、啓動時間等信息。

1.3.5 測試

1.3.5.1 創建主題

進入kafka文件目錄D:\webserver\kafka_2.13-2.4.0\bin\windows,創建kafka的消息topics

kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic testDemo

執行後:如圖所示,執行成功。
在這裏插入圖片描述

1.3.5.2 創建生產者Producer和Consumer

分別打開兩個cmd窗口,進入目錄D:\webserver\kafka_2.13-2.4.0\bin\windows,創建Producer和Consumer

cmd窗口1: Producer:

kafka-console-producer.bat --broker-list localhost:9092 --topic testDemo

在這裏插入圖片描述

cmd窗口2: Consumer:
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic testDemo
在這裏插入圖片描述
注意:kafka-console-consumer.bat --zookeeper localhost:2181 --topic testDemo 這個方法已經過時了不能再用

1.3.5.3 用自帶腳本進行測試

然後就可以在Producer中發信息,在Consumer中收信息了
在Producer窗口輸入:hello binge
然後觀察Consumer窗口是否能收到信息。
在這裏插入圖片描述
測試完成了,說明kafka安裝成功。

2. SpringBoot2.x 整合kafka

2.1 添加maven依賴

pom文件需要增加對kafka的依賴,如下:

<dependency>
      <groupId>org.springframework.kafka</groupId>
      <artifactId>spring-kafka</artifactId>
  </dependency>
  <dependency>
      <groupId>org.apache.kafka</groupId>
      <artifactId>kafka-clients</artifactId>
  </dependency>

Springboot 已經爲我們配置了版本號,此處不用自己引用,如果引用的不正確,會造成版本兼容問題。我就遇到過這樣的坑。

2.2 yml配置kafka信息

配置文件增加如下kafka相關信息:

  kafka:
    bootstrap-servers: 127.0.0.1:9092
    producer:
      retries: 0
      batch-size: 16384
      buffer-memory: 33554432
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
      properties:
        linger.ms: 1
    consumer:
      enable-auto-commit: false
      auto-commit-interval: 100ms
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      properties:
        session.timeout.ms: 15000

kafka:
  topic:
    group-id: topicGroupId
    topic-name: testDemo

第一部分屬性是Spring Kafka配置:
第二部分是特定於應用程序的自定義配置。我們定義Kafka主題名稱及組ID

2.3 編寫kafka配置類

2.3.1 首先編寫屬性讀取文件KafkaTopicProperties

package com.ieslab.powergrid.demosvr.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.io.Serializable;

@ConfigurationProperties("kafka.topic")
public class KafkaTopicProperties implements Serializable {

    private String groupId;
    private String topicName;

    public String getGroupId() {
        return groupId;
    }

    public void setGroupId(String groupId) {
        this.groupId = groupId;
    }

    public String getTopicName() {
        return topicName;
    }

    public void setTopicName(String topicName) {
        this.topicName = topicName;
    }
}

此類負責讀取配置文件中,第二部分,我們特定於應用程序的自定義配置。

2.3.2 編寫kafka配置類KafkaTopicConfiguration

把屬性文件的屬性在配置類中生效。

package com.ieslab.powergrid.demosvr.config;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(KafkaTopicProperties.class)
public class KafkaTopicConfiguration {
    private final KafkaTopicProperties properties;

    public KafkaTopicConfiguration(KafkaTopicProperties properties) {
        this.properties = properties;
    }

    @Bean
    public String kafkaTopicName() {
        return properties.getTopicName();
    }

    @Bean
    public String topicGroupId() {
        return properties.getGroupId();
    }
}

2.4 編寫生產者和消費者類

爲了方便,我們在同一個程序編寫生產者和消費者類。創建KafkaTestService

package com.ieslab.powergrid.demosvr.service;

import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Service;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.util.concurrent.ListenableFutureCallback;

@Service
@Slf4j
public class KafkaTestService {
    private final KafkaTemplate<Integer, String> kafkaTemplate;

    /**
     * 注入KafkaTemplate
     * @param kafkaTemplate kafka模版類
     */
    @Autowired
    public KafkaTestService(KafkaTemplate kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }


    @KafkaListener(topics = "#{kafkaTopicName}", groupId = "#{topicGroupId}")
    public void processMessage(ConsumerRecord<Integer, String> record) {
        log.info("kafka processMessage start");
        log.info("processMessage, topic = {}, msg = {}", record.topic(), record.value());
        // do something ...
        log.info("kafka processMessage end");
    }

    public void sendMessage(String topic, String data) {
        log.info("kafka sendMessage start");
        ListenableFuture<SendResult<Integer, String>> future = kafkaTemplate.send(topic, data);
        future.addCallback(new ListenableFutureCallback<SendResult<Integer, String>>() {
            @Override
            public void onFailure(Throwable ex) {
                log.error("kafka sendMessage error, ex = {}, topic = {}, data = {}", ex, topic, data);
            }

            @Override
            public void onSuccess(SendResult<Integer, String> result) {
                log.info("kafka sendMessage success topic = {}, data = {}",topic, data);
            }
        });
        log.info("kafka sendMessage end");
    }
}

這是一個service類,其中sendMessage(String topic, String data) 負責發送消息。processMessage函數添加了@KafkaListener註解,表明這是個監聽方法。在註解內指定topic名稱,當對應的topic內有新的消息時,processMessage方法會被調用,參數就是topic內新的消息。這個過程是異步進行的。

2.5 編寫controller類

TestController類:

@Controller
@RequestMapping("/api")
@Api(tags="RequestParam用法測試接口類")
public class TestController {
    @Autowired
    KafkaTestService kafkaTestService;
    /**
     * 測試自定義監聽器入口方法
     * @return 當前人數信息
     */
    @GetMapping("/testKafka")
    @ResponseBody
    public String testKafka(String name) {
        kafkaTestService.sendMessage("testDemo",name);
        return name;
    }
}

2.6 瀏覽器輸入測試

訪問:http://localhost:8080/api/testKafka?name=houpeibin333
查看控制檯日誌:
在這裏插入圖片描述

同時,cmd窗口2: Consumer:
kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic testDemo 中,應該也可以收到信息:
在這裏插入圖片描述

3. 問題:zookeeper沒有用到嗎?

到這裏,我們發現一個問題,zookeeper我們沒有用到,爲什麼還要安裝呢?
其實kafka服務在啓動時已經用到了:在kafka/config/server.properties配置文件中,有這麼一行配置:zookeeper.connect=localhost:2181 配置了連接zookeeper的地址,如果zookeeper運行在別的服務器上,這個地方就需要修改。

當生產者和消費者運行在不同的機器上時,他們都是向zookeeper進行註冊的,這樣我們在訂閱消息時,只需要向zookeeper註冊即可,就不用把生產者的ip寫死了。

4.總結

本文介紹了kafka windows集成環境的安裝,用實例講解了Springboot的集成方法,但是隻是入門知識,後續會有專門文章講解kafka在項目中的實戰應用,請您關注本博客,謝謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章