如何在没有kafka服务器的情况下运行spring boot

Posted

技术标签:

【中文标题】如何在没有kafka服务器的情况下运行spring boot【英文标题】:How to run springboot without kafka server 【发布时间】:2020-07-28 04:42:52 【问题描述】:

我有一个 Spring Boot 项目,它具有使用 kafka 进行日志记录的依赖项。 我无法摆脱上述依赖,因为我的逻辑需要来自该依赖的代码

我想在不运行 kafka 的情况下在本地启动所述应用程序,以便测试我的简单数据库查找代码。

我试过禁用自动配置

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration

我尝试通过 bean 配置将 missingTopicsFatal 设置为 false

@Bean(name = "kafkaListenerContainerFactory")
public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory(
    ConsumerFactory<Object, Object> kafkaConsumerFactor,
    ConcurrentKafkaListenerContainerFactoryConfigurer configurer) 

  ConcurrentKafkaListenerContainerFactory<Object, Object> factory =
      new ConcurrentKafkaListenerContainerFactory<>();
  configurer.configure(factory, kafkaConsumerFactor);

  ContainerProperties containerProperties = factory.getContainerProperties();
  containerProperties.setMissingTopicsFatal(false);

  ...
  return factory;

但显然设置已经是错误的,因为我的应用程序运行没有失败,只是 tomcat 不想打开监听端口

我遇到的所有其他解决方案都涉及更改使用 kafka 的代码;在这种情况下,我正在使用的依赖项。但我无法更改所述依赖项。

应用程序启动但spring拒绝打开监听端口并不断循环错误

Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.

应用程序在本地运行 kafka 时运行良好,但由于 kafka 的资源使用,现在仅仅键入的行为很慢。请帮忙。

【问题讨论】:

【参考方案1】:

在我看来,您的主要问题是本地 kafka 安装的资源使用情况。也许先看看它的配置和数据。也许从新开始并清除所有本地数据?

或者,您可以在进程内运行 KafkaServer,在您的主类中像这样:

    Properties kafkaProperties = new Properties();
    kafkaProperties.setProperty("broker.id", "1");
    kafkaProperties.setProperty("host.name", "localhost");
    kafkaProperties.setProperty("listeners", "PLAINTEXT://localhost:" + kafkaPort);
    kafkaProperties.setProperty("log.dir", Files.createTempDir().getAbsolutePath());
    KafkaConfig kafkaBrokerConfig = new KafkaConfig(kafkaBrokerConfig);
    KafkaServer kafkaServer = new KafkaServer(kafkaBrokerConfig, Time.SYSTEM);
    kafkaServer.startup();

或者您可以从 Docker 运行 Kafka。参见例如docker-compose 文件https://github.com/confluentinc/examples/tree/5.4.1-post/cp-all-in-one-community.

您可能只需要 zookeeper 和 broker:

docker-compose.yml:

version: '2'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:5.4.1
    hostname: zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  broker:
    image: confluentinc/cp-kafka:5.4.1
    hostname: broker
    container_name: broker
    depends_on:
      - zookeeper
    ports:
      - "29092:29092"
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0

【讨论】:

是的,我知道我可以在其他地方启动一个服务器来运行 kafka(错过了本地测试的意义),甚至可以将它作为应用程序的一部分运行,但关键是 kafka 完全不是需要所以它甚至不应该运行。我试图找出一种方法让应用程序在没有 kafka 的情况下继续初始化。它甚至可以很好地通过飞行路径迁移并实例化所有控制器。只有不开始在tomcat上收听。如果可以为数据库完成,为什么不卡夫卡:***.com/questions/36387265/…【参考方案2】:

您可以通过 Spring 配置文件禁用整个 kafkaListenerContainerFactory bean:

@Profile("!nokafka")
@Bean(name = "kafkaListenerContainerFactory")
public ConcurrentKafkaListenerContainerFactory<?, ?> kafkaListenerContainerFactory()...

并使用 spring 配置文件“nokafka”运行您的应用程序。

例如使用最新的 spring-boot maven 插件:

mvn spring-boot:run -Dspring-boot.run.profiles=nokafka

或者通过java系统属性:

-Dspring.profiles.active=nokafka

【讨论】:

删除整个 bean 甚至不会禁用它。我添加了这一点,希望从依赖项中覆盖 bean,但我不知道要更改哪些配置属性。禁用 bean 只会让 spring 恢复到默认情况下依赖项具有的任何 containerFactory。我会将该配置文件注释添加到实际配置 kafka 的任何位置,但我无法访问所述代码

以上是关于如何在没有kafka服务器的情况下运行spring boot的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 Confluent 的情况下使用 Kafka Connect 从 Kafka 向 AWS S3 发送数据?

spring boot怎么启动kafka

当没有运行 kafka 代理时,如何禁用 Spring Cloud Stream 以用于开发目的?

如何在没有完整安装 Tomcat 的情况下运行 Spring Web 应用程序?

如何在没有 Confluent 的情况下使用 Kafka Connect for Cassandra

Spring Kafka Auto Commit Offset 在失败的情况下