springboot集成kafka

本篇文章纯粹学习笔记,不要喷我

  1. 版本 springboot是2.5.3,kafka是kafka_2.12-2.8.0
    开始之前准备好环境 ,本次试验kafka是运行在centos7上面的。
    安装启动配置可以参考这个网址。
    我搭建的是kafka集群。使用的多配置文件启动的方式。
    springboot项目实际上是微服务,两个消费者,一个生产者。项目地址码云上面自己下的
    2.在centos7中启动zookeeper,zookeeper的配置文件,不需要什么改动。
    然后启动kafka,参照上面给出的教程配了复制了三个配置文件,然后启动。
    server.properties中的listeners=PLAINTEXT://192.168.149.128:9092
    如果写localhost不能正常启动就写ip,可以用ip addr查看自己的ip
    3.需要注意,一定要把防火墙先关了,如果是云服务器就把对应的端口放开。
    4.前三步准备好之后,打开从码云下载的项目。
    打开以后先看配置
    这是生产者的微服务配置文件
server.port=8701

spring.application.name=springboot-kafka-producer

# kafka配置
spring.kafka.bootstrap-servers=192.168.149.128:9092

#spring.kafka.listener.concurrency=2
# 若设置大于0的值,客户端会将发送失败的记录重新发送
spring.kafka.producer.retries=0
# #当将多个记录被发送到同一个分区时, Producer 将尝试将记录组合到更少的请求中。这有助于提升客户端和服务器端的性能。这个配置控制一个批次的默认大小(以字节为单位)。16384是缺省的配置
spring.kafka.producer.batch-size=16384
#Producer 用来缓冲等待被发送到服务器的记录的总字节数,33554432是缺省配置
spring.kafka.producer.buffer-memory=33554432
# 关键字的序列化类
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
# 值的序列化类
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer

@Slf4j
@Component
public class MyProducer {

    private final KafkaTemplate<String, String> kafkaTemplate;

    //构造器方式注入 kafkaTemplate
    public MyProducer(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    private final Gson gson = new GsonBuilder().create();

    public void send(String msg) {
        for (int i = 0; i < 1000; i++) {
            Message message = new Message();

            message.setId(Long.valueOf(i + ""));
            message.setMsg(msg);
            message.setTime(DateUtil.now());
            //对 topic = hello2 的发送消息
            //topic-spring-1 是在kafka中创建的主题的名字
            //如果kafka中已经存在这个主题 就没法添加进去
            kafkaTemplate.send("test1", gson.toJson(message));
        }
    }

}

5.然后看消费者的配置

server.port=8702

spring.application.name=springboot-kafka-consumer

# kafka配置
spring.kafka.bootstrap-servers=192.168.149.128:9092
//.group-id 需要注意这个配置项
spring.kafka.consumer.group-id=spring-kafka-consumer1
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-commit-interval=100ms
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
//表示读所有的消息
spring.kafka.consumer.auto-offset-reset=earliest


@Component
public class MyConsumer {

    @KafkaListener(topics = "test1")
    public void onMessage(ConsumerRecord<Integer, String> record) {
        System.out.println("Consumer1-消费者收到的消息:" + record.value());
    }

}

这里主要就是@KafkaListener这个注解了 topics就是对应的话题的名字
可以传入一个数组,多个存在的话题的名字,

    @KafkaListener(topics = {"test1","test"})
    public void onMessage(ConsumerRecord<Integer, String> record) {
        System.out.println("Consumer1-消费者收到的消息:" + record.value());
    }

这样就可以拿到test 和test1之中产生的数据
6.之前提到的需要注意的两个配置项
spring.kafka.consumer.auto-offset-reset=earliest
将偏移量自动重置为最早的偏移量,我的理解就是从头开始读取
spring.kafka.consumer.group-id=spring-kafka-consumer
group-id这个配置项
如果group-id相同,就是在一个消费者组,在案例中如果把group改为不同的,那么订阅的同一个topic的主题,会分别被这俩consumer消费到。
如果group-id相同,那就只能被一个consumer消费到。

本篇为学习笔记,需要感谢的人,在上面引用的两个地址里。

你可能感兴趣的:(kafka,kafka,java,spring,boot)