SpringBoot整合kafka(实现producer和consumer)
本文代码使用的是Spring Boot 2.1.8.RELEASE 版本
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.1.8.RELEASE</version>
- <!--
- parent.relativePath用法:设定一个空值将始终从仓库中获取,不从本地路径获取
- 查找顺序:relativePath元素中的地址 –> 本地仓库 –> 远程仓库
- -->
- <relativePath /> <!-- lookup parent from repository -->
- </parent>
1、 pom.xml文件,引入依赖
- <!-- kafka依赖 begin -->
- <dependency>
- <groupId>org.springframework.kafka</groupId>
- <artifactId>spring-kafka</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.kafka</groupId>
- <artifactId>spring-kafka-test</artifactId>
- <scope>test</scope>
- </dependency>
- <!-- kafka依赖 end -->
采用Kafka提供的StringSerializer和StringDeserializer进行序列化和反序列化
2、在application-dev.properties配置生产者
- #### kafka配置生产者 begin ####
- #============== kafka ===================
- # 指定kafka server的地址,集群配多个,中间,逗号隔开
- spring.kafka.bootstrap-servers=106.12.241.89:9092
- #=============== provider =======================
- # 写入失败时,重试次数。当leader节点失效,一个repli节点会替代成为leader节点,此时可能出现写入失败,
- # 当retris为0时,produce不会重复。retirs重发,此时repli节点完全成为leader节点,不会产生消息丢失。
- spring.kafka.producer.retries=0
- # 每次批量发送消息的数量,produce积累到一定数据,一次发送
- spring.kafka.producer.batch-size=16384
- # produce积累数据一次发送,缓存大小达到buffer.memory就发送数据
- spring.kafka.producer.buffer-memory=33554432
- #procedure要求leader在考虑完成请求之前收到的确认数,用于控制发送记录在服务端的持久化,其值可以为如下:
- #acks = 0 如果设置为零,则生产者将不会等待来自服务器的任何确认,该记录将立即添加到套接字缓冲区并视为已发送。在这种情况下,无法保证服务器已收到记录,并且重试配置将不会生效(因为客户端通常不会知道任何故障),为每条记录返回的偏移量始终设置为-1。
- #acks = 1 这意味着leader会将记录写入其本地日志,但无需等待所有副本服务器的完全确认即可做出回应,在这种情况下,如果leader在确认记录后立即失败,但在将数据复制到所有的副本服务器之前,则记录将会丢失。
- #acks = all 这意味着leader将等待完整的同步副本集以确认记录,这保证了只要至少一个同步副本服务器仍然存活,记录就不会丢失,这是最强有力的保证,这相当于acks = -1的设置。
- #可以设置的值为:all, -1, 0, 1
- spring.kafka.producer.acks=1
- # 指定消息key和消息体的编解码方式
- spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
- spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
- #### kafka配置生产者 end ####
3、生产者向kafka发送消息
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.kafka.core.KafkaTemplate;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.ResponseBody;
- /**
- *
- *
- * @author Lynch
- */
- @Controller
- @RequestMapping("/api/kafka/")
- public class KafkaController {
- @Autowired
- private KafkaTemplate<String,Object> kafkaTemplate;
- @GetMapping("send")
- @ResponseBody
- public boolean send(@RequestParam String message) {
- try {
- kafkaTemplate.send("testTopic", message);
- System.out.println("消息发送成功...");
- } catch (Exception e) {
- e.printStackTrace();
- }
- return true;
- }
- @GetMapping("test")
- @ResponseBody
- public String test(){
- System.out.println("hello world!");
- return "ok";
- }
- }
4、在application-dev.properties配置消费者
- #### kafka配置消费者 start ####
- # 指定默认消费者group id --> 由于在kafka中,同一组中的consumer不会读取到同一个消息,依靠groud.id设置组名
- spring.kafka.consumer.group-id=test
- # smallest和largest才有效,如果smallest重新0开始读取,如果是largest从logfile的offset读取。一般情况下我们都是设置smallest
- spring.kafka.consumer.auto-offset-reset=earliest
- # enable.auto.commit:true --> 设置自动提交offset
- spring.kafka.consumer.enable-auto-commit=true
- #如果'enable.auto.commit'为true,则消费者偏移自动提交给Kafka的频率(以毫秒为单位),默认值为5000。
- spring.kafka.consumer.auto-commit-interval=1000
- # 指定消息key和消息体的编解码方式
- spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
- spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
- #### kafka配置消费者 end ####
5、消费者监听topic=testTopic的消息
- import org.springframework.kafka.annotation.KafkaListener;
- import org.springframework.stereotype.Component;
- /**
- * 消费者监听topic=testTopic的消息
- *
- * @author Lynch
- */
- @Component
- public class ConsumerListener {
- @KafkaListener(topics = "testTopic")
- public void onMessage(String message){
- //insertIntoDb(buffer);//这里为插入数据库代码
- System.out.println("message: " + message);
- }
- }
6、控制台打印消息
- http://localhost:8091/api/kafka/send?message=aaabbbccc
- 消息发送成功...
- message: aaabbbccc
- http://localhost:8091/api/kafka/send?message='1111' ##编解码方式是字符串,用单引号括起来表示字符串
- 消息发送成功...
- message: '1111'
到此,采用Kafka提供的StringSerializer和StringDeserializer进行序列化和反序列化,因为此种序列化方式无法序列化实体类。
如果是实体类的消息传递,可以采用自定义序列化和反序列化器进行实体类的序列化和反序列化,由于Serializer和Deserializer影响到上下游系统,导致牵一发而动全身。自定义序列化&反序列化实现不是能力的体现,而是逗比的体现。所以强烈不建议自定义实现序列化&反序列化,推荐直接使用StringSerializer和StringDeserializer,然后使用json作为标准的数据传输格式。
SpringBoot整合kafka(实现producer和consumer)的更多相关文章
- SpringBoot系列八:SpringBoot整合消息服务(SpringBoot 整合 ActiveMQ、SpringBoot 整合 RabbitMQ、SpringBoot 整合 Kafka)
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合消息服务 2.具体内容 对于异步消息组件在实际的应用之中会有两类: · JMS:代表作就是 ...
- SpringBoot整合Kafka和Storm
前言 本篇文章主要介绍的是SpringBoot整合kafka和storm以及在这过程遇到的一些问题和解决方案. kafka和storm的相关知识 如果你对kafka和storm熟悉的话,这一段可以直接 ...
- Kafka客户端Producer与Consumer
Kafka客户端Producer与Consumer 一.pom.xml 二.相关配置文件 producer.properties log4j.properties base.properties 三. ...
- Kafka:Springboot整合Kafka消息队列
本文主要分享下Spring Boot和Spring Kafka如何配置整合,实现发送和接收来自Spring Kafka的消息. 项目结构 pom依赖包 <?xml version="1 ...
- SpringBoot整合Kafka
一.准备工作 提前启动zk,kafka,并且创建一个Topic("Hello-Kafk") bin/kafka-topics.sh --create --zookeeper 192 ...
- springboot 整合kafka
本文介绍如何在springboot项目中集成kafka收发message. 1.先解决依赖 springboot相关的依赖我们就不提了,和kafka相关的只依赖一个spring-kafka集成包 &l ...
- SpringBoot(八) SpringBoot整合Kafka
window下安装kafka和zooker,超详细:https://blog.csdn.net/weixin_33446857/article/details/81982455 kafka:安装下载教 ...
- Kafka的Producer和Consumer源码学习
先解释下两个概念: high watermark (HW) 它表示已经被commited的最后一个message offset(所谓commited, 应该是ISR中所有replica都已写入),HW ...
- springboot系列八、springboot整合kafka
背景: 当业务在同一时间出现高并发的时候,这个时候我们不想无限的增加服务器,但是又想提高吞吐量.这时可以考虑使用消息异步处理,进行消峰填谷:同时还可以降低耦合度.常见的消息中间件有kafka,rabb ...
随机推荐
- sqlite3数据库最大可以是多大?可以存放多少数据?读写性能怎么样?
sqlite是款不错的数据库,使用方便,不需要事先安装软件,事先建表.很多人担心它的性能和数据存储量问题. 比如有的网友问:Sqlite数据库最大可以多大呀?会不会像acc数据库那样,几十MB就暴掉了 ...
- python基础(17):正则表达式
1. 正则表达式 1.1 正则表达式是什么 正则表达式本身也和python没有什么关系,就是匹配字符串内容的一种规则. 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符 ...
- PHP+Mysql查询上一篇和下一篇文章实例
简单的PHP+Mysql查询上一篇和下一篇文章实例,并输出上一篇和下一篇文章的标题和链接,适合新手学习 获取当前浏览文章id: $id = isset($_GET['id']) > 0 ? in ...
- python web框架Flask——csrf攻击
CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click ...
- 江苏OSS用户权限修改
市场服务二部”修改为“市场二部”.“市场服务三部”修改为“市场三部”.“县域服务一部”修改为“县域一部”.“县域服务二部”修改为“县域二部”.“综合管理部”修改为“综合业务部”. SELECT * ...
- express 将 Router 实例模块化
为了更好的组织代码,将 Router 实例进行模块化,将 get / post 等快捷方式放在Router上,而不是 App 上,然后将该 Router 作为中间件,use 到 server.js 上 ...
- Linux—使用man命令:man:command not found
# 用echo $PATH查看该环境变量.这种问题一般是环境变量PATH不对的问题. [root@localhost ~]# echo $PATH # 用whereis命令查看,该指令的位置. [ro ...
- cannot resolve symbol 'XXX'
原因:出现这种情况的原因是在IDEA或者myeclipse编译器中没有导入相关的jar包(jar包相当于类的集合,可以使用其中的类): 针对IDEA出现cannot resolve symbol 'X ...
- 21.Java基础_String类
String类构造方法 package pack1; //推荐使用直接赋值的方式得到字符串 public class test { public static void main(String[] a ...
- 初学JavaScript正则表达式(七)
量词 例: \d{20}\w\d?\w+\d*\d{3}\w{3,5}\d{3,} 20次数字字符 单词字符 出现零次或一次数字字符 至少出现一次单词字符 出现任意次数字字符 出现3次数字字符 出现3 ...