首先得自己搭建一个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. SPOJ Favorite Dice(概率dp)

    题意: 一个骰子,n个面,摇到每一个面的概率都一样.问你把每一个面都摇到至少一次需要摇多少次,求摇的期望次数 题解: dp[i]:已经摇到i个面,还需要摇多少次才能摇到n个面的摇骰子的期望次数 因为我 ...

  2. Codeforces Round #582 (Div. 3) C. Book Reading

    传送门 题意: 给你n,k.表示在[1,n]这个区间内,在这个区间内找出来所有x满足x%k==0,然后让所有x的个位加到一起(即x%10),输出. 例如:输入10 2 那么满足要求的数是2 4 6 8 ...

  3. POJ1142 Smith Numbers 暴力+分解质因子

    题意:题目定义了一个史密斯数,这个数的定义是:一个合数的各个位置上加起来的和等于它的素因数所有位置上的数字加起来的和.比如: 4937775=3∗5∗5∗658374+9+3+7+7+7+5=3+5+ ...

  4. __getattr__,__getattribute__和__get__的区别

    dir(object)  列出对象的大多数属性 getattr(object, name) 从object对象中获取name字符串指定的属性 hasattr(object, name) 如果objec ...

  5. C# 网络流

    流(stream)是对串行传输的数据的一种抽象表示,底层的设备可以是文件.外部设备.主存.网络套接字等等. 流有三种基本的操作:写入.读取和查找. 如果数据从内存缓冲区传输到外部源,这样的流叫作&qu ...

  6. [Golang]-4 错误处理、Panic、Defer

    目录 错误和异常 案例 Panic Defer 使用 defer+recover 来处理错误 参考文章: Go 语言使用一个独立的·明确的返回值来传递错误信息的.这与使用异常的 Java 和 Ruby ...

  7. Keras模型拼装

    在训练较大网络时, 往往想加载预训练的模型, 但若想在网络结构上做些添补, 可能出现问题一二... 一下是添补的几种情形, 此处以单输出回归任务为例: # 添在末尾: base_model = Inc ...

  8. Ubuntu16安装chrome

    不免让您失望, 安装正常的chrome,Dependency is not satisfiable: libnss3 (>= 2:3.22)问题一直没能解决,故使用chromium次而代之. s ...

  9. Promise nested then execute order All In One

    Promise nested then execute order All In One Promise nested then nested Promise not return new Promi ...

  10. ES6 Arrow Function All In One

    ES6 Arrow Function All In One this const log = console.log; const arrow_func = (args) => log(`arg ...