前言:

前面一章介绍了kafka集群的简单搭建,这章简单记录下springboot集成kafka集群的过程,首先安利一个比较简单的kafka可视化工具,之前项目里面用的是kafka-manager,功能很强大,但是对于刚入门的同学来说太过复杂。kafka-tool是一款比较简单、直观的工具,简单易懂上手快,但是功能就比较单一了。赞美的同时也希望开发这款软件的大佬可以进一步完善优化。界面的大致如下:

springboot 连接mongodb springboot 连接kafka集群_kafka

本人百度云盘的下载链接如下,链接:https://pan.baidu.com/s/1MHltOS1YLknDFq67EYURHg 
提取码:h9ls。拿走不谢。也可以在软件的官网上下载,上面的版本比较全。至于怎么安装使用特别简单,这里就不一一赘述了。

集成开始

1、新建生产者producer工程

引入pom依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- <dependency>
			<groupId>org.apache.kafka</groupId>
			<artifactId>kafka-streams</artifactId>
		</dependency> -->
		<dependency>
			<groupId>org.springframework.kafka</groupId>
			<artifactId>spring-kafka</artifactId>
</dependency>

添加项目application.yml相关配置

server:
  port: 8086
kafka:
  #kafka集群
  bootstrap_servers: http://192.168.169.143:9092,http://192.168.169.141:9092,http://192.168.169.144:9092
  #消息发送失败重发次数
  retries: 3
  #producer批量发送的基本单位,默认是16kb,即16384byte
  batch_size: 16384
  #占用缓存内存大小
  buffer_memory: 33554432
  #当batch_size不满时,停留多长时间发送,默认0不停留
  linger_ms: 100
  #这个参数决定了每次发送给Kafka服务器请求的最大大小,同时也会限制你一条消息的最大大小也不能超过这个参数设置的值
  max_request_size: 1048576
  #重发的间隔是多少毫秒 
  retries_backoff_ms: 100

核心配置类

@Configuration
public class KafkaProducerConfig {

	@Value("${kafka.bootstrap_servers}")
    private String bootstrap_servers;
    @Value("${kafka.retries}")
    private String retries;
    @Value("${kafka.batch_size}")
    private String batch_size;
    @Value("${kafka.linger_ms}")
    private String linger_ms;
    @Value("${kafka.max_request_size}")
    private String max_request_size;
    @Value("${kafka.retries_backoff_ms}")
    private String retries_backoff_ms;
    @Value("${kafka.buffer_memory}")
    private String buffer_memory;
    @Value("${kafka.topic}")

	@Bean
	public KafkaTemplate kafkaProducerTemplate () {
		HashMap<String, Object> configs = new HashMap<>();
		//kafka集群
        configs.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,bootstrap_servers);
        //#发送消息重试次数
        configs.put(ProducerConfig.RETRIES_CONFIG,retries);
        //重试的间隔是多少毫秒 
        configs.put(ProducerConfig.RETRY_BACKOFF_MS_CONFIG,retries_backoff_ms);
        //producer批量发送的基本单位,默认是16kb,即16384byte
        configs.put(ProducerConfig.BATCH_SIZE_CONFIG,batch_size);
        //当batch_size不满时,停留多长时间发送,默认0不停留
        configs.put(ProducerConfig.LINGER_MS_CONFIG,linger_ms);
        //#占用缓存内存大小
        configs.put(ProducerConfig.BUFFER_MEMORY_CONFIG,buffer_memory);
        //这个参数决定了每次发送给Kafka服务器请求的最大大小,同时也会限制你一条消息的最大大小也不能超过这个参数设置的值
        configs.put(ProducerConfig.MAX_REQUEST_SIZE_CONFIG, max_request_size);
        
        //设置序列化
        configs.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        configs.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class);

        DefaultKafkaProducerFactory producerFactory = new DefaultKafkaProducerFactory(configs);
        return new KafkaTemplate(producerFactory);
	}
}

发送方法

@Component
public class FltPositionProducer {

	@Autowired
    private KafkaTemplate kafkaProducerTemplate;
	
	public void sendMsg(List<FlightPosition> data) {
		
		for(FlightPosition fltPos : data) {
			kafkaProducerTemplate.send("hello", fltPos.getFltNo(), JsonUntil.objectToJson(fltPos));
		}
		
	}
}

KafkaTemplate的send方法中的hello为主题名,第二个参数为数据的key值,可用于防止同一key的数据进入不同的分区。举个例子,我这测试数据的单位为航班数据,我现在想保证同一航班号的变化数据进入同一分区来保证数据的顺序性。这个情况下就可以拿数据的唯一业务主键作为key值。

 

2、新建消费者consumer工程

添加pom依赖

<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- <dependency>
			<groupId>org.apache.kafka</groupId>
			<artifactId>kafka-streams</artifactId>
		</dependency> -->
		<dependency>
			<groupId>org.springframework.kafka</groupId>
			<artifactId>spring-kafka</artifactId>
</dependency>

 添加项目application.yml相关配置

server:
  port: 8087
spring:
  kafka:
    bootstrap-servers: http://192.168.169.143:9092,http://192.168.169.141:9092,http://192.168.169.144:9092
    consumer:
        #当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费。
        auto-offset-reset: earliest
        #消费者不自动提交偏移量
        enable-auto-commit: false
        key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        #Consumer每次调用poll()时取到的records的最大数。
        max-poll-records: 20000
        #(默认 1MB) – 消费者能读取的最大消息。这个值应该大于或等于kafka服务的最大接收字节数message.max.bytes
        max.partition.fetch.bytes: 1048576
        #Consumer进程的标识。如果设置一个人为可读的值,跟踪问题会比较方便。
        client-id: test1
    listener:
        concurrency: 2 #每个consumer起的处理消息的核心线程数,跟consumer节点多少关系不大
        #当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后, 手动调用Acknowledgment.acknowledge()后提交
        ack-mode: MANUAL

消费者监听类

@Component
public class FltPositionConsumer {

	private static final Logger LOGGER = LoggerFactory.getLogger(FltPositionConsumer.class);
	 @KafkaListener(topics = "hello", groupId = "consumer-group") 
	public void topic_test(ConsumerRecord<?, ?> record, Acknowledgment ack) {
		if(record.value() != null) {
			LOGGER.info("可以接收到消息,消息体为:"+record.value());
		}
		//手动提交offset
	    ack.acknowledge();
	}
}

3、启动测试

分别启动生产者、消费者,进行测试

springboot 连接mongodb springboot 连接kafka集群_数据_02

springboot 连接mongodb springboot 连接kafka集群_spring_03

springboot 连接mongodb springboot 连接kafka集群_数据_04

测试成功,且key值相同的数据只会进一个分区里面,以保证数据的顺序性。