kafka的单机搭建与springboot快速集成

一、kakfa相关术语

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

 启动完成观察日志没有报错即可。

三、Springboot快速集成

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

 

 

 

你可能感兴趣的:(中间件)