簡介
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,實現消息的生產和消費。
- 導入Jar包,
compile 'org.springframework.kafka:spring-kafka:2.1.5.RELEASE'
- 配置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
- 配置生產者
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));
}
}
- 配置消費者
監聽主題爲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