前置
最近疫情原因在家办公,环境受限,需要部署一台能外网访问的kafka进行联调
公司的外网环境是通过防火墙(或其他的,沟通硬件同事处理的),把内网的服务器的部分端口映射到一台外网服务器的端口上
举个例子就是如果把服务器上的tomcat端口8080映射到外网的9090,那么外网就应该使用外网ip:9090访问,通过防火墙映射之后实际访问的就是内网ip:8080
问题
最近服务器上的环境都是通过docker部署的(真香警告),所以kafka也准备dock-compose顺带部署zookeeper,使用的是wurstmeister/kafka镜像,在编写docker-compose的时候,environment中的KAFKA_ADVERTISED_LISTENERS配置项,配置为docker宿主机ip端口不行,配置为外网ip端口也不行,一下午都没有解决问题,晚上饭前突然在B站想搜下这个问题,没想到真看到了问题的关键,在此感谢av86383539的UP主,虽然没有联系上UP主解决问题,但是思路很重要,说出来你们可能不信,我居然真的在B站搞学习
解决
在这里发个小牢骚,国内的技术网站都没找到和kafka,inside和outside相关的,部署kafka全部都是verson2版本的docker-compose,不是说不能用,而是重复的内容互相抄,千篇一律,给搜索造成了较大的困扰
配置文件:docker-compose.yml
version: "3"
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "19005:2181"
kafka:
image: wurstmeister/kafka
hostname: kafka
ports:
- "19004:19004"
environment:
TZ: CST-8
KAFKA_BROKER_ID: 3
KAFKA_ADVERTISED_HOST_NAME: kafka
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_LISTENERS: INSIDE://:9092,OUTSIDE://:19004
KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9092,OUTSIDE://{外网ip}:19004
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE
volumes:
- /var/run/docker.sock:/var/run/docker.sock
links:
- zookeeper
大致解释下:
KAFKA_LISTENERS和KAFKA_ADVERTISED_LISTENERS,配置内网(INSIDE)的9092和外网(OUTSIDE)的19004,kafka将同时监听这两个地址,配置时只需要修改端口,并把配置文件中{外网ip}替换为真实的,此次配置的重点
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP是配置协议
KAFKA_INTER_BROKER_LISTENER_NAME是指kafka集群时内部访问使用的默认方式
PS:zookeeper也映射出来了,小伙伴根据实际情况,不影响
结尾
测试使用kafka tool工具连接,需要注意的是配置了zookeeper地址端口后connect会提示有one or more brokers have multiple endpoints···,我们需要做的是切换到Advancedtab页,配置Bootstrap servers为外网broker,涉及到IP就不截图了,完结撒花

web项目中使用的是springboot,只需要配置spring.kafka.bootstrap-servers不需要关注zookeeper,撒花x2

