关于 kafka 中 advertised.listeners 生效问题
資深大佬 : cxyfreedom 22
使用 docker-compose 创建了 zookeep 和 kafka 的容器,配置如下:
version: '3' services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" container_name: zookeeper networks: - zk kafka: image: wurstmeister/kafka ports: - "29092:9092" environment: KAFKA_AUTO_CREATE_TOPICS_ENABLE: "false" KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://10.10.10.4:9092 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092 KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 KAFKA_CREATE_TOPICS: "topic_test:3:1" depends_on: - zookeeper container_name: kafka networks: - zk networks: zk: driver: bridge
其中,KAFKA_ADVERTISED_LISTENERS 的 OUTSIDE 的 IP 是随意写的,换成别的也可以。
INSIDE 用于 docker 内部网络来访问的,这个外网无法连接没什么问题。OUTSIDE 则是提供给外网的。但是因为 IP 是随便配置的,实际上外网本身是无法连接到 10.10.10.4:9092 的,然后客户端通过映射出来的端口 29092 ,能够连接到 Kafka ,想问一下这是为什么?
比如用 Python 的包连接:
# -*- coding:utf-8 -*- from kafka import KafkaConsumer SERVER = "100.100.21.183:29092" TOPIC = "topic_test" consumer = KafkaConsumer(bootstrap_servers=SERVER, group_id="test_group", auto_offset_reset="earliest") print(f"分区信息:{consumer.partitions_for_topic(TOPIC)}") print(f"当前 topic 和分区信息:{consumer.assignment()}") print(f"可消费偏移量:{consumer.beginning_offsets(list(consumer.assignment()))}") # output 分区信息:{0, 1, 2} 当前 topic 和分区信息:set() 可消费偏移量:{}
大佬有話說 (1)