一、前言
Kafka是什麼?
- Kafka是一種
高吞吐量
的分佈式
發佈訂閱消息系統
,可以處理消費者在網站中的所有動作流數據。 - 目的:通過Hadoop的並行加載機制來統一線上和離線的消息處理,也是爲了通過集羣來提供實時的消息。
環境
- springboot
- idea
- docker-compose
- zookeeper
- kafka
- kafka-manager
二、docker-compose安裝kafka
1. docker-compose-kafka.yml
version: '3'
services:
zookepper:
image: wurstmeister/zookeeper # 原鏡像`wurstmeister/zookeeper`
container_name: zookeeper_server # 容器名爲'zookeeper_server'
restart: always # 指定容器退出後的重啓策略爲始終重啓
volumes: # 數據卷掛載路徑設置,將本機目錄映射到容器目錄
- "/etc/localtime:/etc/localtime"
ports: # 映射端口
- "2181:2181"
kafka:
image: wurstmeister/kafka # 原鏡像`wurstmeister/kafka`
container_name: kafka_server # 容器名爲'kafka_server'
restart: always # 指定容器退出後的重啓策略爲始終重啓
volumes: # 數據卷掛載路徑設置,將本機目錄映射到容器目錄
- "/etc/localtime:/etc/localtime"
environment: # 設置環境變量,相當於docker run命令中的-e
KAFKA_ADVERTISED_HOST_NAME: www.zhengqingya.com # TODO 本機IP
KAFKA_ADVERTISED_PORT: 9092 # 端口
KAFKA_BROKER_ID: 0 # 在kafka集羣中,每個kafka都有一個BROKER_ID來區分自己
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://www.zhengqingya.com:9092 # TODO 將kafka的地址端口註冊給zookeeper
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092 # 配置kafka的監聽端口
KAFKA_ZOOKEEPER_CONNECT: www.zhengqingya.com:2181 # TODO zookeeper地址
KAFKA_CREATE_TOPICS: "hello_world"
ports: # 映射端口
- "9092:9092"
depends_on: # 解決容器依賴啓動先後問題
- zookepper
kafka-manager:
image: sheepkiller/kafka-manager # 原鏡像`sheepkiller/kafka-manager`
container_name: kafka-manager # 容器名爲'kafka-manager'
restart: always # 指定容器退出後的重啓策略爲始終重啓
environment: # 設置環境變量,相當於docker run命令中的-e
ZK_HOSTS: www.zhengqingya.com:2181 # TODO zookeeper地址
APPLICATION_SECRET: zhengqing
KAFKA_MANAGER_AUTH_ENABLED: "true" # 開啓kafka-manager權限校驗
KAFKA_MANAGER_USERNAME: admin # 登陸賬戶
KAFKA_MANAGER_PASSWORD: 123456 # 登陸密碼
ports: # 映射端口
- "9001:9000"
depends_on: # 解決容器依賴啓動先後問題
- kafka
2. 運行
docker-compose -f docker-compose-kafka.yml -p kafka up -d
3. kafka-manager
(kafka集羣管理工具)
訪問ip:9001
溫馨小提示:下面只是簡單使用,更多可自行查詢資料瞭解
① 新建Cluster: 點擊Cluster
-> Add Cluster
Save保存時出現如下提示至少爲2,修改一下默認值爲2即可~
② 查看topic
三、SpringBoot整合Kafka
① pom.xml
中引入依賴
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
② application.yml
中配置kafka
spring:
# ======================== ↓↓↓↓↓↓ kafka相關配置 ↓↓↓↓↓↓ ===============================
kafka:
bootstrap-servers: www.zhengqingya.com:9092 # 指定kafka server地址,集羣(多個逗號分隔)
producer:
# 指定消息key和消息體的編解碼方式
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
# 寫入失敗時,重試次數。當leader節點失效,一個repli節點會替代成爲leader節點,此時可能出現寫入失敗,
# 當retris爲0時,produce不會重複。retirs重發,此時repli節點完全成爲leader節點,不會產生消息丟失。
retries: 0
# 每次批量發送消息的數量,produce積累到一定數據,一次發送
batch-size: 16384
# produce積累數據一次發送,緩存大小達到buffer.memory就發送數據
buffer-memory: 33554432
consumer:
group-id: default_consumer_group # 指定默認消費者 羣組ID
enable-auto-commit: true
auto-commit-interval: 1000
# procedure要求leader在考慮完成請求之前收到的確認數,用於控制發送記錄在服務端的持久化,其值可以爲如下:
# acks = 0 如果設置爲零,則生產者將不會等待來自服務器的任何確認,該記錄將立即添加到套接字緩衝區並視爲已發送。在這種情況下,無法保證服務器已收到記錄,並且重試配置將不會生效(因爲客戶端通常不會知道任何故障),爲每條記錄返回的偏移量始終設置爲-1。
# acks = 1 這意味着leader會將記錄寫入其本地日誌,但無需等待所有副本服務器的完全確認即可做出迴應,在這種情況下,如果leader在確認記錄後立即失敗,但在將數據複製到所有的副本服務器之前,則記錄將會丟失。
# acks = all 這意味着leader將等待完整的同步副本集以確認記錄,這保證了只要至少一個同步副本服務器仍然存活,記錄就不會丟失,這是最強有力的保證,這相當於acks = -1的設置。
# 可以設置的值爲:all, -1, 0, 1
acks: 1
# 指定消息key和消息體的編解碼方式
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
③ 生產者 - 發送消息
@RestController
@RequestMapping("/api/")
public class Producer {
@Autowired
private KafkaTemplate<String, Object> kafkaTemplate;
@RequestMapping("send")
public String send(String msg) {
kafkaTemplate.send("hello", msg);
return "SUCCESS";
}
}
④ 消費者 - 接收消息
@Slf4j
@Component
public class Consumer {
@KafkaListener(topics = "hello")
public void listen(ConsumerRecord<?, ?> record) {
log.info("topic: " + record.topic() + " <|============|> 消息內容:" + record.value());
}
}
四、測試
① 調用接口發送消息:http://127.0.0.1/api/send?msg=hello,kafka
② 查看控制檯打印日誌信息: