springboot整合kafka实现消息的生产与消费--消息的生产

由于工作需要,最近在研究springboot整合kafka。做一个分布式的同步应用程序。springboot整合kafka须注意版本。对于springboot 1.5版本之前的话,需要自己去配置java configuration,而1.5版本以后则提供了auto config,具体详见org.springframework.boot.autoconfigure.kafka这个包,springboot集成kafka的默认配置都在这个包里面。

springboot整合kafka实现消息的生产与消费--消息的生产_第1张图片


springboot实现kafka的消息生产者

    从kafka的角度来看,消息生产者要做的事情无非就是把消息发送到指定的topic。这个流程还是比较简单的。

    spring-kafka提供了KafkaTemplate包装了一个生产者,并提供了方便的方法将数据发送到kafka的主题。

     KafkaTemplate提供的发送消息方法:springboot整合kafka实现消息的生产与消费--消息的生产_第2张图片

    从方法传的参数我们知道KafkaTemplate可以向指定主题、分区,还有主题中的Key(如果有的话)发送消息。利用Springboot(1.5版本及以上)整合kafka实现消息发送比较简单。

1、创建一个springboot工程。导入kafka相关依赖,注意spring版本与kafka对应版本需要对应。我的springboot版本是2.0.2,spring-kafka的版本是2.1.0。

springboot整合kafka实现消息的生产与消费--消息的生产_第3张图片    

添加spring-kafka依赖:

<dependency>
   <groupId>org.springframework.kafkagroupId>
   <artifactId>spring-kafkaartifactId>
   <version>2.1.0.RELEASEversion>
dependency>
Kafka生产者配置类:

package com.rose.kafka.config;

import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
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.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;

import java.util.HashMap;
import java.util.Map;

@Configuration
@EnableKafka
public class KafkaProducerConfig {

    //从配置文件中引入Kafka生产这的相关配置的值
    //kakfa服务端地址
    @Value("${kafka.producer.servers}")
    private String servers;
    //消息发送失败重试次数
    @Value("${kafka.producer.retries}")
    private int retries;
    //消息批量发送容量
    @Value("${kafka.producer.batch.size}")
    private int batchSize;
    @Value("${kafka.producer.linger}")
    private int linger;
    //缓存容量
    @Value("${kafka.producer.buffer.memory}")
    private int bufferMemory;

    /**
     * 生产者相关配置
     * @return
     */
    public Map<String, Object> producerConfigs() {
        Map<String, Object> props = new HashMap<>();
        System.out.println("-----------------servers---------");
        System.out.println(servers);
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, servers);
        props.put(ProducerConfig.RETRIES_CONFIG, retries);
        props.put(ProducerConfig.BATCH_SIZE_CONFIG, batchSize);
        props.put(ProducerConfig.LINGER_MS_CONFIG, linger);
        props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, bufferMemory);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        return props;
    }

    /**
     * 生产者创建工厂
     * @return
     */
    public ProducerFactory<String, String> producerFactory() {
        return new DefaultKafkaProducerFactory<>(producerConfigs());
    }

    /**
     * kafkaTemplate 覆盖默认配置类中的kafkaTemplate
     * @return
     */
    @Bean
    public KafkaTemplate<String, String> kafkaTemplate() {
        return new KafkaTemplate<String, String>(producerFactory());
    }
}

其中@EnableKafka表明使用springboot默认的Kafka配置,对应KafkaAutoConfiguration这个配置类。这个类中配置了一些创建Kafka生产者与消费者的Bean。如果使用默认则不作更改,如需更改覆盖相同的Bean即可。这也符合springboot的约定优于配置的原则。

springboot整合kafka实现消息的生产与消费--消息的生产_第4张图片


之前的博客已经介绍过如何搭建简单的kafka集群以及创建Topic等。Kafka集群简单部署

创建Topic kafkaTest。

[jack@localhost kafka_2.11-1.0.0]$ bin/kafka-topics.sh --create --zookeeper 192.168.66.94:2181 --replication-factor 1 --partitions 1 --topic kafkaTest

下面进行简单的发送消息测试,通过springboot中的生产这向kafka集群发送消息。

springboot整合kafka实现消息的生产与消费--消息的生产_第5张图片

访问http://localhost:7004/sendData/sendMessageTest?message=kafkaTest Message

springboot整合kafka实现消息的生产与消费--消息的生产_第6张图片

消息发送成功。在kafka客户端用命令查看kafkaTest主题下的消息:

[root@localhost kafka_2.11-1.0.0]# bin/kafka-console-consumer.sh --zookeeper 192.168.66.94:2181 --topic kafkaTest --from-beginning

springboot整合kafka实现消息的生产与消费--消息的生产_第7张图片

消息发送成功。springboot集成Kafka实现消息发送还是比较简单的。我在尝试的时候也遇到过一些小问题,比如项目跑起来后发送消息报org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms的错误。这种错误一般是一下三种原因造成的。我的是由于linux防火墙为关闭(或者开放相应的端口也可)。

问题原因:

1. java client 包与kafka server 版本不一致


2、/kafka_2.11-0.9.0.0/config/server.properties 


listerners 需配置ip ,不能配置主机名,因本地Hosts中不存在对应的Ip配置,导致producer 无法连接

解决办法:linux防火墙未关闭,导致连不上kafka服务器。

  linux防火墙关闭: service iptables stop 

springboot整合Kafka实现消息的生产与消费项目地址:项目Github地址。项目中已经完成了springboot整合kafka实现消息发送与生产。本文中只介绍了消息的发送,消息的消费将在后续进行总结。

小结:学习新技术最好先了解一下技术的大体框架和设计思想。多看看相关的官方API文档。官方文档应该是比较靠谱的。就是英文看着有点头疼!下个词典就好了,意思也能看个大概。spring_kafka官方文档

你可能感兴趣的:(微服务)