kafka 学习笔记(三)springboot 集成 kafka

目录

一、pom.xml 依赖配置

二、application.yml 的配置

三、创建 kafka listener

四、创建kafka producter

五.kafka 常用配置介绍

六.代码


springboot 是我们java 开发常用的框架,这篇博客就总结一下springboot 集成kafka ,以及kafka 的一些常用配置。

一、pom.xml 依赖配置

增加 spring-kafka 和 json 的依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springboot-kafka-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-kafka-demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.28</version>
        </dependency>

        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>

        <!-- hutool 工具集合包 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.5.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

二、application.yml 的配置

配置kafka 和 服务端口

server:
  port: 8061

spring:
  kafka:
    bootstrap-servers: localhost:9092
    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
    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
      # 键的反序列化方式
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      # 值的反序列化方式
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
    listener:
      # 在侦听器容器中运行的线程数。
      concurrency: 5
      #listner负责ack,每调用一次,就立即commit
      ack-mode: manual_immediate
      missing-topics-fatal: false

三、创建 kafka listener

package com.example.springbootkafkademo.listener;

import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.Acknowledgment;
import org.springframework.kafka.support.KafkaHeaders;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.stereotype.Component;

import java.util.Optional;

/**
 * @author yangzheng
 * @Description: //TODO
 * @Title: KafkaTestListener
 * @date 2020/6/3/003 13:51
 */
@Component
@Slf4j
public class KafkaTestListener {

    @KafkaListener(topics = "testKafka1",groupId = "test")
    public void topic_test(ConsumerRecord<?, ?> record, Acknowledgment ack, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
        Optional message = Optional.ofNullable(record.value());
        if (message.isPresent()) {
            JSONObject json = JSONObject.fromObject(record.value());
            log.info("test 消费了: Topic:" + topic + ",Message:" + json);
            ack.acknowledge();
        }
    }
}

四、创建kafka producter

package com.example.springbootkafkademo.controller;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author yangzheng
 * @version 1.0
 * @description
 * @date 2021/6/18 018 1:19
 */
@RestController
@Slf4j
public class KafkaTestController {

    @Autowired
    private KafkaTemplate<String, Object> kafkaTemplate;

    @RequestMapping("/test")
    public String test(){
        log.info("向 testKafka 发送消息");
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("name","test");
        kafkaTemplate.send("testKafka1", jsonObject.toString());
        return "success";
    }
}

五.kafka 常用配置介绍

kafka  服务端  server.properties

#绑定服务监听的地址和端口,要填写hostname -i 出来的地址,否则可能会绑定到127.0.0.1,producer可能会发不出消息
listeners=PLAINTEXT://localhost:9092
#broker对producers和consumers服务的地址和端口,如果没有配置,使用listeners的配置,本文没有配置该项
advertised.listeners=PLAINTEXT://localhost:9092
# 如果不配置会默认为本机hostname,远程连接可能会根据hostname解析成不同的ip导致连接错误
advertised.host.name=localhost
# 自动创建topic
auto.create.topics.enable=true

  spring kafka 配置

#kafka 消费者拉取消息的数量
spring.kafka.consumer.max-poll-records = 10
#kafka 消费者拉取消息的时长
#spring.kafka.properties.max.poll.interval.ms = 86400000

# 是否自动提交,如果为否,ack-mode 要设置为 manual
spring.kafka.consumer.enable-auto-commit = true
#spring.kafka.listener.ack-mode = manual

#=============== provider  =======================
#procedure要求leader在考虑完成请求之前收到的确认数,用于控制发送记录在服务端的持久化,其值可以为如下:
#acks = 0 如果设置为零,则生产者将不会等待来自服务器的任何确认,该记录将立即添加到套接字缓冲区并视为已发送。在这种情况下,无法保证服务器已收到记录,并且重试配置将不会生效(因为客户端通常不会知道任何故障),为每条记录返回的偏移量始终设置为-1。
#acks = 1 这意味着leader会将记录写入其本地日志,但无需等待所有副本服务器的完全确认即可做出回应,在这种情况下,如果leader在确认记录后立即失败,但在将数据复制到所有的副本服务器之前,则记录将会丢失。
#acks = all 这意味着leader将等待完整的同步副本集以确认记录,这保证了只要至少一个同步副本服务器仍然存活,记录就不会丢失,这是最强有力的保证,这相当于acks = -1的设置。
#可以设置的值为:all, -1, 0, 1
request.required.acks = -1
spring.kafka.producer.acks = 1
#重试次数
spring.kafka.producer.retries = 3
# 每次批量发送消息的数量
spring.kafka.producer.batch-size = 16384
# buffer-memory 大小
spring.kafka.producer.buffer-memory = 33554432


spring.kafka.consumer.enable-auto-commit=false
#多线程消费,当自动提交为false时生效
spring.kafka.listener.concurrency=3

# partition 消费者分区分配策略  RangeAssignor 范围分区  RoundRobinAssignor 顺序分区
spring.kafka.consumer.properties.partition.assignment.strategy = org.apache.kafka.clients.consumer.RoundRobinAssignor
spring.kafka.consumer.properties.partition.assignment.strategy=org.apache.kafka.clients.consumer.RangeAssignor

六.代码

https://github.com/yangzheng0/springboot-kafka-demo

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: KafkaSpring Boot的集成可以通过引入Spring Kafka依赖来实现。你可以在项目的pom.xml文件中添加以下依赖项来引入Spring Kafka: ```xml <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.8.1</version> </dependency> ``` 同时,你还需要在项目的配置文件(通常是application.yml或application.properties)中进行相关配置。你可以根据自己的需求配置Kafka的连接信息、主题等。 在Spring Boot中,你可以使用`@KafkaListener`注解来创建消费者。你可以在消费者类中使用`@KafkaListener`注解来定义消费者方法,并指定要监听的主题和消费组。例如: ```java @Component public class MyConsumer { @KafkaListener(topics = "my-springboot-topic", groupId = "mySpringBootGroup") public void listenConsumerGroup1(ConsumerRecord<String, String> record, Acknowledgment ack) { // 处理消息的逻辑 } @KafkaListener(topics = "my-springboot-topic", groupId = "mySpringBootGroup2") public void listenConsumerGroup2(ConsumerRecord<String, String> record, Acknowledgment ack) { // 处理消息的逻辑 } } ``` 在上面的例子中,我们创建了两个消费者方法,分别属于不同的消费组。每个方法都会接收到对应主题的消息,并进行处理。 最后,你可以启动Spring Boot项目,KafkaSpring Boot的集成就完成了。你的消费者将会开始监听指定的主题,并处理接收到的消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值