SpringBoot集成kafka配置使用(一)

目录

1、pom文件的引入

2、kafkaConfig

3、消息的生产者(KafkaSender)

4、消息的消费者(KafkaReceiver)

5、yml配置文件

6、使用(so easy)


项目中原版使用的是rocketmq,由于客户那边用的是kafka。先把中间件更换长kafka,步入正题:

1、pom文件的引入

        <!--    kafka    -->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>

2、kafkaConfig

package com.wlsj.gxdc.config;

import org.springframework.boot.autoconfigure.kafka.ConcurrentKafkaListenerContainerFactoryConfigurer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.listener.DeadLetterPublishingRecoverer;
import org.springframework.kafka.listener.SeekToCurrentErrorHandler;
import org.springframework.util.backoff.FixedBackOff;

@Configuration
public class KafkaConfig {

    @Bean
    public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory(
            ConcurrentKafkaListenerContainerFactoryConfigurer configurer,
            ConsumerFactory<Object, Object> kafkaConsumerFactory,
            KafkaTemplate<Object, Object> template) {
        ConcurrentKafkaListenerContainerFactory<Object, Object> factory = new ConcurrentKafkaListenerContainerFactory<>();
        configurer.configure(factory, kafkaConsumerFactory);
        factory.setErrorHandler(new SeekToCurrentErrorHandler(
                new DeadLetterPublishingRecoverer(template), new FixedBackOff(0L, 2))); // dead-letter after 3 tries
        return factory;
    }


}

3、消息的生产者(KafkaSender)

package com.wlsj.gxdc.kafka;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class KafkaSender {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    //异步发送消息方法
    public void sendAsynchronize(String topic, String message) {
        kafkaTemplate.send(topic, message);
    }

    //同步发送消息方法
    public void sendSynchronize(String topic, String message) throws Exception {
        kafkaTemplate.send(topic, message).get();

    }

}

4、消息的消费者(KafkaReceiver)

package com.wlsj.gxdc.kafka;

import com.alibaba.fastjson.JSONObject;
import com.wlsj.gxdc.entity.Bicycle;
import com.wlsj.gxdc.entity.BicyclePosition;
import com.wlsj.gxdc.service.IBicyclePositionService;
import com.wlsj.gxdc.service.IBicycleService;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Slf4j
@Component
public class KafkaReceiver {
    @Autowired
    private IBicyclePositionService bicyclePositionService;
    @Autowired
    private IBicycleService bicycleService;

    @KafkaListener(topics = {"${kafka.topic.bicycle_topic}"})
    public void listen1(ConsumerRecord<?, ?> record) {
        Optional<?> kafkaMessage = Optional.ofNullable(record.value());
        if (kafkaMessage.isPresent()) {
            Object message = kafkaMessage.get();
            JSONObject jsonObject = JSONObject.parseObject(message.toString());
            if (null != jsonObject) {
                Bicycle bicycle = JSONObject.toJavaObject(jsonObject, Bicycle.class);
                try {
                    bicycleService.save(bicycle);
                } catch (Exception e) {
                    log.info(e.getMessage());
                }
            }
            log.info("kafka车辆备案消息:{}", message);
            log.info("----------------- record =" + record);
        }

    }

    @KafkaListener(topics = {"${kafka.topic.bicycle_position_topic}"})
    public void listen2(ConsumerRecord<?, ?> record) {
        Optional<?> kafkaMessage = Optional.ofNullable(record.value());
        if (kafkaMessage.isPresent()) {
            Object message = kafkaMessage.get();
            JSONObject jsonObject = JSONObject.parseObject(message.toString());
            if (null != jsonObject) {
                BicyclePosition bicyclePosition = JSONObject.toJavaObject(jsonObject, BicyclePosition.class);
                log.info("=======================bicyclePosition =" + bicyclePosition);
                try {
                    bicyclePositionService.save(bicyclePosition);
                    bicyclePositionService.updatePositionByBicycleId(bicyclePosition);
                } catch (Exception e) {
                    log.info(e.getMessage());
                }
            }
            log.info("kafka车辆位置消息:{}", message);
        }

    }
}

5、yml配置文件

server:
  undertow:
    io-threads: 6
    worker-threads: 48
    buffer-size: 1024
    buffers-per-region: 1024
    direct-buffers: true
  port: ${PORT:8080}
  #  tomcat:
  #    max-swallow-size: -1
  servlet:
    context-path: /${spring.application.name}
    compression:
      enabled: true
      mime-types: application/javascript,application/json,application/xml,text/html,text/xml,text/plain,text/css,image/*

management:
  endpoints:
    web:
      exposure:
        include: metrics,httptrace
spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 10MB
  kafka:
    bootstrap-servers: 172.16.251.70:6667,172.16.251.77:6667,172.16.251.46:6667,172.16.251.66:6667, 172.16.251.87:6667, 172.16.251.85:6667, 172.16.251.73:6667, 172.16.251.61:6667
    producer:
      # 发生错误后,消息重发的次数。
      retries: 0
      #当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。
      batch-size: 16384
      # 设置生产者内存缓冲区的大小。
      buffer-memory: 33554432
      # 键的序列化方式
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      # 值的序列化方式
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
      # acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。
      # acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。
      # acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。
      acks: 1
      properties:
        sasl.mechanism: PLAIN
        security.protocol: SASL_PLAINTEXT
        sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="share_bikes" password="9cfb8e5b";
    consumer:
      # 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D
      auto-commit-interval: 1S
      # 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
      # latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
      # earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
      auto-offset-reset: earliest
      # 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
      enable-auto-commit: false
      group-id: ${spring.profiles.active}-group
      # 键的反序列化方式
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      # 值的反序列化方式
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      properties:
        sasl.mechanism: PLAIN
        security.protocol: SASL_PLAINTEXT
        sasl.jaas.config: org.apache.kafka.common.security.scram.ScramLoginModule required username="share_bikes" password="9cfb8e5b";
    listener:
      # 在侦听器容器中运行的线程数。
      concurrency: 5
      #listner负责ack,每调用一次,就立即commit
      ack-mode: manual_immediate
      missing-topics-fatal: false
kafka:
  topic:
    bicycle_topic: bikes_record
    bicycle_position_topic: share_bikes

6、使用(so easy)

@Autowired
KafkaSender kafkaSender;
kafkaSender.sendAsynchronize(kafkaTopicPo.getBicyclePositionTopic(), JSON.toJSONString(bicyclePosition));
### 回答1: Spring Boot集成Kafka配置步骤如下: 1. 添加Kafka依赖 在pom.xml文件中添加Kafka依赖: ``` <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.5.5.RELEASE</version> </dependency> ``` 2. 配置Kafka连接信息 在application.properties文件中配置Kafka连接信息: ``` spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.consumer.group-id=my-group spring.kafka.consumer.auto-offset-reset=earliest ``` 3. 创建Kafka生产者 使用Spring Boot的KafkaTemplate类创建Kafka生产者: ``` @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } ``` 4. 创建Kafka消费者 使用@KafkaListener注解创建Kafka消费者: ``` @KafkaListener(topics = "my-topic", groupId = "my-group") public void listen(String message) { System.out.println("Received message: " + message); } ``` 以上就是Spring Boot集成Kafka配置步骤。 ### 回答2: Spring Boot是一个现代化的Java Web开发框架,简化了传统的Java Web开发流程,而Kafka则是一个分布式消息系统,可用于快速而可靠地处理大量数据和消息。 Spring Boot集成Kafka主要需要进行以下步骤: 1. 配置Maven依赖 在pom.xml文件中添加依赖: ``` <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.3.3.RELEASE</version> </dependency> ``` 2. 配置Kafka参数 在application.yml文件中添加Kafka配置参数,例如: ``` spring: kafka: bootstrap-servers: localhost:9092 consumer: group-id: group1 auto-offset-reset: earliest key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: org.apache.kafka.common.serialization.StringDeserializer producer: retries: 0 batch-size: 16384 linger-ms: 1 buffer-memory: 33554432 key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: org.apache.kafka.common.serialization.StringSerializer ``` 其中,`bootstrap-servers`是Kafka服务器的地址,`group-id`是消费者组的ID,`auto-offset-reset`是消费者启动时的偏移量,`key-deserializer`和`value-deserializer`是反序列化器,`retries`是生产者重试次数,`batch-size`是每个批次消息的大小,`linger-ms`是等待消息传递时间,`buffer-memory`是缓存大小,`key-serializer`和`value-serializer`是序列化器。 3. 创建生产者和消费者 通过`@EnableKafka`注解开启Kafka支持,在需要使用Kafka的地方添加`@KafkaListener`注解标记监听器,例如: ``` @Service @EnableKafka public class KafkaConsumer { @KafkaListener(topics = "test") public void receive(ConsumerRecord<?, ?> consumerRecord) { System.out.println("消费消息:" + consumerRecord.value()); } } ``` 通过`KafkaTemplate`类创建生产者,例如: ``` @Service @EnableKafka public class KafkaProducer { @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); System.out.println("生产者发送消息:" + message); } } ``` 其中,`topic`是消息主题,`message`是消息内容。 通过以上步骤,就可以完成Spring Boot集成Kafka配置使用。 ### 回答3: Spring Boot 是一种流行的 Java Web 开发框架,而 Kafka 是一种流行的分布式消息队列系统。结合 Spring Boot 和 Kafka 可以构建高效可靠的消息处理系统。 实现 Spring Boot 集成 Kafka 需要进行以下步骤: 1. 引入 Kafka 相关依赖 在 Spring Boot 项目的 pom.xml 中引入 Kafka 相关依赖,包括 spring-kafkakafka-clients。 2. 配置 Kafka 生产者和消费者 在 Spring Boot 项目的 application.yml 或 application.properties 文件中进行 Kafka 生产者和消费者的配置。具体配置包括 Kafka 服务器地址、端口号、topic 名称等。 3. 实现 Kafka 消费者 通过注解,实现 Kafka 消费者。使用 @KafkaListener 注解来标记一个方法,该方法可以处理消费者接收到的消息。例如: ```java @KafkaListener(topics = "${kafka.topic.name}", groupId = "${kafka.group.id}") public void listen(ConsumerRecord<String, String> record) { log.info("Received message: {}", record.value()); } ``` 其中,${kafka.topic.name} 和 ${kafka.group.id} 分别是配置文件中的 Kafka topic 名称和消费者组 ID。 4. 实现 Kafka 生产者 通过注入 KafkaTemplate,实现 Kafka 生产者。例如: ```java @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String message) { kafkaTemplate.send(topicName, message); } ``` 其中,topicName 是配置文件中配置Kafka topic 名称。 5. 启动应用程序 通过 Spring Boot 启动应用程序,即可开始接收和发送 Kafka 消息。 通过以上步骤,就可以完成 Spring Boot 集成 Kafka配置。在实际项目中,可以根据需要进行进一步的配置和定制,例如实现 Kafka 消息的序列化和反序列化、配置 Kafka 连接池等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值