0

不使用 openfaas,通过 Java 正常连接到 Kafka。(成功的)

当被 openfaas 服务调用时,连接到 Kafka 不起作用。

当运行一个由 openfaas 创建的作为服务的函数时,它无法连接到 Kafka。(Kafka 在 Docker 上运行

docker-compose.yml :

version: '2'
services:
  zookeeper:
    container_name: zookeeper
    image: confluentinc/cp-zookeeper:latest
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - 22181:2181  

kafka:
    container_name: kafka
    image: confluentinc/cp-kafka:latest
    depends_on:
      - zookeeper
    ports:
      - 29092:29092
    environment:
      KAFKA_BROKER_ID: 1 
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,PLAINTEXT_HOST://0.0.0.0:29092      
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092 
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
Error:
Connection to node -1 (localhost/127.0.0.1:29092) could not be established. Broker may not be available.
String topic = "Request";
String KAFKA_BROKERS = "localhost:9092";

Properties props = new Properties();
            props.setProperty(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, KAFKA_BROKERS);
            props.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
            props.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonSerializer.class.getName());

producer = new KafkaProducer(props);
4

1 回答 1

0

Java 也可以在 Docker 上运行

localhost指的是那个 Java 容器,它不是 Kafka 服务。

确保您的容器在同一个 Docker 网络中运行,然后您需要使用它们的容器名称访问外部服务,例如"kafka:9092",假设容器主机名是什么。

您还需要确保KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092

于 2022-02-07T15:56:29.690 回答