我如何在内存或嵌入式kafka中实现而不是为了测试目的?

alf*_*wef 4 java spring apache-kafka spring-boot spring-kafka

我希望在仅允许 Kafka 由上述应用程序运行的环境中部署一个 Spring Boot 应用程序。我的应用程序将成为 Kafka 生产者和消费者。有没有办法在启动时运行内存实例,该实例可用于测试以外的目的?或者,有没有一种方法可以启动一个 Spring Boot 应用程序,如果它无法作为生产者和消费者连接到 Kafka,该应用程序也不会失败?

编辑:这是一个临时解决方案,直到我们能够在此环境中部署 Kafka 为止。该应用程序不生成和使用自己的记录。它是多应用程序部署的一部分,其中每个应用程序都为其他应用程序生成并使用其他应用程序 Kafka 主题。我看到很多关于消费者无法使用 Kafka 时应用程序启动的信息,但关于生产者的信息却很少。我的应用程序将同时执行这两项操作。

Gar*_*ell 8

这样的应用程序的目的是什么(生成和使用自己的记录)?嵌入式代理不适用于生产用途。

从版本 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>
Run Code Online (Sandbox Code Playgroud)
@Bean
EmbeddedKafkaBroker broker() {
    return new EmbeddedKafkaBroker(1)
            .kafkaPorts(9092)
            .brokerListProperty("spring.kafka.bootstrap-servers"); // override application property
}
Run Code Online (Sandbox Code Playgroud)

我刚刚用这个应用程序测试过...

@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");
        };
    }

}
Run Code Online (Sandbox Code Playgroud)
spring.kafka.bootstrap-servers=realKafka:9092
spring.kafka.consumer.auto-offset-reset=earliest
Run Code Online (Sandbox Code Playgroud)

编辑2

通过上述配置,同一主机上的其他应用程序可以与localhost:9092.

如果您需要远程访问此嵌入式代理,则需要一些额外的配置:

spring.kafka.bootstrap-servers=realKafka:9092
spring.kafka.consumer.auto-offset-reset=earliest
Run Code Online (Sandbox Code Playgroud)

然后您可以从其他服务器使用 进行连接10.0.0.20:9093