SpringBoot 搭建並使用Kafka消息中間件

簡介

Kafka 是一種高吞吐的分佈式發佈訂閱消息系統,能夠替代傳統的消息隊列用於解耦合數據處理,緩存未處理消息等,同時具有更高的吞吐率,支持分區、多副本、冗餘,因此被廣泛用於大規模消息數據處理應用。Kafka 支持Java 及多種其它語言客戶端,可與Hadoop、Storm、Spark等其它大數據工具結合使用。

使用Docker安裝kafka和可視化管理界面

這裏我爲了方便使用,將其整理成了一個docker-compose.yml,基於本地安裝,如果需要如下的ip地址可自行更改。
請先確保已有docker和docker-compose環境

version: '2'
services:
  zookeeper-kafka:
    image: zookeeper:3.5
    ports:
      - "2181:2181"
    networks:
      - front
  kafka:
    image: wurstmeister/kafka       ## 鏡像
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1   ## 修改:宿主機IP
      KAFKA_ZOOKEEPER_CONNECT: zookeeper-kafka:2181       ## 卡夫卡運行是基於zookeeper的
    networks:
      - front
    depends_on:
      - zookeeper-kafka
  kafka-manager:  
    image: sheepkiller/kafka-manager                ## 鏡像:開源的web管理kafka集羣的界面
    environment:
        ZK_HOSTS: zookeeper-kafka:2181                   ## 修改:宿主機IP
    ports:  
      - "9000:9000"           ## 暴露端口
    networks:
      - front
    depends_on:
      - zookeeper-kafka
networks:
    front:

安裝啓動命令:

docker-compose up -d

訪問http://localhost:9000,查看kafka的管理界面:

添加zookeeper集羣:

沒問題點擊保存即可。

注意,我是本地搭建的,使用的是docker的內部zookeeper虛擬域名:zookeeper-kafka:2181,而不是127.0.0.1:2181

使用SpringBoot集成Kafka,實現消息的生產和消費。

  1. 導入Jar包,
    compile 'org.springframework.kafka:spring-kafka:2.1.5.RELEASE'
  1. 配置Kafka
# 此處集羣可配置多個
spring.kafka.bootstrap-servers=127.0.0.1:9092
# 生產者配置,指定生產者處理消息的序列化類
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
# 消費者配置,指定消費者處理消息的序列化類,指定組id
spring.kafka.consumer.group-id=myGroup
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
  1. 配置生產者

Springboot以幫我們封裝了對kafka的操作,我們只想使用KafkaTemplate就能簡單輕鬆的操作kafka。

@Component
public class ProductMsg {
    @Autowired
    KafkaTemplate<String, String> kafkaTemplate;
    private Gson gson = new Gson();
    /**
     * 發送向一個主題爲test的隊列發送消息 
     * @throws InterruptedException
     */
    public void sendMessage() throws InterruptedException {
        Message m = new Message();
        m.setId(System.currentTimeMillis());
        m.setMsg(UUID.randomUUID().toString());
        m.setSendTime(new Date());
        System.out.println("1生產了" + m.getMsg());
        Thread.sleep(1000);
        kafkaTemplate.send("test", gson.toJson(m));
    }
}
  1. 配置消費者
    監聽主題爲test的隊列,topics可配置對個主題
@Component
public class ConsumerMsg {
    private Gson gson = new Gson();

    @KafkaListener(topics = {"test"})
    public void processMessage(String content) {
        Message m = gson.fromJson(content, Message.class);
        System.out.println("test1--消費消息:" + m.getMsg());
    }
}

測試消費:

@SpringBootApplication
public class KafkaApplication {
    public static void main(String[] args) throws InterruptedException {
        ApplicationContext app = SpringApplication.run(KafkaApplication.class, args);
        while (true) {
            ProductMsg sender = app.getBean(ProductMsg.class);
            sender.sendMessage();
            sender.sendMessage2();
            Thread.sleep(200);
        }
    }
}

測試結果:

1生產了2648feb0-12d7-419d-a9e1-1b7773d02546
test1--消費消息:2648feb0-12d7-419d-a9e1-1b7773d02546
1生產了2463ea26-2d93-491f-b1f6-4c936700d9b7
test1--消費消息:2463ea26-2d93-491f-b1f6-4c936700d9b7
1生產了9e3fe5a5-58d7-4ca1-9574-431f67766ba9
test1--消費消息:9e3fe5a5-58d7-4ca1-9574-431f67766ba9
1生產了8951ffe8-587e-4956-85e5-7d1a6d453c1a
1生產了11f2a378-b2ff-4faf-87cd-3ab36f368757
test1--消費消息:8951ffe8-587e-4956-85e5-7d1a6d453c1a
test1--消費消息:11f2a378-b2ff-4faf-87cd-3ab36f368757

登錄kafka可視化界面,可看到創建的主題情況:

本例子簡單的使用和搭建了kafka。如果文中有什麼錯誤的,請聯繫我,謝謝。

本例代碼以上傳GITHUB:
https://github.com/liaozihong/SpringBoot-Learning/tree/master/SpringBoot-Kafka

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