Broker |
消息中间件处理节点,一个Kafka节点就是一个broker,一个或者多个Broker可以组成一个Kafka集群 |
Topic |
Kafka根据topic对消息进行归类,发布到Kafka集群的每条消息都需要指定一个topic |
Producer |
消息生产者,向Broker发送消息的客户端 |
Consumer |
消息消费者,从Broker读取消息的客户端 |
ConsumerGroup |
每个Consumer属于一个特定的Consumer Group,一条消息可以被多个不同的Consumer Group消费,但是一个Consumer Group中只能有一个Consumer能够消费该消息 |
Partition |
物理上的概念,一个topic可以分为多个partition,每个partition内部消息是有序的 |
kafka可以运行在JVM上,所以需要安装jdk
yum install java-1.8.0-openjdk* -y
kafka使用zookeeper作为注册中心,需要安装zookeeper
wget https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.8/apache-zookeeper-3.5.8-bin.tar.gz
tar -zxvf apache-zookeeper-3.5.8-bin.tar.gz
cd apache-zookeeper-3.5.8-bin
cp conf/zoo_sample.cfg conf/zoo.cfg
启动zookeeper,此处只使用单点部署了,生产环境建议使用集群
bin/zkServer.sh start
bin/zkCli.sh
ls / #查看zk的根目录相关节点
下载安装kafka,也可以使用其他版本。官方下载地址:http://kafka.apache.org/downloads
建议下载编译好的版本,否则还要搭建Scala环境,比较麻烦。
wget https://mirror.bit.edu.cn/apache/kafka/2.4.1/kafka_2.11-2.4.1.tgz
tar -xzf kafka_2.11-2.4.1.tgz
cd kafka_2.11-2.4.1
修改配置
配置目录:config/server.properties
#在kafka集群中id必须唯一
broker.id=0
#kafka内网通讯地址--可以配置机器内网地址
listeners=PLAINTEXT://39.xxx.xx.x:9092
#kafka外网通讯地址(生产环境一般只用内网通讯地址就可以了,docker需要使用外网)
advertised.listeners=PLAINTEXT://39.xxx.xx.x:9092
#kafka数据文件存储目录,多个目录用逗号隔开;
#最少使用原则:一个分区在多个路径或者多台服务器时,最少数据分区优先使用
log.dirs=/usr/local/data/kafka-logs
#默认分区个数,建议与broker数量一致
num.partitions=1
#zk地址,多个地址用逗号分隔
zookeeper.connect=localhost:218
#zk连接超时时间,不易过大
zookeeper.connection.timeout.ms=6000
启动kafka
建议使用守护线程方式启动,指定配置文件路径
./bin/kafka-server-start.sh -daemon config/server.properties
启动完成观察日志没有报错即可。
maven引入
org.springframework.kafka
spring-kafka
yml相关配置
server:
port: 8080
spring:
kafka:
bootstrap-servers: 39.xx.xx.x:9092
producer:
retries: 3
batch-size: 16384
buffer-memory: 33554432
acks: 1
consumer:
group-id: 1
enable-auto-commit: false
auto-offset-reset: earliest
listener:
ack-mode: manual_immediate
生产者代码
/**
* 发送者代码
*
* @author : nzhang
* @since : 1.0
*/
@RestController
@RequestMapping(value = "/kafka")
public class KafkaController {
private final KafkaTemplate kafkaTemplate;
public KafkaController(KafkaTemplate kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
/**
* 发送消息
*
* @param msg 消息内容
* @return 发送结果
*/
@GetMapping(value = "/sendMsg/{msg}")
public String sendMsg(@PathVariable String msg) throws ExecutionException, InterruptedException {
SendResult sendResult = kafkaTemplate.send(
"test", Strings.isBlank(msg)?"我是消息"+ new Random(100):msg)
.get();
System.out.print(sendResult.getProducerRecord().toString());
return "success";
}
}
消费者代码
/**
* 消费者代码
*
* @author : nzhang
* @date : 2020/12/17 15:34
* @since : 1.0
*/
@Component
public class MyConsumer {
/**
* 监听消费消息
*
* @param record 消息内容
* @param ack ack信息
*/
@KafkaListener(topics = "test",groupId = "nzhangGroup")
public void listenNzhangGroup(ConsumerRecord record, Acknowledgment ack) {
String value = record.value();
System.out.println(value);
System.out.println(record);
// 手动提交offset
ack.acknowledge();
}
}
启动工程后 直接访问接口发送消息
http://localhost:8080/kafka/sendMsg/我是消息1
代码git地址:
https://github.com/ayun-alex/kafka-demo.git