SpringBoot整合Kafka实现生产与消费

一、Kafka是什么?

在这里插入图片描述

Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统。
它最初由LinkedIn公司开发,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。Kafka是一种快速、可扩展的、设计内在就是分布式的,分区的和可复制的提交日志服务。

二、ApacheKafka®是一个分布式流媒体平台。这到底是什么意思呢?

在这里插入图片描述

2.1流媒体平台有三个关键功能:

发布和订阅记录流,类似于消息队列或企业消息传递系统。
以容错的持久方式存储记录流。
记录发生时处理流。

2.2Kafka通常用于两大类应用:

构建可在系统或应用程序之间可靠获取数据的实时流数据管道
构建转换或响应数据流的实时流应用程序。

更多信息大家可以对照官网介绍:http://kafka.apache.org/intro.html

三、Kafka安装

3.1下载kafka

http://kafka.apache.org/downloads

3.2安装配置

wind 配置修改

2.1 kafka安装路径/config/server.properties,讲以下内容进行替换
2.2 listeners=PLAINTEXT://:9092
2.3 advertised.listeners=PLAINTEXT://localhost:9092

3.3启动

.\bin\windows\kafka-server-start.bat .\config\server.properties

3.4注:

可以使用kafka客户端进行监控,下载地址如下
http://www.kafkatool.com/download.html
由于kafka需要ZK作为注册中心接下再来安装ZK

四、安装zookeeper

4.1.下载

http://zookeeper.apache.org/releases.html

4.2.安装配置

wind 配置修改

2.1 将conf下“zoo_sample.cfg”重命名为“zoo.cfg”,这里可以将log地址改成自定义位置

4.3.启动

打开新的cmd,输入zkServer,运行Zookeeper

五、集成

5.1依赖管理

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.javayh</groupId>
        <artifactId>javayh-mq</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../</relativePath> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.javayh</groupId>
    <artifactId>javayh-kafka</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>javayh-kafka</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
        <!-- Spring Cloud Kafka-->
       <!-- <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-kafka</artifactId>
        </dependency>-->
        <dependency>
            <groupId>com.javayh</groupId>
            <artifactId>javayh-commons</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
        </dependency>
    </dependencies>

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

</project>

5.2 项目配置

server:
  port: 8023
spring:
  application:
    name: javayh-kafka
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: com.javayh.serializable.SysMenuDeserializer
      auto-offset-reset: latest                           #最早未被消费的offset earliest
      max-poll-records: 3100                              #批量消费一次最大拉取的数据量
      enable-auto-commit: false                           #是否开启自动提交
      auto-commit-interval: 1000                          #自动提交的间隔时间
      session-timeout: 20000                              #连接超时时间
      max-poll-interval: 15000                            #手动提交设置与poll的心跳数,如果消息队列中没有消息,等待毫秒后,调用poll()方法。如果队列中有消息,立即消费消息,每次消费的消息的多少可以通过max.poll.records配置。
      max-partition-fetch-bytes: 15728640                 #设置拉取数据的大小,15M
    producer:
      bootstrap-servers: localhost:9092
      batch-size: 16785                                   # 一次最多发送的数据量
      retries: 1                                          #发送失败后的重复发送次数
      buffer-memory: 33554432                            #32M批处理缓冲区
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: com.javayh.serializable.SysMenuSerializable
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/guns?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&useAffectedRows=true
    username: root
    password: 1219320
  druid:
    initialSize: 5 #初始化连接大小
    minIdle: 5     #最小连接池数量
    maxActive: 20  #最大连接池数量
    maxWait: 60000 #获取连接时最大等待时间,单位毫秒
    timeBetweenEvictionRunsMillis: 60000 #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
    minEvictableIdleTimeMillis: 300000   #配置一个连接在池中最小生存的时间,单位是毫秒
    validationQuery: SELECT 1 from DUAL  #测试连接
    testWhileIdle: true                  #申请连接的时候检测,建议配置为true,不影响性能,并且保证安全性
    testOnBorrow: false                  #获取连接时执行检测,建议关闭,影响性能
    testOnReturn: false                  #归还连接时执行检测,建议关闭,影响性能
    poolPreparedStatements: false        #是否开启PSCache,PSCache对支持游标的数据库性能提升巨大,oracle建议开启,mysql下建议关闭
    maxPoolPreparedStatementPerConnectionSize: 20 #开启poolPreparedStatements后生效
    filters: stat,wall,log4j #配置扩展插件,常用的插件有=>stat:监控统计  log4j:日志  wall:防御sql注入
    connectionProperties: 'druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000' #通过connectProperties属性来打开mergeSql功能;慢SQL记录

kafka:
  topic:
    group-id: javayh-kafka
    topic-name:
      - JavaYoHo
      - YangHaiJi
      - Dylan

这里大家可以看到Kafka的序列化问题,如何你想生产消费对象,需要自定义序列化机制,这里和RabbitMQ还是有区别的,关于RabbitMQ的使用与介绍大家可以看一下:https://blog.csdn.net/weixin_38937840/article/details/96591029 这篇文章

5.3 生产与消费

@Slf4j
@Service
public class KafkaService {

    @Autowired
    private KafkaTemplate kafkaTemplate;

    /**
     * 生产者
     * @param data
     */
    public void send(SysMenu data){
        ListenableFuture send = kafkaTemplate.send(StaticNumber.JAVAYOHO, data);
        send.addCallback(new ListenableFutureCallback(){
            @Override
            public void onSuccess(Object result) {
                log.info("send success");
            }
            @Override
            public void onFailure(Throwable ex) {
                log.info("send failure");
            }
        });
        log.info("send success");
    }

//    public void sendString(String data){
//        ListenableFuture send = kafkaTemplate.send(StaticNumber.YANGHJ, data);
//        send.addCallback(new ListenableFutureCallback(){
//            @Override
//            public void onSuccess(Object result) {
//                log.info("send success");
//            }
//            @Override
//            public void onFailure(Throwable ex) {
//                log.info("send failure");
//            }
//        });
//        log.info("send success");
//    }
}

----------

    /**
     *  消费者
     * @param record 消息
     */
    @Transactional
    @KafkaListener(topics = "#{kafkaTopicName}", groupId = "#{topicGroupId}" )
    public void processMessage(ConsumerRecord<String, SysMenu> record) {
        SysMenu sysMenu = record.value();
        log.info("SysMenu --> {}",sysMenu.toString());
        if (sysMenu == null) {
            throw new RuntimeException("模拟业务出错");
        }
        log.info("kafka processMessage start, topic = {}, msg = {}", record.topic(), sysMenu);
        //入库
        Integer i = sysMeunMapper.modifyById(sysMenu);
        log.info("更新 {}",i);
        if (i == null || i == 0){
            log.info("kafka processMessage end failure");
        }else {
            log.info("kafka processMessage end success");
        }
    }

5.4项目结构

在这里插入图片描述
由于内容较多,就不一一复制了,大家可以去我的github上看源码:
https://github.com/Dylan-haiji/javayh-cloud/tree/master/javayh-mq/javayh-kafka
到这里Springboot整合Kafka实现简单的生产消费就完成了!
如遇到问题可以联系小编。微信:372787553,互相学习

关注 Java有货领取更多资料

联系小编。微信:372787553,带您进群互相学习
左侧小编微信,右侧获取免费资料
在这里插入图片描述

技术博客:https://blog.csdn.net/weixin_38937840

SpringCloud学习代码: https://github.com/Dylan-haiji/javayh-cloud

Redis、Mongo、Rabbitmq、Kafka学习代码: https://github.com/Dylan-haiji/javayh-middleware

AlibabaCloud学习代码:https://github.com/Dylan-haiji/javayh-cloud-nacos

SpringBoot+SpringSecurity实现自定义登录学习代码:https://github.com/Dylan-haiji/javayh-distribution

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小杨同学~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值