Spring Boot 中使用 kafka

搜雲庫技術團隊發表於2017-10-17

Kafka 是一種高吞吐的分散式釋出訂閱訊息系統,能夠替代傳統的訊息佇列用於解耦合資料處理,快取未處理訊息等,同時具有更高的吞吐率,支援分割槽、多副本、冗餘,因此被廣泛用於大規模訊息資料處理應用。Kafka 支援Java 及多種其它語言客戶端,可與Hadoop、Storm、Spark等其它大資料工具結合使用。

準備

環境安裝

搭建高吞吐量 Kafka 分散式釋出訂閱訊息 叢集

測試用例

Github 程式碼

程式碼我已放到 Github ,匯入spring-boot-kafka 專案

github github.com/souyunku/sp…

新增依賴

在專案中新增 kafka-clients 依賴

<dependency>
	<groupId>org.apache.kafka</groupId>
	<artifactId>kafka-clients</artifactId>
	<version>0.10.2.0</version>
</dependency>
<dependency>
	<groupId>org.springframework.kafka</groupId>
	<artifactId>spring-kafka</artifactId>
</dependency>
複製程式碼

啟用 kafka

@Configuration
@EnableKafka
public class KafkaConfiguration {

}
複製程式碼

訊息生產者

@Component
public class MsgProducer {

    private static final Logger log = LoggerFactory.getLogger(MsgProducer.class);

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    public void sendMessage(String topicName, String jsonData) {
        log.info("向kafka推送資料:[{}]", jsonData);
        try {
            kafkaTemplate.send(topicName, jsonData);
        } catch (Exception e) {
            log.error("傳送資料出錯!!!{}{}", topicName, jsonData);
            log.error("傳送資料出錯=====>", e);
        }

        //訊息傳送的監聽器,用於回撥返回資訊
        kafkaTemplate.setProducerListener(new ProducerListener<String, String>() {
            @Override
            public void onSuccess(String topic, Integer partition, String key, String value, RecordMetadata recordMetadata) {
            }

            @Override
            public void onError(String topic, Integer partition, String key, String value, Exception exception) {
            }

            @Override
            public boolean isInterestedInSuccess() {
                log.info("資料傳送完畢");
                return false;
            }
        });
    }

}
複製程式碼

訊息消費者

@Component
public class MsgConsumer {

    @KafkaListener(topics = {"topic-1","topic-2"})
    public void processMessage(String content) {

        System.out.println("訊息被消費"+content);
    }
    
}
複製程式碼

引數配置

application.properties

#kafka
# 指定kafka 代理地址,可以多個
spring.kafka.bootstrap-servers=YZ-PTEST-APP-HADOOP-02:9092,YZ-PTEST-APP-HADOOP-04:9092
# 指定listener 容器中的執行緒數,用於提高併發量
spring.kafka.listener.concurrency=3
# 每次批量傳送訊息的數量
spring.kafka.producer.batch-size=1000
# 指定預設消費者group id
spring.kafka.consumer.group-id=myGroup
# 指定預設topic id
spring.kafka.template.default-topic=topic-1
複製程式碼

啟動服務

@SpringBootApplication
@ComponentScan(value = {"io.ymq.kafka"})
public class Startup {

    public static void main(String[] args) {
        SpringApplication.run(Startup.class, args);
    }
}
複製程式碼

單元測試

import io.ymq.kafka.MsgProducer;
import io.ymq.kafka.run.Startup;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
 * 描述: 測試 kafka
 *
 * @author yanpenglei
 * @create 2017-10-16 18:45
 **/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Startup.class)
public class BaseTest {

    @Autowired
    private MsgProducer msgProducer;

    @Test
    public void test() throws Exception {

        msgProducer.sendMessage("topic-1", "topic--------1");
        msgProducer.sendMessage("topic-2", "topic--------2");
    }
}
複製程式碼

訊息生產者,響應

2017-10-17 15:54:44.814  INFO 2960 --- [           main] io.ymq.kafka.MsgProducer                 : 向kafka推送資料:[topic--------1]
2017-10-17 15:54:44.860  INFO 2960 --- [           main] io.ymq.kafka.MsgProducer                 : 向kafka推送資料:[topic--------2]
2017-10-17 15:54:44.878  INFO 2960 --- [ad | producer-1] io.ymq.kafka.MsgProducer                 : 資料傳送完畢
2017-10-17 15:54:44.878  INFO 2960 --- [ad | producer-1] io.ymq.kafka.MsgProducer                 : 資料傳送完畢
複製程式碼

訊息消費者,響應

訊息被消費topic--------1
訊息被消費topic--------2
複製程式碼

程式碼我已放到 Github ,匯入spring-boot-kafka 專案

github github.com/souyunku/sp…

遇到一些坑

[2017-10-16 19:20:08.340] - 14884 嚴重 [main] --- org.springframework.kafka.support.LoggingProducerListener: Exception thrown when sending a message with key='null' and payload='topic--------2' to topic topic-2:
複製程式碼

經除錯發現 kafka 連線是用的主機名,所以修改 hosts

C:\Windows\System32\drivers\etc\hosts

10.32.32.149 YZ-PTEST-APP-HADOOP-02
10.32.32.154 YZ-PTEST-APP-HADOOP-04
複製程式碼

Contact

  • 作者:鵬磊
  • 出處:www.ymq.io
  • Email:admin@souyunku.com
  • 版權歸作者所有,轉載請註明出處
  • Wechat:關注公眾號,搜雲庫,專注於開發技術的研究與知識分享

關注公眾號-搜雲庫
搜雲庫

相關文章