需求描述:
在内网搭建了kafka单机服务,可以正常使用,但之后又需要将该服务共享给外网,使内外网都可以使用同一个服务。
其中内网kafka服务地址172.16.0.24:8083
,其对应外网地址39.165.69.77:8083
;
zookeeper服务地址172.16.0.24:8082
,其对应外网地址39.165.69.77:8082
解决方案:
更改kafka-server的配置文件即可
具体步骤:
1、我是在centos上搭建了kafka服务,进入安装目录cd /usr/local/kafka
,打开配置文件vim ./config/server.properties
,如下图所示:
关注listeners
和advertised.listeners
,根据注释大概可以看出,前者是对内的监听器,后者是对外的监听器。也就是说,只要配置好advertised.listeners
,就足够让外部能够访问。
2、于是修改配置advertised.listeners=PLAINTEXT//39.165.69.77:8083
,重启kafka服务,发现通过外网可以正常访问了。但新的问题来了,内网无法正常使用服务了!!!这显然有悖初衷,我是希望内外网能同时正常使用,怎么办呢?
3、重新看注释,可以知道,当advertised.listeners
配置好后,上面的listeners
就不可外部访问了,也就是说,只能是advertised.listeners
作为对外的门面。到这里答案就水落石出,我们在advertised.listeners
配置两个监听器就好了,如下图所示:
解释一下:
advertised_listeners
监听器会注册在 zookeeper 中;
当我们在内网对172.26.0.24:8084
请求建立连接,kafka 服务器会通过 zookeeper 中注册的监听器,找到 INSIDE 监听器,然后通过 listeners
中找到对应的通讯ip和端口172.26.0.24:8084
;
同理,当我们在公网对 39.165.69.77:8083
请求建立连接,kafka 服务器会通过 zookeeper 中注册的监听器,找到 OUTSIDE 监听器,然后通过 listeners
中找到对应的通讯ip和端口172.26.0.24:8083
;
总结:advertised_listeners
是对外暴露的服务端口,真正建立连接用的是 listeners
。
4、重启服务,验证ok
参考文章
https://segmentfault.com/a/1190000020715650