我使用下面的默认命令启动一个普通的Zoogger/Kafka代理,因为这些命令在一台机器中的Kafka留档中有所描述(我们称之为机器A)
bin/zookeeper-server-start.sh config/zookeeper.properties
bin/kafka-server-start.sh config/server.properties
这些在机器A的localhost:9092启动经纪人。
然后我转到同一网络上的另一台计算机(让我们将其命名为机器B),并通过调用此命令创建Kafka提供的默认消费者
bin/kafka-console-consumer.sh --bootstrap-server IP_ADDRESS_HERE:9092 --topic test --from-beginning
其中IP_ADDRESS_HERE是托管代理的机器A的本地网络中的IP地址(例如,192.168.1.10)
一切正常。然后我尝试从本地网络之外的机器(我们称之为机器C)访问代理。我转到我的路由器配置,并为托管代理的机器(机器A)执行端口转发。例如,我执行以下操作
192.168.1.10:9092 --> 9094
这意味着我将192.168.1.10设备(机器A)的内部9092端口转发到路由器的9094端口。然后我转到YouGetSignal等服务,检查我的公共IP地址(例如97.190.92.128)的9094端口是否打开。我收到一条消息,端口确实打开了。
当我尝试使用以下命令从机器C使用机器A中的borker时
bin/kafka-console-consumer.sh --bootstrap-server PUBLIC_IP_ADDRESS_HERE:9094 --topic test --from-beginning
其中PUBLIC_IP_ADDRESS_HERE是机器A所在网络的公共IP地址(例如,97.190.92.128)。但是,我收到一个无法连接到192.168.1.10:9092的错误-代理可能不可用(请注意,错误中返回了内部IP: port,这意味着我的路由器正确提供了信息)
我做错了什么?
您需要更新中的
server.properties
以提供客户端可以解析和连接的主机/IP和端口组合。
正如您所观察到的,代理发出192.168.1.10:9092
来响应连接到它的客户端,这对于同一网络上的任何机器(包括机器B)都可以正常工作。
对于机器C,代理需要告诉它如何连接到代理,如果我没听错的话是PUBLIC_IP_ADDRESS_HERE: 9094
。
如果您需要从局域网和广域网连接,您将需要两个侦听器;一个用于局域网,一个用于广域网。在server.properties
中输入:
listeners=LISTENER_LAN://0.0.0.0:9092,LISTENER_WAN://0.0.0.0:9094
advertised.listeners=LISTENER_LAN://192.168.1.10:9092,LISTENER_WAN://PUBLIC_IP_ADDRESS_HERE:9094
listener.security.protocol.map: LISTENER_LAN:PLAINTEXT,LISTENER_WAN:PLAINTEXT
inter.broker.listener.name=LISTENER_LAN
请注意,您需要更改端口转发,以便代理上的endpoint是为LISTENER_WAN
(9094)定义的端口。如果WAN连接尝试连接到9092上的代理,那么它将获得LISTEN_LAN
详细信息(这是目前正在发生的事情,并且无法工作)。
参考:https://rmoff.net/2018/08/02/kafka-listeners-explained/