Springboot+kafka创建topic

2,695 阅读1分钟

springboot一般创建topic方式, 多个的话会很冗余

@Bean
public NewTopic myTopic() {

    return new NewTopic(myTopic, 2, (short) 1);

}

缺点: Topic 信息不清晰; 代码量庞大

优化处理

  • 配置 application.xml 配置文件中配置 Kafka 连接信息以及我们项目中用到的 topic
server:
  port: 9090
spring:
  kafka:
    bootstrap-servers: localhost:9092

kafka:
  topics:
    - name: topic1
      num-partitions: 3
      replication-factor: 1
    - name: topic2
      num-partitions: 1
      replication-factor: 1
    - name: topic3
      num-partitions: 2
      replication-factor: 1
  • 文件注入
@Configuration
@ConfigurationProperties(prefix = "kafka")
@Setter
@Getter
@ToString
public class TopicConfigurations {

    private List<Topic> topics;

    @Setter
    @Getter
    @ToString
    public static class Topic {
        String name;
        Integer numPartitions = 3;
        Short replicationFactor = 1;
        NewTopic toNewTopic() {
            return new NewTopic(this.name, this.numPartitions, this.replicationFactor);
        }
    }
}
  • 项目启动初始化topic
@Configuration
@EnableConfigurationProperties(TopicConfigurations.class)
public class TopicAdministrator {
    private final TopicConfigurations topicConfig;
    private final GenericWebApplicationContext context;

    public TopicAdministrator(TopicConfigurations topicConfig, GenericWebApplicationContext genericContext) {
        this.topicConfig = topicConfig;
        this.context = genericContext;
    }

    /**项目启动时进行初始化**/
    @PostConstruct
    public void init() {
        initializeBeans(topicConfig.getTopics());
    }

    private void initializeBeans(List<TopicConfigurations.Topic> topics) {
        topics.forEach(
            t -> context.registerBean(t.name, NewTopic.class, t::toNewTopic)
        );
    }

}

kafka客户端命令创建topic

./kafka-topics.sh --zookeeper localhost:2181 --create --topic test --replication-factor 3 --partitions 2

./kafka-topics.sh --bootstrap-servers localhost:2181 --create --topic test --replication-factor 3 --partitions 2

#bootstrap-servers vs zookeeper
bootstrap-servers指的是目标集群的服务器地址
  • 关系 kafka系统依赖zookeeper系统的分布式管理,Zookeeper是开源的分布式应用协调系统