SpringCloud使用Kafka消费者
POM文件配置
<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.0http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.donwait</groupId>
<artifactId>my-kafka-demon</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- spring boot项目 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<!-- 项目属性:子模块不能引用父项目的properties变量 -->
<properties>
<!-- 系统全局版本号信息: 所有服务会继承 -->
<dys.global.version>1.0.0.1</dys.global.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
<!-- <spring-cloud.version>Finchley.BUILD-SNAPSHOT</spring-cloud.version>-->
<lombok.version>1.16.20</lombok.version>
</properties>
<!-- 项目依赖:特殊强制依赖,其他继承父亲 -->
<dependencies>
<!--spring boot测试-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 监控系统健康情况的工具 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--Lombok:消除模板代码-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- logback日志包 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</dependency>
<!-- SpringMVC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- kafka客户端 -->
<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>
</dependencies>
<!-- 编译插件 -->
<build>
<plugins>
<!--spring boot maven插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
注意:
(1)引入kafka客户端
<!-- kafka客户端 -->
<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>
2)添加springboot-maven插件
<!-- 编译插件 -->
<build>
<plugins>
<!--spring boot maven插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
创建kafka配置
package com.donwait.config;
import java.util.HashMap;
import java.util.Map;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
@Configuration
@EnableKafka
public class KafkaConfig {
@Value("${kafka.broker-list}")
private String brokers;
@Value("${kafka.producer.retries}")
private Integer producer_retries;
@Value("${kafka.producer.batch-size}")
private Integer producer_batch_size;
@Value("${kafka.producer.linger-ms}")
private Integer producer_linger_ms;
@Value("${kafka.producer.buffer-memory}")
private Integer producer_buffer_memory;
@Value("${kafka.producer.key-serializer}")
private String producer_key_serializer;
@Value("${kafka.producer.value-serializer}")
private String producer_value_serializer;
@Value("${kafka.consumer.topic}")
private String consumer_topic;
@Value("${kafka.consumer.gourp-id}")
private String consumer_gourp_id;
@Value("${kafka.consumer.enable-auto-commit}")
private boolean consumer_enable_auto_commit;
@Value("${kafka.consumer.auto-commit-ms}")
private String consumer_auto_commit_ms;
@Value("${kafka.consumer.session-timeout-ms}")
private String consumer_session_timeout_ms;
@Value("${kafka.consumer.key-deserializer}")
private String consumer_key_deserializer;
@Value("${kafka.consumer.value-deserializer}")
private String consumer_value_deserializer;
@Bean
ConcurrentKafkaListenerContainerFactory<Integer, String> kafkaListenerContainerFactory() {
ConcurrentKafkaListenerContainerFactory<Integer, String> factory = new ConcurrentKafkaListenerContainerFactory<>();
factory.setConsumerFactory(consumerFactory());
return factory;
}
@Bean
public ConsumerFactory<Integer, String> consumerFactory() {
return new DefaultKafkaConsumerFactory<>(consumerConfigs());
}
/**
* 消费者参数配置
* @return
*/
@Bean
public Map<String, Object> consumerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers);
props.put(ConsumerConfig.GROUP_ID_CONFIG, consumer_gourp_id);
props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, consumer_enable_auto_commit);
props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, consumer_auto_commit_ms);
props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, consumer_session_timeout_ms);
props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, consumer_key_deserializer);
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, consumer_value_deserializer);
return props;
}
@Bean
public ProducerFactory<String, String> producerFactory() {
return new DefaultKafkaProducerFactory<>(producerConfigs());
}
/**
* 生产者参数配置
* @return
*/
@Bean
public Map<String, Object> producerConfigs() {
Map<String, Object> props = new HashMap<>();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, brokers);
props.put(ProducerConfig.RETRIES_CONFIG, producer_retries);
props.put(ProducerConfig.BATCH_SIZE_CONFIG, producer_batch_size);
props.put(ProducerConfig.LINGER_MS_CONFIG, producer_linger_ms);
props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, producer_buffer_memory);
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, producer_key_serializer);
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, producer_value_serializer);
return props;
}
@Bean
public KafkaTemplate<String, String> kafkaTemplate() {
System.out.println("init");
return new KafkaTemplate<String, String>(producerFactory());
}
}
系统配置信息
系统的application.yml配置内容如下:
#服务配置
server:
port: 7002
spring:
application:
name: kafka
#日志信息配置
logging:
level:
org.springframework.cloud.gateway: TRACE
org.springframework.http.server.reactive: DEBUG
org.springframework.web.reactive: DEBUG
reactor.ipc.netty: DEBUG
#Spring Boot Actuator:监控系统配置
endpoints:
shutdown:
enabled: true
path: /shutdown
sensitive: true
management:
security:
enabled: false
kafka:
broker-list: 192.168.12.150:9092,192.168.12.151:9092,192.168.12.152:9092
producer:
#发送失败后的重试次数,默认0
retries: 1
#以字节为单位控制默认的批量大小
batch-size: 0
#延迟时间
linger-ms: 1
#缓冲等待发送到服务器的记录的总内存字节数
buffer-memory: 33554432
#实现Serializer接口的序列化类键
key-serializer: org.apache.kafka.common.serialization.StringSerializer
#实现Serializer接口的序列化类值
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
#消费的主题
topic: test-topic
#消费者组id
gourp-id: test-group
#是否自动提交偏移量
enable-auto-commit: true
#提交偏移量的间隔-毫秒
auto-commit-ms: 1000
#客户端消费的会话超时时间-毫秒
session-timeout-ms: 10000
#实现DeSerializer接口的反序列化类键
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
#实现DeSerializer接口的反序列化类值
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
启动入口
如果不需要测试生产者入口为:
package com.donwait;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.kafka.annotation.KafkaListener;
import lombok.extern.slf4j.Slf4j;
/**
* 实现命令行接口,从命令行读取参数发送
* @author Administrator
*
*/
@SpringBootApplication
@Slf4j
public class KafkaApp {
/**
* kafka消费
* @param cr
* @throws Exception
*/
@KafkaListener(topics = "test-topic")
public void listen(ConsumerRecord<String, String> cr) throws Exception {
log.info("我是消费者:{}:{}", cr.key(), cr.value());
//latch.countDown();
}
public static void main(String[] args) {
SpringApplication.run(KafkaApp.class, args).close();
}
}
如果需要测试生产者,则实现命令中发送数据即可:
package com.donwait;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
importorg.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import lombok.extern.slf4j.Slf4j;
/**
* 实现命令行接口,从命令行读取参数发送
* @author Administrator
*
*/
@SpringBootApplication
@Slf4j
public class KafkaApp implements CommandLineRunner {
// kafka模板
@Autowired
private KafkaTemplate<String, String> template;
// 计数器-等待3个消息接收完成
private final CountDownLatch latch = new CountDownLatch(3);
@Override
public void run(String... args) throws Exception {
System.out.println("发送信息...");
this.template.send("test-topic", "foo1");
this.template.send("test-topic", "foo2");
this.template.send("test-topic", "foo3");
// 等待60秒接收完成退出
latch.await(60, TimeUnit.SECONDS);
log.info("接收完成");
}
/**
* kafka消费
* @param cr
* @throws Exception
*/
@KafkaListener(topics = "test-topic")
public void listen(ConsumerRecord<String, String> cr) throws Exception {
log.info("我是消费者:{}:{}", cr.key(), cr.value());
//latch.countDown();
}
public static void main(String[] args) {
SpringApplication.run(KafkaApp.class, args).close();
}
}
SpringCloud使用Kafka消费者的更多相关文章
- kafka消费者客户端(0.9.0.1API)
转自:http://orchome.com/203 kafka客户端从kafka集群消费消息(记录).它会透明地处理kafka集群中服务器的故障.它获取集群内数据的分区,也和服务器进行交互,允许消费者 ...
- Kafka消费者-从Kafka读取数据
(1)Customer和Customer Group (1)两种常用的消息模型 队列模型(queuing)和发布-订阅模型(publish-subscribe). 队列的处理方式是一组消费者从服务器读 ...
- Python 基于pykafka简单实现KAFKA消费者
基于pykafka简单实现KAFKA消费者 By: 授客 QQ:1033553122 1.测试环境 python 3.4 zookeeper-3.4.13.tar.gz 下载地址1 ...
- Kafka集群安装部署、Kafka生产者、Kafka消费者
Storm上游数据源之Kakfa 目标: 理解Storm消费的数据来源.理解JMS规范.理解Kafka核心组件.掌握Kakfa生产者API.掌握Kafka消费者API.对流式计算的生态环境有深入的了解 ...
- Kafka权威指南 读书笔记之(四)Kafka 消费者一一从 Kafka读取数据
KafkaConsumer概念 消费者和消费者群组 Kafka 消费者从属于消费者群组.一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息. 往群组里增加消费者是横向伸缩消费能力 ...
- kafka 消费者 timeout 6000
kafka 消费者 timeout 6000 1:查看zookeeper 的状态,kafka默认是自带zookeeper配置,我建议安装单独的zookeeper 服务,并且配置文件也很简单..直接改 ...
- Kafka消费者APi
Kafka客户端从集群中消费消息,并透明地处理kafka集群中出现故障服务器,透明地调节适应集群中变化的数据分区.也和服务器交互,平衡均衡消费者. public class KafkaConsumer ...
- kafka 消费者offset记录位置和方式
我们大家都知道,kafka消费者在会保存其消费的进度,也就是offset,存储的位置根据选用的kafka api不同而不同. 首先来说说消费者如果是根据javaapi来消费,也就是[kafka.jav ...
- springcloud 集成kafka问题记录,发消息报错:ERROR o.s.kafka.support.LoggingProducerListener - Exception thrown when sending a message with key='null' and payload='{-1,
在springcloud集成kafka,发送消息时报错: 2018-08-15 16:01:34.159 [http-nio-8081-exec-1] INFO org.apache.kafka.c ...
- JAVA封装消息中间件调用二(kafka消费者篇)
上一遍我简单介绍了kafka的生成者使用,调用方式比较简单,今天我给大家分享下封装kafka消费者,作为中间件,我们做的就是最大程度的解耦,使业务方接入我们依赖程度降到最低. 第一步,我们先配置一个消 ...
随机推荐
- NOI2023 游记
不完全按时间顺序写.记录 NOI 的一些琐事. 从 XDFZ 坐大巴 5 个小时来到成七.第一眼看到的是一个放着 NOI 牌子的台阶,还有一个签名墙.好像在我们之前到的人不太多? 用中英双语签名(冷月 ...
- 微信小程序-获取用户位置
首先我要提供几个文档的链接地址: 首先是官方文档的获取用户位置的API文档地址: 官方文档地址:https://developers.weixin.qq.com/miniprogram/dev/api ...
- C/C++ 动态解密释放ShellCode
今天在复习<加密与解密>时,在软件保护这一章中有一个代码与数据结合的案例,其原理是将代码段中的代码进行xor异或加密处理以后回写到原始位置,当程序运行后将此处的内容动态的进行解密,解密后回 ...
- 分布式压测之locust和Jmeter的使用
受限于单台机器的配置问题,我们在单台机器上达不到一个很高的压测并发数,那这个时候就需要引入分布式压测 分布式压测原理: 一般通过局域网把不同测试计算机链接到一起,达到测试共享.分散操作.集中管理的目的 ...
- Linux提取日志中的IP地址并去重
原日志文件:logger.log 内容: {"peer":"kts_001","type":"http"," ...
- 关于Windows11的优化内容 - 进阶者系列 - 学习者系列文章
这几天无事,想起上次刚重装的Windows 11操作系统,对于系统优化的内容想记录一下,以前没写过相关的博文,这次就做个记录吧.对于Windows 11,已经出来几年了,相关的设置啥的也有,就是优化方 ...
- Intel 4工艺太难了!酷睿Ultra终于突破5GHz
无论是14nm还是10nm,Intel这些年的新工艺都有一个通性:刚诞生的时候性能平平,高频率都上不去,只能用于笔记本移动端(分别对应5代酷睿.10代酷睿),后期才不断成熟,比如到了13代酷睿就达到史 ...
- ch57x/ch58x开启仿真
本次使用的平台是MounRiver Studio,使用的是WCH的CH582m与WCH-LinkE 仿真之前确保LinkE处在Risc-V模式下 空闲时蓝灯常灭 Step1:首先通过ISP工具开启两 ...
- Raise发现
procedure TForm2.Button1Click(Sender: TObject); var MyWoKao: string; I: Integer; begin try try I := ...
- 《ASP.ENT Core 与 RESTful API 开发实战》-- (第4章)-- 读书笔记(下)
第 4 章 资源操作 4.5 创建资源 由于创建资源的 Id 会在服务端生成,因此在创建资源时,不建议使用与获取数据时相同的 DTO,而要单独创建一个新的 DTO 类,并通过数据注解特性对相应 的属性 ...