學習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
在項目中的實戰應用,請您關注本博客,謝謝!!!