如何在内存或嵌入式kafka中实现而不用于测试目的?

f0brbegy  于 2021-06-04  发布在  Kafka
关注(0)|答案(1)|浏览(386)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

4个月前关门了。
改进这个问题
我想在一个只允许kafka由上述应用程序运行的环境中部署一个springboot应用程序。我的应用程序将是一个Kafka生产者和消费者。有没有一种方法可以在启动时运行一个内存中的示例,而不是用于测试?或者,有没有一种方法可以启动一个spring-boot应用程序,如果它不能作为生产者和消费者连接到kafka,它就不会失败?
编辑:这是一个临时的解决方案,直到我们能够在这个环境中部署Kafka。应用程序不会生成和使用自己的记录。它是多应用程序部署的一部分,每个应用程序同时为其他应用程序生成和使用其他应用程序kafka主题。我看到了很多关于应用程序启动的信息,当Kafka不适用于消费者时,但关于制作人的信息并不多。我的应用程序将两者兼而有之。

bejyjqdl

bejyjqdl1#

这种应用程序的目的是什么(生成和使用自己的记录)?嵌入式代理不是为生产使用而设计的。
从版本2.3.4开始,容器属性 missingTopicsFatal 默认情况下为false,这将允许容器启动,即使代理不可用。对于早期版本,可以将其设置为false以获得相同的效果。
如果为true,容器将在启动期间连接到代理以验证主题是否存在。
您还可以设置容器的 autoStartup=false 以防止容器启动。
编辑
我不建议在生产中使用它,但您可以删除 test 范围从 spring-kafka-test 宣布经纪人为 @Bean ...

<dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka-test</artifactId>
<!--            <scope>test</scope> -->
        </dependency>
@Bean
EmbeddedKafkaBroker broker() {
    return new EmbeddedKafkaBroker(1)
            .kafkaPorts(9092)
            .brokerListProperty("spring.kafka.bootstrap-servers"); // override application property
}

我刚用这个程序测试过。。。

@SpringBootApplication
public class So63812994Application {

    public static void main(String[] args) {
        SpringApplication.run(So63812994Application.class, args);
    }

    @Bean
    EmbeddedKafkaBroker broker() {
        return new EmbeddedKafkaBroker(1)
                .kafkaPorts(9092)
                .brokerListProperty("spring.kafka.bootstrap-servers");
    }

    @Bean
    public NewTopic topic() {
        return TopicBuilder.name("so63812994").partitions(1).replicas(1).build();
    }

    @KafkaListener(id = "so63812994", topics = "so63812994")
    public void listen(String in) {
        System.out.println(in);
    }

    @Bean
    public ApplicationRunner runner(KafkaTemplate<String, String> template) {
        return args -> {
            template.send("so63812994", "foo");
        };
    }

}
spring.kafka.bootstrap-servers=realKafka:9092
spring.kafka.consumer.auto-offset-reset=earliest

编辑2
通过上述配置,同一主机上的其他应用程序可以与 localhost:9092 .
如果需要远程访问此嵌入式代理,则需要一些附加配置:

@Bean
EmbeddedKafkaBroker broker() {
    return new EmbeddedKafkaBroker(1)
            .kafkaPorts(9092)
            .brokerProperty("listeners", "PLAINTEXT://localhost:9092,REMOTE://10.0.0.20:9093")
            .brokerProperty("advertised.listeners", "PLAINTEXT://localhost:9092,REMOTE://10.0.0.20:9093")
            .brokerProperty("listener.security.protocol.map", "PLAINTEXT:PLAINTEXT,REMOTE:PLAINTEXT")
            .brokerListProperty("spring.kafka.bootstrap-servers");
}

然后可以从其他服务器连接 10.0.0.20:9093 .

相关问题