项目的DEMO代码:https://github.com/heyu52/-spring-cloud
以下介绍来自百度百科
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
特性
Kafka 是一种高吞吐量的分布式发布订阅消息系统,有如下特性:
- 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能。
- 高吞吐量 :即使是非常普通的硬件Kafka也可以支持每秒数百万 的消息。
- 支持通过Kafka服务器和消费机集群来分区消息。
- 支持Hadoop并行数据加载。
- 可扩展性:kafka集群支持热扩展
术语介绍
- Broker
Kafka集群包含一个或多个服务器,这种服务器被称为broker - Topic
每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处) - Partition
Partition是物理上的概念,每个Topic包含一个或多个Partition - Producer
负责发布消息到Kafka broker - Consumer
消息消费者,向Kafka broker读取消息的客户端。 - Consumer Group
每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。
安装zookeeper
kafka是依赖于zookeeper的,所以,我们要先安装zookeeper:https://hub.docker.com/_/zookeeper
docker pull zookeeper
启动zookeeper
docker run --name some-zookeeper -p 2181:2181 --restart always -d zookeeper
安装kafak
kafak没有官方的docker镜像,我们直接下载安装就好了:http://kafka.apache.org/quickstart
具体的安装及测试,请参考这个地址就可以了。
下载解压
tar -xzf kafka_2.12-2.3.0.tgz
cd kafka_2.12-2.3.0
启动服务
bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties
创建Topic
新打开一个终端
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
查看Topic
bin/kafka-topics.sh --list --bootstrap-server localhost:9092
启动成功
测试发送消息
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
输入两个消息
This is a message
This is another message
消费消息
bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
测试成功。
添加端口开放
添加指定需要开放的端口:
firewall-cmd --add-port=9092/tcp --permanent
重载入添加的端口:
firewall-cmd --reload
查询指定端口是否开启成功:
firewall-cmd --query-port=9092/tcp
查看GroupID
打开config目录下的consumer.properties
IP配置
打开打开config目录下的server.properties,按以下修改为本机IP
创建项目
创建消息发送者
package com.csdn.demo.Sender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class MySender {
@Resource
KafkaTemplate kafkaTemplate;
public void send() {
//发送消息
String msgKey="msgkey";
String message="消息内容";
kafkaTemplate.send("test", 0,msgKey,message);
System.out.println( "这是发送的消息:"+message);
}
}
创建消息接收者
package com.csdn.demo.Receiver;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
@Component
public class MyReceiver {
@KafkaListener(topics = {"test"})
public void registryReceiver(ConsumerRecord<Integer, String> integerStringConsumerRecords) {
System.out.println( "这是接收到的消息:"+ integerStringConsumerRecords.value());
}
}
@KafkaListener(topics = {“test”})参看前面创建的Topic
创建测试Controller
package com.csdn.demo.Web;
import com.csdn.demo.Sender.MySender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MyController {
@Autowired
private MySender sender;
@RequestMapping("/mySend")
public void mySend() throws Exception {
sender.send();
}
}
配置
#kafka默认消费者配置
spring.kafka.consumer.bootstrap-servers=192.168.0.123:9092
#参看查看GroupID
spring.kafka.consumer.group-id=test-consumer-group
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-commit-interval=100
spring.kafka.consumer.properties.max.partition.fetch.bytes=2097152
#kafka默认生产者配置
spring.kafka.producer.bootstrap-servers=192.168.0.123:9092
spring.kafka.producer.retries=1
spring.kafka.producer.batch-size=16384
spring.kafka.producer.buffer-memory=33554432
spring.kafka.producer.properties.max.requst.size=2097152
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
测试
浏览器输入地址:http://127.0.0.1:8080/mySend
测试成功。