原始地址:https://dev.to/subhransu/realtime-chat-app-using-kafka-springboot-reactjs-and-websockets-lc
使用Kafka、Java和SpringBoot构建实时聊天应用程序
本教程将演示如何在Java和SpringBoot作为后端,ReactJS作为前端的情况下,使用Kafka作为消息代理构建一个简单的实时聊天应用程序。
这个项目只是为了学习目的,不包含生产就绪的代码。
什么是Kafka
Apache Kafka是一个广泛流行的分布式消息系统,提供快速、可扩展、高可用的发布-订阅消息系统,用于解决大型软件系统组件之间的通信和集成问题。
Kafka可以用来做什么?
- 消息传递 - 应用程序之间的通信
- 网站活动跟踪(点击、搜索等)
- 度量收集 - 代替写入日志
- 源流和目标流处理
安装
在开始项目之前,我们需要下载Zookeeper和Kafka。
你可以从这里下载Kafka。
将压缩文件的内容解压到你喜欢的文件夹中。
在Kafka目录中,进入bin文件夹。你会找到很多有用于运行Kafka应用程序的bash脚本。
如果你使用的是Windows,你也会在windows文件夹中找到相同的脚本。本教程使用的是Linux命令,但如果您使用的是Microsoft操作系统,则只需使用相应的Windows版本即可。
启动Zookeeper
Zookeeper基本上是用来管理Kafka集群的。它与下载的Kafka目录捆绑在一起,所以我们不需要单独下载它。
要启动Zookeeper,进入bin目录,然后运行以下命令。
./zookeeper-server-start.sh …/config/zookeeper.properties
启动Kafka Broker
接下来,要启动Kafka Broker,请在相同目录中运行以下命令:
./kafka-server-start.sh …/config/server.properties
确保在启动Kafka之前启动zookeeper,因为Kafka从Zookeeper中接收诸如分区中保存的偏移信息等信息。
创建Kafka主题
在分别运行Zookeeper和Apache Kafka之后,我们可以创建一个主题,并作为生产者和消费者发送和接收数据。
kafka-topics --create --topic kafka-chat --zookeeper localhost:2181 --replication-factor 1 --partitions 1
这里我们创建了一个名为kafka-chat的主题来处理聊天消息。我们稍后会在聊天应用程序中使用这个主题。
现在,让我们写些代码。
使用Java、SpringBoot和Kafka开发后端
我们将使用Spring Boot开发后端。
使用以下详细信息使用Spring Initializer下载一个新的Spring Boot项目。
- 项目:Maven项目
- 语言:Java
- 组:com.shubh
- Artifact:kafka-chat-server
- 依赖项:
- Spring for Apache Kafka
- Spring for WebSocket
为什么使用WebSocket?
由于Apache Kafka不能通过经典的GET和POST操作将消费者消息立即发送到客户端。
我使用WebSocket执行了这些操作,它提供了全双工双向通信,这意味着信息可以同时从客户端流向服务器,反之亦然。
它在聊天应用程序中被广泛使用。
首先,我们需要创建一个Message模型,用于保存消息的内容。
Message.java
package com.shubh.kafkachat.model;
public class Message {
private String sender;
private String content;
private String timestamp;
public Message() {
}
public String getTimestamp() {
return timestamp;
}
public void setTimestamp(String timestamp) {
this.timestamp = timestamp;
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public Message(String sender, String content) {
this.sender = sender;
this.content = content;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "Message{" +
"sender='" + sender + '\'' +
", content='" + content + '\'' +
", timestamp='" + timestamp + '\'' +
'}';
}
}
开发Producer将消息推送到Kafka主题
首先,我们需要为Producer编写一个配置类。
ProducerConfiguration.java
@EnableKafka
@Configuration
public class ProducerConfiguration {
@Bean
public ProducerFactory<String, Message> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigurations());
}
@Bean
public Map<String, Object> producerConfigurations() {
Map<String, Object> configurations = new HashMap<>(