首先得自己搭建一个kafka,搭建教程请自行百度,本人是使用docker搭建了一个单机版的zookeeper+kafka作为演示,文末会有完整代码包提供给大家下载参考

废话不多说,教程开始

一、老规矩,先在pom.xml中添加kafka相关依赖

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

二、在application.yml中添加相关配置

spring:
#kafka配置
kafka:
#这里改为你的kafka服务器ip和端口号
bootstrap-servers: 10.24.19.237:9092
#=============== producer =======================
producer:
#如果该值大于零时,表示启用重试失败的发送次数
retries: 0
#每当多个记录被发送到同一分区时,生产者将尝试将记录一起批量处理为更少的请求,默认值为16384(单位字节)
batch-size: 16384
#生产者可用于缓冲等待发送到服务器的记录的内存总字节数,默认值为3355443
buffer-memory: 33554432
#key的Serializer类,实现类实现了接口org.apache.kafka.common.serialization.Serializer
key-serializer: org.apache.kafka.common.serialization.StringSerializer
#value的Serializer类,实现类实现了接口org.apache.kafka.common.serialization.Serializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
#=============== consumer =======================
consumer:
#用于标识此使用者所属的使用者组的唯一字符串
group-id: test-consumer-group
#当Kafka中没有初始偏移量或者服务器上不再存在当前偏移量时该怎么办,默认值为latest,表示自动将偏移重置为最新的偏移量
#可选的值为latest, earliest, none
auto-offset-reset: earliest
#消费者的偏移量将在后台定期提交,默认值为true
enable-auto-commit: true
#如果'enable-auto-commit'为true,则消费者偏移自动提交给Kafka的频率(以毫秒为单位),默认值为5000。
auto-commit-interval: 100
#密钥的反序列化器类,实现类实现了接口org.apache.kafka.common.serialization.Deserializer
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
#值的反序列化器类,实现类实现了接口org.apache.kafka.common.serialization.Deserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

三、添加操作kafka的工具类KafkaUtils.java(这里我只是简单的封装了一些方法,大家可以根据需要自行添加需要的方法)

package com.example.study.util;

import com.google.common.collect.Lists;
import org.apache.kafka.clients.admin.*;
import org.apache.kafka.common.TopicPartitionInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component; import javax.annotation.PostConstruct;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors; /**
* 操作kafka的工具类
*
* @author 154594742@qq.com
* @date 2021/3/2 14:52
*/ @Component
public class KafkaUtils { @Value("${spring.kafka.bootstrap-servers}")
private String springKafkaBootstrapServers; private AdminClient adminClient; @Autowired
private KafkaTemplate kafkaTemplate; /**
* 初始化AdminClient
* '@PostConstruct该注解被用来修饰一个非静态的void()方法。
* 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。
* PostConstruct在构造函数之后执行,init()方法之前执行。
*/
@PostConstruct
private void initAdminClient() {
Map<String, Object> props = new HashMap<>(1);
props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, springKafkaBootstrapServers);
adminClient = KafkaAdminClient.create(props);
} /**
* 新增topic,支持批量
*/
public void createTopic(Collection<NewTopic> newTopics) {
adminClient.createTopics(newTopics);
} /**
* 删除topic,支持批量
*/
public void deleteTopic(Collection<String> topics) {
adminClient.deleteTopics(topics);
} /**
* 获取指定topic的信息
*/
public String getTopicInfo(Collection<String> topics) {
AtomicReference<String> info = new AtomicReference<>("");
try {
adminClient.describeTopics(topics).all().get().forEach((topic, description) -> {
for (TopicPartitionInfo partition : description.partitions()) {
info.set(info + partition.toString() + "\n");
}
});
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return info.get();
} /**
* 获取全部topic
*/
public List<String> getAllTopic() {
try {
return adminClient.listTopics().listings().get().stream().map(TopicListing::name).collect(Collectors.toList());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
return Lists.newArrayList();
} /**
* 往topic中发送消息
*/
public void sendMessage(String topic, String message) {
kafkaTemplate.send(topic, message);
} }

四、添加KafkaController.java作为kafka的demo类

package com.example.study.controller;

import com.example.study.model.vo.ResponseVo;
import com.example.study.util.BuildResponseUtils;
import com.example.study.util.KafkaUtils;
import com.google.common.collect.Lists;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.admin.NewTopic;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.web.bind.annotation.*; import java.util.List; /**
* kafka控制器
*
* @author 154594742@qq.com
* @date 2021/3/2 15:01
*/ @RestController
@Api(tags = "Kafka控制器")
@Slf4j
public class KafkaController { @Autowired
private KafkaUtils kafkaUtils; /**
* 新增topic (支持批量,这里就单个作为演示)
*
* @param topic topic
* @return ResponseVo
*/
@ApiOperation("新增topic")
@PostMapping("kafka")
public ResponseVo<?> add(String topic) {
NewTopic newTopic = new NewTopic(topic, 3, (short) 1);
kafkaUtils.createTopic(Lists.newArrayList(newTopic));
return BuildResponseUtils.success();
} /**
* 查询topic信息 (支持批量,这里就单个作为演示)
*
* @param topic 自增主键
* @return ResponseVo
*/
@ApiOperation("查询topic信息")
@GetMapping("kafka/{topic}")
public ResponseVo<String> getBytTopic(@PathVariable String topic) {
return BuildResponseUtils.buildResponse(kafkaUtils.getTopicInfo(Lists.newArrayList(topic)));
} /**
* 删除topic (支持批量,这里就单个作为演示)
* (注意:如果topic正在被监听会给人感觉删除不掉(但其实是删除掉后又会被创建))
*
* @param topic topic
* @return ResponseVo
*/
@ApiOperation("删除topic")
@DeleteMapping("kafka/{topic}")
public ResponseVo<?> delete(@PathVariable String topic) {
kafkaUtils.deleteTopic(Lists.newArrayList(topic));
return BuildResponseUtils.success();
} /**
* 查询所有topic
*
* @return ResponseVo
*/
@ApiOperation("查询所有topic")
@GetMapping("kafka/allTopic")
public ResponseVo<List<String>> getAllTopic() {
return BuildResponseUtils.buildResponse(kafkaUtils.getAllTopic());
} /**
* 生产者往topic中发送消息demo
*
* @param topic
* @param message
* @return
*/
@ApiOperation("往topic发送消息")
@PostMapping("kafka/message")
public ResponseVo<?> sendMessage(String topic, String message) {
kafkaUtils.sendMessage(topic, message);
return BuildResponseUtils.success();
} /**
* 消费者示例demo
* <p>
* 基于注解监听多个topic,消费topic中消息
* (注意:如果监听的topic不存在则会自动创建)
*/
@KafkaListener(topics = {"topic1", "topic2", "topic3"})
public void consume(String message) {
log.info("receive msg: " + message);
}
}

五、运行项目,然后访问 http://localhost:8080/swagger-ui.html 测试一下效果吧

这三个topic本来是不存在的,这里是由@KafkaListener注解方式监听时自动创建的

1、我们来新增一个名为‘myTopic’的topic试试

2、再重新查询一下所有的topic发现我们新增topic成功了

3、接下来我们试试删除一下myTopic和由@KafkaListener注解方式监听时自动创建的topic1



4、我们再查询一下所有的topic发现‘myTopic’被删除掉了,但是‘topic1’并没有被删除掉,原因就是因为‘topic1’正在被监听,删除掉后又会被自动创建,正如我代码的注释中的说明一样

六、我们来试试我们最关心也是最常用的功能,作为生产者发送消息到topic以及作为消费者消费topic中的消息

1、我们先把控制台的日志先清除一下方便待会儿查看效果

2、我们往正在被监听的"topic1"、"topic2"、"topic3"中的任意一个发送测试消息

3、查看IDEA控制台发现topic中的消息被监听消费到了,大功告成

附上完整代码包供大家学习参考,如果对你有帮助,请给个关注或者点个赞吧! 点击下载完整代码包

手把手教你Spring Boot2.x整合kafka的更多相关文章

  1. 手把手教你Spring Boot2.x整合Elasticsearch(ES)

    文末会附上完整的代码包供大家下载参考,码字不易,如果对你有帮助请给个点赞和关注,谢谢! 如果只是想看java对于Elasticsearch的操作可以直接看第四大点 一.docker部署Elastics ...

  2. Spring Boot2.0 整合 Kafka

    Kafka 概述 Apache Kafka 是一个分布式流处理平台,用于构建实时的数据管道和流式的应用.它可以让你发布和订阅流式的记录,可以储存流式的记录,并且有较好的容错性,可以在流式记录产生时就进 ...

  3. 手把手教你Spring Boot整合Mybatis Plus和Swagger2

    前言:如果你是初学者,请完全按照我的教程以及代码来搭建(文末会附上完整的项目代码包,你可以直接下载我提供的完整项目代码包然后自行体验!),为了照顾初学者所以贴图比较多,请耐心跟着教程来,希望这个项目D ...

  4. 手把手教你Spring Boot整合Mybatis Plus 代码生成器

    一.在pom.xml中添加所需依赖 <!-- MyBatis-Plus代码生成器--> <dependency> <groupId>com.baomidou< ...

  5. Spring Boot2.X整合消息中间件RabbitMQ原理简浅探析

    目录 1.简单概述RabbitMQ重要作用 2.简单概述RabbitMQ重要概念 3.Spring Boot整合RabbitMQ 前言 RabbitMQ是一个消息队列,主要是用来实现应用程序的异步和解 ...

  6. 基于Redis的消息队列使用:spring boot2.0整合redis

    一 . 引入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="ht ...

  7. spring boot2 kafka

    一.软件版本 1.linux:centos6 2.zookeeper:zookeeper-3.4.1 3.kafka:kafka_2.12-2.2.0 4.jdk:1.8 5.instelliJ Id ...

  8. 手把手教你使用IDEA2020创建SpringBoot项目

    一.New Project 二.如图选择Spring Initalizr,选择jdk版本,然后点击Next(注意:SpringBoot2开始至少使用JDK1.8) 三.如图根据自己需要修改,然后点击N ...

  9. 手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis

    在写代码之前我们先了解一下这三个框架分别是干什么的? 相信大以前也看过不少这些概念,我这就用大白话来讲,如果之前有了解过可以跳过这一大段,直接看代码! SpringMVC:它用于web层,相当于con ...

随机推荐

  1. AtCoder Beginner Contest 179

    比赛链接:https://atcoder.jp/contests/abc179/tasks A - Plural Form 题意 给出一个由小写字母组成的单词,如果单词以 $s$ 结尾,在单词的末尾加 ...

  2. 2019牛客多校 Round5

    Solved:4 Rank:122 补题:8/10 A digits 2 签到 把这个数写n遍 #include <bits/stdc++.h> using namespace std; ...

  3. 【poj 2891】Strange Way to Express Integers(数论--拓展欧几里德 求解同余方程组 模版题)

    题意:Elina看一本刘汝佳的书(O_O*),里面介绍了一种奇怪的方法表示一个非负整数 m .也就是有 k 对 ( ai , ri ) 可以这样表示--m%ai=ri.问 m 的最小值. 解法:拓展欧 ...

  4. 【uva 120】Stacks of Flapjacks(算法效率--构造法+选择排序思想)

    题意:有N张正在锅里的一叠煎饼,每张都有一个数字,代表其大小.厨师每次可以选择一个数k,把从锅底开始数第k张上面的煎饼全部翻过来,即原来在上面的煎饼现在到了下面.要求设计一种方法使得所有煎饼按照从小到 ...

  5. 安装python的selenium库和驱动

    对于使用selenium来进行python爬虫操作可以简化好多操作,它实际上的运行就是通过打开一个浏览器来一步一步的按照你的代码来执行 如果安装过python编译器后应该pip工具也是有的,验证pyt ...

  6. Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad) D. Divide and Sum (思维,数学,逆元)

    题意:有一个长度为\(2n\)数组,从中选分别选\(n\)个元素出来组成两个序列\(p\)和\(q\),(\(p\)和\(q\)中只要有任意一个元素在\(a\)的原位置不同,就算一个新的情况),选完后 ...

  7. poj1787 Charlie's Change

    Description Charlie is a driver of Advanced Cargo Movement, Ltd. Charlie drives a lot and so he ofte ...

  8. 记一次基于springboot+aop实现日志记录实战

    1. 为什么要记录日志 好处: a. 可以对一些重要功能进行记录,方便以后跟踪是谁操作此功能的. b. 在操作某些功能时可能会发生异常,但每次出现异常我们想定位日志都要去服务器查看我们的日志.有了日志 ...

  9. 对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测

    前言 每日清理大师是一款智能便捷的手机清理软件,可快速清理无用缓存.垃圾文件和应用残留,还可深度清理如社交软件中的无用缓存等,有效解决手机卡顿.耗电快.内存不足等问题.每日清理大师App在结合了系统完 ...

  10. MySQL 基础面试题

    请写出什么是事务? 事务是一组不可分割的 DML 语句,事务处理可以用来维护数据库的完整性,保证一组 SQL 语句要么全部执行成功,要么全部不执行,只有 InnoDB 存储引擎才支持事务 . 事务的特 ...