介绍区别
在公司内网部署 kafka
集群只需要用到 listeners
,所以一直也不用管 advertised.listeners
是做啥的,刚开始有查过,因为经验不足,始终理解的不够,后来发现在 docker
部署和云服务器上部署,内外网需要作区分时,发挥了它强大的作用。
那么先看看文字类描述:
-
listeners
: 学名叫监听器,其实就是告诉外部连接者要通过什么协议访问指定主机名和端口开放的Kafka
服务。 -
advertised.listeners
:和listeners
相比多了个advertised
。Advertised
的含义表示宣称的、公布的,就是说这组监听器是Broker
用于对外发布的。
比如说:
listeners: INSIDE://172.17.0.10:9092,OUTSIDE://172.17.0.10:9094
advertised_listeners: INSIDE://172.17.0.10:9092,OUTSIDE://<公网 ip>:端口
kafka_listener_security_protocol_map: "INSIDE:SASL_PLAINTEXT,OUTSIDE:SASL_PLAINTEXT"
kafka_inter_broker_listener_name: "INSIDE"
advertised_listeners
监听器会注册在 zookeeper
中;
当我们对 172.17.0.10:9092
请求建立连接,kafka
服务器会通过 zookeeper
中注册的监听器,找到 INSIDE
监听器,然后通过 listeners
中找到对应的 通讯 ip
和 端口;
同理,当我们对 <公网 ip>:端口
请求建立连接,kafka
服务器会通过 zookeeper
中注册的监听器,找到 OUTSIDE
监听器,然后通过 listeners
中找到对应的 通讯 ip
和 端口 172.17.0.10:9094
;
总结:advertised_listeners
是对外暴露的服务端口,真正建立连接用的是 listeners
。
什么场景用到
只有内网
比如在公司搭建的 kafka
集群,只有内网中的服务可以用,这种情况下,只需要用 listeners
就行
listeners: <协议名称>://<内网ip>:<端口>
例如:
listeners: SASL_PLAINTEXT://192.168.0.4:9092
内外网
在 docker
中或者 在类似阿里云主机上部署 kafka
集群,这种情况下是 需要用到 advertised_listeners
。
以 docker
为例:
listeners: INSIDE://0.0.0.0:9092,OUTSIDE://0.0.0.0:9094
advertised_listeners: INSIDE://localhost:9092,OUTSIDE://<宿主机ip>:<宿主机暴露的端口>
kafka_listener_security_protocol_map: "INSIDE:SASL_PLAINTEXT,OUTSIDE:SASL_PLAINTEXT"
kafka_inter_broker_listener_name: "INSIDE"