springboot整合kafka简单案例(win10环境)

1.准备工作
(1)jdk环境
  官网下载地址 https://www.oracle.com/java/technologies/downloads/
  安装jdk,配置好 JAVA_HOME和path

(2)zookeeper(可以安装也不安装,kafka有自带)
  官网下载地址 https://zookeeper.apache.org/releases.html#download
  1.进入Zookeeper设置目录,H:\shangbb\software\apache-zookeeper-3.6.3-bin\conf
  2. 将“zoo_sample.cfg”重命名为“zoo.cfg”
  3. 修改zoo.cfg内容
  4. 找到并编辑dataDir=H:/shangbb/software/apache-zookeeper-3.6.3-bin/data (可以自定义文件夹,最好不要使用使用tmp命名,注意这里是正斜杠)
  5. 与Java中的做法类似,我们在系统环境变量中添加:
    在系统变量中添加ZOOKEEPER_HOME =H:\shangbb\software\apache-zookeeper-3.6.3-bin
    编辑path系统变量,添加为路径 %ZOOKEEPER_HOME%\bin;
  6. 在zoo.cfg文件中修改默认的Zookeeper端口(默认端口2181,可以不用修改)

  7.启动Zookeeper: 双击H:\shangbb\software\apache-zookeeper-3.6.3-bin\bin\zkServer.cmd  或者 打开新的cmd,H:\shangbb\software\apache-zookeeper-3.6.3-bin\bin下,输入zkServer.cmd,运行Zookeeper。

  (3) kafka
  官网下载地址 http://kafka.apache.org/downloads
  解压到目录 H:\shangbb\software\kafka_2.12-2.8.1

  1. 编辑文件Kafka配置文件, H:\shangbb\software\kafka_2.12-2.8.1\config\server.properties
  2. 找到并编辑log.dirs=H:/shangbb/software/kafka_2.12-2.8.1/kafka-log, (自定义文件夹,注意这里是正斜杠)
  3. 找到并编辑zookeeper.connect=localhost:2181。表示本地运行(默认的可以不改)

二、运行和测试
注意:在启动Kafka前,先运行Zookeeper实例。
(1)启动Kafka

  新建cmd窗口:
  在 H:\shangbb\software\kafka_2.12-2.8.1输入:
  .\bin\windows\kafka-server-start.bat .\config\server.properties


三、代码
(1)添加kafka maven依赖
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>

 (2)添加kafka配置

  在application.yml中添加如下配置

  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
        group-id: defaultConsumerGroup
        listener:
        # 在侦听器容器中运行的线程数。
        concurrency: 5
        #listner负责ack,每调用一次,就立即commit
        ack-mode: manual_immediate
        missing-topics-fatal: false

生产者:
@RequestMapping("/kafka_demo")
@RestController
public class KafkaController {
  @Resource
  private KafkaTemplate<String, Object> kafkaTemplate;

  @GetMapping("/test/{message}")
  public void test(@PathVariable("message") String message){
    kafkaTemplate.send("topic1",message);
  }
}

 

消费者
@Component
public class KafkaConsumer {
  @KafkaListener(topics = {"topic1"})
  public void onMessage(ConsumerRecord<?,?> record){
    System.out.println("主題= " + record.topic());
  System.out.println("消息= " + record.value());
  }

}

posted @ 2021-11-29 15:37  bbsallz  阅读(43)  评论(0)    收藏  举报