Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 通过运行Docker Compose和Spring Boot的IP地址访问远程主机中的Kafka_Spring Boot_Apache Kafka_Docker Compose_Spring Kafka - Fatal编程技术网

Spring boot 通过运行Docker Compose和Spring Boot的IP地址访问远程主机中的Kafka

Spring boot 通过运行Docker Compose和Spring Boot的IP地址访问远程主机中的Kafka,spring-boot,apache-kafka,docker-compose,spring-kafka,Spring Boot,Apache Kafka,Docker Compose,Spring Kafka,我有一个docker-compose.yml,在其中我运行Zookeeper,Kafka,Kafka Connect,和KafDrop,问题是,当我在本地运行时,我可以从我的Spring Boot应用程序连接以使用一些主题消息 我需要的是在Linux机器上运行相同的配置,并且能够以相同的方式从Spring Boot应用程序进行连接 当在Linux机器上远程运行它时,一切似乎都正常运行,但是当我尝试从Spring Boot应用程序连接时,我收到一些错误消息,表明连接中存在错误 我将试着一步一步地解

我有一个docker-compose.yml,在其中我运行ZookeeperKafkaKafka ConnectKafDrop,问题是,当我在本地运行时,我可以从我的Spring Boot应用程序连接以使用一些主题消息

我需要的是在Linux机器上运行相同的配置,并且能够以相同的方式从Spring Boot应用程序进行连接

当在Linux机器上远程运行它时,一切似乎都正常运行,但是当我尝试从Spring Boot应用程序连接时,我收到一些错误消息,表明连接中存在错误

我将试着一步一步地解释,看看是否有人能“说明”这一点:

docker-compose.yml:

version: '3'

services:

  zookeeper:
    image: confluentinc/cp-zookeeper:latest
    networks: 
      - broker-kafka
    ports:
      - 2181:2181
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:latest
    networks: 
      - broker-kafka
    restart: unless-stopped
    depends_on:
      - zookeeper
    ports:
      - 9092:9092
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: 
         INTERNAL://kafka:29092,
         EXTERNAL://localhost:9092
      KAFKA_ADVERTISED_LISTENERS: 
         INTERNAL://kafka:29092,
         EXTERNAL://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: 
         INTERNAL:PLAINTEXT,
         EXTERNAL:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_LOG_RETENTION_HOURS: 12
    
  connect:
    image: cdc:latest
    networks: 
      - broker-kafka
    depends_on:
      - zookeeper
      - kafka
    ports:
      - 8083:8083
    environment:
      CONNECT_BOOTSTRAP_SERVERS: kafka:29092
      CONNECT_REST_PORT: 8083
      CONNECT_GROUP_ID: connect-1
      CONNECT_CONFIG_STORAGE_TOPIC: connect-1-config
      CONNECT_OFFSET_STORAGE_TOPIC: connect-1-offsets
      CONNECT_STATUS_STORAGE_TOPIC: connect-1-status
      CONNECT_KEY_CONVERTER: org.apache.kafka.connect.json.JsonConverter
      CONNECT_VALUE_CONVERTER: org.apache.kafka.connect.json.JsonConverter
      CONNECT_OFFSET.STORAGE.REPLICATION.FACTOR: 1
      CONNECT_CONFIG.STORAGE.REPLICATION.FACTOR: 1
      CONNECT_OFFSET.STORAGE.PARTITIONS: 1
      CONNECT_STATUS.STORAGE.REPLICATION.FACTOR: 1
      CONNECT_STATUS.STORAGE.PARTITIONS: 1
      CONNECT_REST_ADVERTISED_HOST_NAME: localhost
      
  kafdrop:
    image: obsidiandynamics/kafdrop:latest
    networks: 
      - broker-kafka
    depends_on:
      - kafka
    ports:
      - 19000:9000
    environment:
      KAFKA_BROKERCONNECT: kafka:29092
      
networks: 
  broker-kafka:
    driver: bridge
我需要的是向我的网络公开这台IP机器,让我的Spring Boot应用程序访问它。 假设这台Linux机器的IP为10.12.54.99。 我怎样才能在10.12.54.99:9090之前访问卡夫卡

这是我的application.properties:

spring.kafka.bootstrap-servers=10.12.54.99:9092

spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer

spring.kafka.consumer.enable-auto-commit=false
spring.kafka.consumer.auto-commit-interval=100
spring.kafka.consumer.max-poll-records=10
spring.kafka.consumer.key-deserializer=org.springframework.kafka.support.serializer.ErrorHandlingDeserializer
spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.ErrorHandlingDeserializer
spring.kafka.consumer.group-id=connect-sql-server
spring.kafka.consumer.auto-offset-reset=earliest

spring.kafka.listener.ack-mode=manual-immediate
spring.kafka.listener.poll-timeout=3000
spring.kafka.listener.concurrency=3

spring.kafka.properties.spring.deserializer.key.delegate.class=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.properties.spring.deserializer.value.delegate.class=org.apache.kafka.common.serialization.StringDeserializer
这是唯一一个特定于使用者的应用程序(此处不使用生产者)

运行应用程序时:

2020-12-07 10:59:40.361  WARN 58716 --- [ntainer#0-0-C-1] org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-connect-sql-server-1, groupId=connect-sql-server] Connection to node -1 (/10.12.54.99:9092) could not be established. Broker may not be available.
2020-12-07 10:59:40.362  WARN 58716 --- [ntainer#0-0-C-1] org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-connect-sql-server-1, groupId=connect-sql-server] Bootstrap broker 10.12.54.99:9092 (id: -1 rack: null) disconnected
所有防火墙端口都在Linux防火墙机器中启用


任何启示都将不胜感激。

为了能够远程访问代理,您需要绑定服务器的公共ip。但是,如果不想硬编码ip,可以使用.env文件

请执行以下操作:

  • 创建config.env文件

  • 在config.env中添加此行,并按如下方式添加主机ip:

    DOCKER_主机_IP=111.111.11.111

  • 更新docker compose:

  • 版本:“3”
    服务:
    动物园管理员:
    图片:confluentinc/cp zookeeper:最新
    网络:
    -经纪人卡夫卡
    端口:
    -${DOCKER_HOST_IP:-127.0.0.1}:2181:2181
    环境:
    ZOOKEEPER_客户端_端口:2181
    动物园管理员时间:2000
    卡夫卡:
    图片:confluentinc/cp卡夫卡:最新
    网络:
    -经纪人卡夫卡
    重新启动:除非停止
    取决于:
    -动物园管理员
    端口:
    -${DOCKER\u HOST\u IP:-127.0.0.1}:9092:9092
    环境:
    卡夫卡经纪人编号:1
    卡夫卡大学动物园管理员连接:动物园管理员:2181
    卡夫卡的听众:
    内部://kafka:29092,
    外部://localhost:9092
    卡夫卡的听众:
    内部://kafka:29092,
    外部://${DOCKER_HOST_IP:-127.0.0.1}:9092:9092
    卡夫卡侦听器安全协议映射:
    内部:纯文本,
    外部:纯文本
    卡夫卡·国际经纪人·听众·姓名:内部
    卡夫卡偏移量主题复制系数:1
    卡夫卡日志保存时间:12小时
    连接:
    图片:cdc:最新
    网络:
    -经纪人卡夫卡
    取决于:
    -动物园管理员
    -卡夫卡
    端口:
    - 8083:8083
    环境:
    连接\u引导\u服务器:kafka:29092
    连接\u REST\u端口:8083
    CONNECT\u组\u ID:CONNECT-1
    连接配置存储主题:连接1配置
    连接偏移存储主题:连接1偏移
    连接\状态\存储\主题:连接-1-状态
    CONNECT\u KEY\u转换器:org.apache.kafka.CONNECT.json.JsonConverter
    连接值转换器:org.apache.kafka.CONNECT.json.JsonConverter
    CONNECT\u OFFSET.STORAGE.REPLICATION.FACTOR:1
    CONNECT_CONFIG.STORAGE.REPLICATION.FACTOR:1
    连接\u OFFSET.STORAGE.PARTITIONS:1
    连接\u状态。存储。复制。因素:1
    连接\u STATUS.STORAGE.PARTITIONS:1
    连接\u REST\u播发的\u主机\u名称:localhost
    卡夫德罗普:
    图片:黑曜石动力学/kafdrop:最新
    网络:
    -经纪人卡夫卡
    取决于:
    -卡夫卡
    端口:
    - 19000:9000
    环境:
    卡夫卡大学经纪人联系:卡夫卡:29092
    网络:
    经纪人卡夫卡:
    
    驱动程序:bridge
    EXTERNAL://localhost:9092
    需要将
    播发的侦听器设置为远程客户端将用于连接到代理实例的实际连接(或者需要在linux主机和本地主机端口之间设置隧道)。@GaryRussell我不确定是否得到了它,“设置为实际连接”是什么意思?但是谢谢你的帮助!我的意思是你在为两个听众做广告,一个在卡夫卡上,一个在本地主机上。卡夫卡的客户在初次握手后使用此功能与经纪人进行实际连接。i、 e.您将需要
    外部://10.12.54.99:9090
    ——但我意识到这会将您的docker yaml与主机绑定;我对docker不太了解,不知道有没有更好的办法。另一个解决方案是一个SSH隧道,它将
    10.12.54.99:9090
    转发到主机上的
    localhost:9092
    ,但我希望docker有更好的方法。不幸的是,Gary是正确的。另一个解决方案是在同一个compose文件中运行Spring容器。否则,只需在主机上运行Kafka并管理其网络就更容易了way@OneCricketeer我按照你的建议做了,将spring应用程序图像放在同一个docker compose文件中,然后一起运行,即使这样它也不起作用,这太疯狂了,这一定是让它起作用的一种方法。