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消费者的更多相关文章

  1. kafka消费者客户端(0.9.0.1API)

    转自:http://orchome.com/203 kafka客户端从kafka集群消费消息(记录).它会透明地处理kafka集群中服务器的故障.它获取集群内数据的分区,也和服务器进行交互,允许消费者 ...

  2. Kafka消费者-从Kafka读取数据

    (1)Customer和Customer Group (1)两种常用的消息模型 队列模型(queuing)和发布-订阅模型(publish-subscribe). 队列的处理方式是一组消费者从服务器读 ...

  3. Python 基于pykafka简单实现KAFKA消费者

    基于pykafka简单实现KAFKA消费者   By: 授客 QQ:1033553122         1.测试环境 python 3.4 zookeeper-3.4.13.tar.gz 下载地址1 ...

  4. Kafka集群安装部署、Kafka生产者、Kafka消费者

    Storm上游数据源之Kakfa 目标: 理解Storm消费的数据来源.理解JMS规范.理解Kafka核心组件.掌握Kakfa生产者API.掌握Kafka消费者API.对流式计算的生态环境有深入的了解 ...

  5. Kafka权威指南 读书笔记之(四)Kafka 消费者一一从 Kafka读取数据

    KafkaConsumer概念 消费者和消费者群组 Kafka 消费者从属于消费者群组.一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息. 往群组里增加消费者是横向伸缩消费能力 ...

  6. kafka 消费者 timeout 6000

    kafka 消费者 timeout 6000 1:查看zookeeper 的状态,kafka默认是自带zookeeper配置,我建议安装单独的zookeeper  服务,并且配置文件也很简单..直接改 ...

  7. Kafka消费者APi

    Kafka客户端从集群中消费消息,并透明地处理kafka集群中出现故障服务器,透明地调节适应集群中变化的数据分区.也和服务器交互,平衡均衡消费者. public class KafkaConsumer ...

  8. kafka 消费者offset记录位置和方式

    我们大家都知道,kafka消费者在会保存其消费的进度,也就是offset,存储的位置根据选用的kafka api不同而不同. 首先来说说消费者如果是根据javaapi来消费,也就是[kafka.jav ...

  9. 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 ...

  10. JAVA封装消息中间件调用二(kafka消费者篇)

    上一遍我简单介绍了kafka的生成者使用,调用方式比较简单,今天我给大家分享下封装kafka消费者,作为中间件,我们做的就是最大程度的解耦,使业务方接入我们依赖程度降到最低. 第一步,我们先配置一个消 ...

随机推荐

  1. sshpass 免密码进行文件复制的方法

    1. 部分centos8 没有安装 sshpass 需要先安装 sshpass yum install sshpass 2. 需要增加一个配置文件, 避免因为 stickhost 检查 造成命令失效 ...

  2. vue面试题(一)正在重新整理

    1.输入一个 URL到浏览器整个过程发生了什么?ok 1.浏览器查找当前 URL是否存有缓存,并检查这个缓存是否过期 2.DNS 解析 URL 对应的 IP 3.根据 IP 建立 TCP 连接(三次握 ...

  3. 自动部署(apb docker cicd gitlab)

    1.安装gitlab-runner docker pull gitlab/gitlab-runner:latest 2.运行镜像 docker run -d --name gitlab-runner ...

  4. Redis启用认证

    要在Redis中启用认证,您需要在Redis配置文件中设置requirepass指令.以下是步骤: 找到Redis配置文件.这通常是redis.conf,可能位于/etc/redis/或/etc/目录 ...

  5. 在不同电脑间同步pycharm的配置

    备份文件同步法 最传统的方法就是把配置文件备份,然后在其它电脑上通过导入的方式来恢复,这种方法在很多软件中都实测可行. 具体对应到pycharm中,可以在pycharm菜单栏file - export ...

  6. Django笔记四十二之model使用validator验证器

    本文首发于公众号:Hunter后端 原文链接:Django笔记四十二之model使用validator验证器 这一篇笔记介绍一下 model 里的 validator 验证器. 首先,这是个什么东西呢 ...

  7. nginx入门之基础配置

    1.配置文件 nginx 的配置文件是 /etc/nginx/nginx.conf,其目录结构大致为: main #全局配置,对全局生效 events { #nginx工作模式配置,配置影响 Ngin ...

  8. ***.jar没有主清单属性

    工具环境 idea centos7.9 现象 java -jar运行jar包提示没有主清单属性,如下图所示: 这个jar包,是通过idea打包的,打包方法:idea---File---Project ...

  9. Win12不会取代Win11!真正目标是Google

    Windows 11之后自然应该是Windows 12,但这一次不太一样. 据多个消息源确认,Windows的下一个重大版本将不会是Windows 11的直接升级版,而是更专注于云和Web,同时大力接 ...

  10. linux 搭建http文件服务器

    1.安装httpd服务 yum -y install httpd 2.修改需要访问的文件路径 vi /etc/httpd/conf/httpd.conf ##默认是/var/www/html目录下的文 ...