首先描述下我的场景环境:

    我是使用自己家里的电脑,做了公网映射和段口转发,在家庭主机上装了一台CentOS的虚拟机,IP地址分配了一个内网静态IP地址,192.168.1.117;在Centos上安装了Zookeeper和Kafka,Kafka默认使用的端口是9092,为了我在其他地方能够使用这台虚拟机上的Kafka,要把虚拟机的地址或段口映射到公网上去,使用了一个域名,kafka.mscore.cn 做映射,绑定动态IP,路由器内转发9092端口到192.168.1.117,这样我就能使用kafka.mscore.cn:9092访问家庭电脑中的kafka了

    但是,除了做公网地址的映射外,还需要配置linux上kafka的网络地址,否则不能正常连接到kafka

问题应用场景:

    1、配置外网访问

    2、配置域名访问

    3、配置端口映射访问

kafka ./config/server.properties 中正确的配置:

############################# Socket Server Settings #############################

# The address the socket server listens on. It will get the value returned from
# java.net.InetAddress.getCanonicalHostName() if not configured.
# FORMAT:
# listeners = listener_name://host_name:port
# EXAMPLE:
# listeners = PLAINTEXT://your.host.name:9092
listeners=PLAINTEXT://192.168.1.117:9092

# Hostname and port the broker will advertise to producers and consumers. If not set,
# it uses the value for "listeners" if configured. Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
advertised.listeners=PLAINTEXT://kafka.mscore.cn:9092

配置说明:

1、做外网访问的配置需要配置两处内容,listeners和advertised.listeners,listeners提供kafka的一个默认访问地址,也可以说是内网的访问地址,advertised.listeners需要填写外网的地址,可以是IP地址,也可以是域名

2、listeners 要填写内网的IP地址,单单在内网环境下使用时,可以不必配置advertised.listeners

3、advertised.listeners填写外网的IP地址,如果做了端口转发,但是并不使用域名访问,使用IP访问,需要填写外网的IP地址;如果使用域名访问,一定要填写外网访问的域名地址;advertised.listeners如果填写了kafka所在服务器的内网地址,在生产者或消费者与其连接后,返回的地址也是内网地址,相对于生产者和消费者是访问不到的