【问题标题】:Kafka topic not created automatically on remote kafka after spring boot start(and create on local kafka server)春季启动启动后,Kafka主题未在远程kafka上自动创建(并在本地kafka服务器上创建)
【发布时间】:2019-08-12 03:21:01
【问题描述】:

1) 我在我的机器上启动 kafka

2) 我使用配置启动我的 Spring Boot 服务器:

@Bean
public NewTopic MyTopic() {
    return new NewTopic("my-topic", 5, (short) 1);
}

@Bean
public ProducerFactory<String, byte[]> greetingProducerFactory() {
    Map<String, Object> configProps = new HashMap<>();
    configProps.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
    configProps.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
    configProps.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ByteArraySerializer.class);
    return new DefaultKafkaProducerFactory<>(configProps);
}

@Bean
public KafkaTemplate<String, byte[]> unpMessageKafkaTemplate() {
    return new KafkaTemplate<>(greetingProducerFactory());
}

结果 - 服务器启动成功并在 kafka 中创建my-topic

但是,如果我尝试在远程服务器上使用远程 kafka 执行此操作 - 主题不会创建。

并在日志中写入:

12:35:09.880 [                  main] [INFO ]    o.a.k.clients.admin.AdminClientConfig: [] AdminClientConfig values: 
    bootstrap.servers = [localhost:9092]

如果我将此 bean 添加到配置中:

@Bean
public KafkaAdmin admin() {
    Map<String, Object> configs = new HashMap<>();
    configs.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "remote_host:9092");
    return new KafkaAdmin(configs);
}

主题创建成功。

1) 为什么会这样?

2) 我必须创建 KafkaAdmin 吗?为什么本地 Kafka 不需要?

编辑

我当前的配置:

spring:
  kafka:
    bootstrap-servers: remote:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringDeserializer
      value-serializer: org.apache.kafka.common.serialization.ByteArraySerializer

@Configuration
public class KafkaTopicConfig {

    @Value("${response.topics.topicName}")
    private String topicName;

    @Bean
    public NewTopic responseTopic() {
        return new NewTopic(topicName, 5, (short) 1);
    }

}

开始后我看到:

bootstrap.servers = [remote:9092]
    client.id = 
    connections.max.idle.ms = 300000
    metadata.max.age.ms = 300000
    metric.reporters = []
    metrics.num.samples = 2
    metrics.recording.level = INFO
    metrics.sample.window.ms = 30000
    receive.buffer.bytes = 65536

...

但没有创建主题

【问题讨论】:

    标签: spring spring-boot apache-kafka spring-kafka


    【解决方案1】:

    KafkaAdmin 是 kafka spring 对象,它在你的 spring 上下文中查找 NewTopic 对象并创建它们。如果您没有 KafkaAdmin,则不会进行创建。您可以显式创建 KafkaAdmin(如您在代码 sn-p 中所示)或通过 spring kafka 配置属性间接命令其创建。

    KafkaAdmin 很不错,它与应用程序代码主题的生产或消费无关。

    编辑

    你一定有什么问题;我刚刚测试过...

    spring:
      kafka:
        bootstrap-servers: remote:9092
    

    2019-03-21 09:18:18.354  INFO 58301 --- [           main] o.a.k.clients.admin.AdminClientConfig    
            : AdminClientConfig values: 
        bootstrap.servers = [remote:9092]
        ...
    

    【讨论】:

    • Spring Boot 会自动为你配置一个KafkaAdmin,但它使用的是application.yml(或application.properties)。见Boot properties。向下滚动到spring.kafka.bootstrap-servers=。这就是它与localhost 一起使用的原因(这是默认设置)。您也不需要ProducerFactory 或模板; boot 会根据属性为你创建它们。
    • 我编辑问题。我添加更多细节
    【解决方案2】:

    Spring Boot 会自动为您配置一个KafkaAdmin,但它使用 application.yml(或 application.properties)。见Boot properties。向下滚动到spring.kafka.bootstrap-servers=。这就是它与localhost 一起使用的原因(这是默认设置)。

    您也不需要ProducerFactory 或模板; boot 会根据属性为你创建它们。

    【讨论】:

    • 我预料到了这一点。但它不起作用。我有这个 yaml 配置:spring: kafka: bootstrap-servers: remote_host:9092 producer: key-serializer: org.apache.kafka.common.serialization.StringDeserializer value-serializer: org.apache.kafka.common.serialization.ByteArraySerializer 当我开始应用主题时,不创建
    • 如果我不需要创建ProducerFactory,我该如何自动连接kafkaTemplate?我为此创建了另一个问题:stackoverflow.com/questions/55280173/…
    • 你一定有问题;查看我的答案的编辑;对我来说很好。
    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 2019-12-20
    • 1970-01-01
    • 2020-10-24
    相关资源
    最近更新 更多