SpringBoot集成Kafka(1)|(入门-实现生产者消费者)

SpringBoot集成Kafka(1)|(入门-实现生产者消费者)


章节

第一章链接: SpringBoot集成Kafka(1)|(入门-实现生产者消费者)

前言

本章节主要介绍SpringBoot项目集成afka的一些相关知识,包括集成版本、依赖、集成方式、以及简单的使用。查看需要对Springboot项目有一定的了解。

一、Kafka是什么?

Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。

二、集成步骤

1.依赖引入

pom依赖如下,主要列出SpringBoot依赖版本以及kafka版本,其他需要依赖自行添加

    <!-- Springboot 版本 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.7</version>
        <relativePath/>
    </parent>
    
     <!-- kafka 依赖 -->
     <dependency>
        <groupId>org.springframework.kafka</groupId>
        <artifactId>spring-kafka</artifactId>
     </dependency>

2.文件配置

yml配置,此处为单机配置,集群模式uri

spring:
  kafka:
    bootstrap-servers: 192.188.50.50:9092,192.188.50.50:9093,192.188.50.50:9094
    producer: # producer 生产者
      retries: 0 # 重试次数
      acks: 1 # 应答级别:多少个分区副本备份完成时向生产者发送ack确认(可选01、all/-1)
      batch-size: 16384 # 批量大小
      buffer-memory: 33554432 # 生产端缓冲区大小
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer: # consumer消费者
      group-id: OakGroup # 默认的消费组ID
      enable-auto-commit: true # 是否自动提交offset
      auto-commit-interval: 100  # 提交offset延时(接收到消息后多久提交offset)
      # earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
      # latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
      # none:topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
      auto-offset-reset: latest
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

3.定义数据传输体

定义数据库集合,定义好字段,该处用了lombok表达式,如不需要可自定义set、get方法取代

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class EmployeeDto {
    private String id;
    private String name;
    private String no_id;

    private EmpInfoPo info;
    /**
     * 部门
     */
    private String dept;

    @Override
    public String toString() {
        return "EmployeeDto{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", no_id='" + no_id + '\'' +
                ", info=" + info +
                ", dept='" + dept + '\'' +
                '}';
    }
}

EmpInfoPo 实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class EmpInfoPo {
    private int age;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birth;
    private int gender;
    private String like;
}

4.生产者

通过KafkaTemplate对象对kafka数据库进行操作,KafkaTemplate有springboot容器创建管理,用户不需要进行配置,使用的时候注入即可,我这里以接口的方式实现。

@Api(tags = {"kafka相关接口"})
@RestController
@RequestMapping("/producer")
public class kafkaCtrl {

    @Autowired
    private KafkaTemplate kafkaTemplate;


    /***
     * 发送消息
     * topic:要发送的队列
     * msg:发送的消息
     */
    @ApiImplicitParams({@ApiImplicitParam(name = "msg", value = "员工信息")})
    @ApiOperation(value = "发送消息", notes = "发送消息")
    @PostMapping(value = "/send/{topic}")
    public String send(@PathVariable(value = "topic") String topic,
                       @RequestBody EmployeeDto msg) {
        //消息发送
        sendMsg(topic, msg);
        return "SUCCESS";
    }

    private void sendMsg(String topic1, EmployeeDto msg1) {
        for (int j = 0; j < 100; j++) {

            for (int i = 0; i < 100; i++) {

                EmpInfoPo build = EmpInfoPo.builder().age(i)
                        .birth(new Date())
                        .gender(i % 2)
                        .age(i % 60)
                        .like(i + "喜欢打篮球")
                        .build();
                EmployeeDto msg = EmployeeDto.builder()
                        .id(j + "" + i)
                        .name("员工" + j + i + "号")
                        .no_id("001")
                        .dept("第" + j + i + "部门")
                        .info(build)
                        .build();
                kafkaTemplate.send("testTop", msg.toString());
            }
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}


5.消费者

通过KafkaListener注解对kafka数据库进行操作。

@Component
public class KafkaConSumer {

    @KafkaListener(topics = {"testTop"},groupId = "OakGroup")
    public void listener(ConsumerRecord<String,String> record){
        //获取消息
        String message = record.value();
        //消息偏移量
        long offset = record.offset();
        System.out.println("读取的消息:"+message+"\n当前偏移量:"+offset);
    }
}


6.遇到的问题

发送数据报错
java.lang.ClassCastException: com.oak.kafka.rest.entity.dto.EmployeeDto cannot be cast to java.lang.String

原因:配置生产者的时候使用的是String序列化
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
而实际使用的是Object,导致序列化失败
解决方法:消息数据添加方法
@Override
public String toString() {
   return "EmployeeDto{" +
           "id='" + id + '\'' +
           ", name='" + name + '\'' +
           ", no_id='" + no_id + '\'' +
           ", info=" + info +
           ", dept='" + dept + '\'' +
           '}';
}
发送方式
kafkaTemplate.send("testTop", msg.toString());


总结

以上就是SpringBoot集成kafka数据库内容,内容较简单,适合入门。后期会深入使用kafka并总结分享。(如果大家需要源码留言)

第一章链接: SpringBoot集成Kafka(1)|(入门-实现生产者消费者)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot中集成Kafka作为生产者可以按照以下步骤进行操作: 1. 添加Kafka依赖:在`pom.xml`文件中添加Kafka依赖。你可以使用以下依赖来集成Kafka: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> ``` 2. 配置Kafka连接信息:在`application.properties`文件(或者`application.yml`)中配置Kafka的连接信息,例如: ```properties spring.kafka.bootstrap-servers=localhost:9092 spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer ``` 3. 创建Kafka生产者:在Spring Boot中,你可以使用`KafkaTemplate`类来创建Kafka生产者。你可以使用以下代码示例创建一个简单的生产者: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @Component public class KafkaProducer { @Autowired private KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String message) { kafkaTemplate.send(topic, message); } } ``` 4. 发送消息:在需要发送消息的地方,你可以通过调用`KafkaProducer`的`sendMessage`方法发送消息。例如: ```java @Autowired private KafkaProducer kafkaProducer; public void sendKafkaMessage() { String topic = "your_topic"; String message = "Hello Kafka!"; kafkaProducer.sendMessage(topic, message); } ``` 这样,你就完成了Spring Boot集成Kafka作为生产者的配置。当你调用`sendKafkaMessage`方法时,消息将会发送到指定的Kafka主题(topic)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值