赞
踩
Kafka部署在内网,内网Java服务会使用Kafka收发消息,另外,Java服务会与其他第三方系统使用kafka实现数据同步,也就是外网也会发送消息到kafka,外网IP做了端口映射到了内网,advertised.listeners
配置了外网ip端口,所以这里的问题就是内网程序发送kafka消息也会走到外网,这样会有部分连接出现超时错误,所以这种方式不太合理。
参考网上内外网分流方式进行处理,外部访问kafka通过公网连接,内部程序使用内网访问。
含义:用于指定Kafka Broker实际监听的地址和端口,listeners 的格式通常是:协议名称://主机名或IP地址:端口
,可以同时配置多个, 并且用逗号隔开,监听器的名称和端口必须是唯一的,端口相同,就冲突了。
示例:
listeners=PLAINTEXT://your.host.name:9092
在这个示例中,Kafka Broker将监听your.host.name这个主机名上的9092端口,并使用PLAINTEXT协议(即不加密的文本协议)。
含义:
Kafka 服务器对外宣传的端点信息,它会将地址注册到Zookeeper中,用于告诉客户端应该连接到哪个地址和端口,也就是客户端真正要访问的地址。advertised.listeners
的格式与 listeners
类似,但是可以指定不同的地址或端口,如果没有配置,则默认值和listener
一样,另外,advertised.listeners
不支持0.0.0.0
这种形式, 所以如果listeners
属性设置成0.0.0.0
,则必须设置advertised.listeners
属性。
示例:
listeners=PLAINTEXT://internal.host.name:9092
advertised.listeners=PLAINTEXT://external.host.name:9092
在这个示例中,Kafka Broker在内部网络上监听internal.host.name
这个主机名上的9092端口,但向外部客户端公布external.host.name
这个主机名上的9092端口作为连接地址。
kakfa配置文件config/server.properties修改前:
listeners=PLAINTEXT://172.20.0.147:9092
advertised.listeners=PLAINTEXT://10.103.25.230:9092
修改后:
listeners=INSIDE://:19092,OUTSIDE://:9092
advertised.listeners=INSIDE://172.20.0.147:19092,OUTSIDE://10.103.25.230:9092
listener.security.protocol.map=INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
inter.broker.listener.name=INSIDE
说明:
listeners
这里设置了2个监听器,监听了所有IP的两个端口,19092为内网kafka使用端口,9092为外部访问端口advertised.listeners
的信息,因为这里OUTSIDE配置的外网IP,当客户端通过10.103.25.230访问kafka时,请求就会被之前配置的映射进行转发,被转发到内网ip,从而完成对kafka的访问。listener.security.protocol.map
为监听器名称和安全协议之间的映射关系集合,PLAINTEXT表示明文inter.broker.listener.name
用于broker之间通信的listener
名称,如果未设置,则listener
名称由 security.inter.broker.protocol
定义(security.inter.broker.protocol
默认值是PLAINTEXT)org.apache.kafka.common.KafkaException: Socket server failed to bind to 10.103.25.230:9092: Cannot assign requested address.
解决方案:
将listeners
由原来固定IP修改为:
listeners=INSIDE://:19092,OUTSIDE://:9092
参考链接:
https://juejin.cn/post/6893410969611927566
https://www.confluent.io/blog/kafka-listeners-explained/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。