SpringBoot(26) 整合 Kafka

一、前言

Kafka是什麼?

  1. Kafka是一種高吞吐量分佈式發佈訂閱消息系統,可以處理消費者在網站中的所有動作流數據。
  2. 目的:通過Hadoop的並行加載機制來統一線上和離線的消息處理,也是爲了通過集羣來提供實時的消息。

環境

  1. springboot
  2. idea
  3. docker-compose
  4. zookeeper
  5. kafka
  6. 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

② 查看控制檯打印日誌信息:
在這裏插入圖片描述


本文案例demo源碼

https://gitee.com/zhengqingya/java-workspace

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