spring boot+kafka+docker的簡易Demo搭建

前言:

博主目前就職於一家外包,開發金融行業的後臺辦公系統,平時接觸到的都是管理系統的開發,對技術要求很低,基本工作內容就是CRUD,所有的技術架構都是行方設定好的,我們外包公司只需要具體的業務系統的功能模塊實現。行內辦公系統現行的技術體系爲Spring cloud,我們就基於這種架構去開發業務系統。由於是微服務架構,就涉及到了服務的監控和治理等功能,sc也有一些相關的框架,admin之類的,具體的博主不太瞭解。只是知道行內現在在日誌處理上使用了ELK(ES、logstash、kibana)的架構,來進行日誌的收集、處理、以及展示,還運用的hadoop、spark等進行數據的處理。博主也是想向此方向去學習,所以在業餘時間開始進行實踐探索。目前僅僅進行到了能把kafka搭建起來並和spring boot聯通的程度。

正文:

廢話這麼多,上代碼。

需要搭建kafka和spring boot的聯通,需要搭建的有:

docker、zookeeper、kafka、spring boot項目

docker:

這個不多說了,根據宿主機環境,自行百度。本人用的windows 10平臺裝的docker,通過cmd窗口即可啓動zk和kafka的鏡像。

zookeeper:

直接使用zookeeper的docker鏡像,命令如下:

docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper

kafka:

也是直接用docker鏡像啓動即可,但是有幾個參數需要注意,先看命令:

docker run  -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=192.168.204.128:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.204.128:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka 

這中間的幾個參數,需要注意的是:

KAFKA_BROKER_ID=0 #這就是kafka集羣的id
KAFKA_ZOOKEEPER_CONNECT=192.168.204.128:2181 #這裏的ip爲zookeeper的ip
KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.204.128:9092 #同上
KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 #這裏0就可以,好像是可以開放ip訪問

如果使用windows 10的docker起的zk,那麼ip可以通過網絡設置中訪問,具體等下再寫一個博客專門說。


截止這裏,環境的搭建都已經完成了。如何測試呢...我使用的方式是直接使用spirng boot寫測試方法。上代碼:

import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.util.concurrent.ListenableFuture;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Classname KafkaController
 * @Description $END
 * @Date 2019/3/10 1:10
 * @Created by Sun
 */
@RestController
@Slf4j
@Api
public class KafkaController {

    @Autowired
    private KafkaTemplate kafkaTemplate;

    @GetMapping(value = "sendMessage")
    public void sendMessage(String message){
        ListenableFuture future = kafkaTemplate.send("test", message);
        future.addCallback(o -> log.info("send-消息發送成功:" + message), throwable -> log.info("消息發送失敗:" + message));
    }
}

maven依賴如下:

        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>1.0.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.12</version>
        </dependency>

其他spring boot相關依賴不再贅述。

還有配置:

spring:
    kafka:
        bootstrap-servers: 10.0.75.1:9092

跑完測試類看到日誌如下:

這裏貼上失敗的日誌,原因是我docker先起kafka後期的zk,導致kafka容器啓動失敗,項目啓動也看不出來沒連上。。。

成功的如下:


至此,消息的發送已經完成。接下來是消息的監聽,監聽配置會多一點點:

spring:
    kafka:
        bootstrap-servers: 10.0.75.1:9092
        consumer:
            bootstrap-servers: 10.0.75.1:9092
            group-id: 0

這個groupid隨便給,但是必須有,kafka的特性。

監聽類:


import lombok.extern.slf4j.Slf4j;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

/**
 * @Classname KafkaListener
 * @Description $END
 * @Date 2019/3/10 1:38
 * @Created by Sun
 */
@Service
@Slf4j
public class KafkaListenerService {

    @KafkaListener(topics = {"test"})
    public void listener(String message){
        log.info("收到消息:"+message);
    }

}

topics:需要和發送時寫的一樣,

接收消息不需要做操作,發送成功後自動觸發。截圖如下:

日誌參數:[app_log-0],app_log爲topics的name,0爲groupid或者broker id。未考證。


至此整個demo已經搭建完成。由於搭建工程中,記錄不全,可能有爲描述到的。可以查看我的參考博客。

參考一:使用docker安裝kafka

參考二:SpringBoot整合SpringKafka實現生產者史上最簡代碼實現

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