我们有一个RocketMQ 5.1.4的集群部署在内网环境,部署的时候broker的ip1和ip2都是内网ip,分散在3台内网机器上(都没有公网ip),然后把内网集群中nameserver的端口映射到一个代理公网ip和端口上;但是其他公网环境的java服务用这个映射的公网ip和端口一直连接不上RocketMQ集群,这个怎么办呢?
并且java服务内一直打印这个日志:
2023-12-16 16:19:04.231 INFO 12 --- [NettyClientSelector_1] [TID:N/A] RocketmqRemoting : closeChannel: close the connection to remote addr
ess[] result: true
2023-12-16 16:19:04.253 INFO 12 --- [NettyClientSelector_1] [TID:N/A] RocketmqRemoting : closeChannel: close the connection to remote addr
ess[] result: true
2023-12-16 16:19:04.317 INFO 12 --- [NettyClientSelector_1] [TID:N/A] RocketmqRemoting : closeChannel: close the connection to remote addr
ess[] result: true
2023-12-16 16:19:04.436 INFO 12 --- [NettyClientSelector_1] [TID:N/A] RocketmqRemoting : closeChannel: close the connection to remote addr
ess[] result: true
2023-12-16 16:19:07.232 INFO 12 --- [NettyClientSelector_1] [TID:N/A] RocketmqRemoting : closeChannel: close the connection to remote addr
ess[] result: true
2023-12-16 16:19:07.253 INFO 12 --- [NettyClientSelector_1] [TID:N/A] RocketmqRemoting : closeChannel: close the connection to remote addr
ess[] result: true
我的集群信息如下:
RocmetMQ部署机器规划:
10.193.7.2:部署NameServer和rocketmq-dashboard
10.193.7.3:部署broker-a-m(broker-a Master)和broker-b-s(broker-b Slave)
10.193.7.4:部署broker-b-m(broker-b Master)和broker-a-s(broker-a Slave)
j[rocketmq@df3a352a6246 bin]$ ./mqadmin clusterList -n 10.193.7.2:9876
#Cluster Name #Broker Name #BID #Addr #Version #InTPS(LOAD) #OutTPS(LOAD
) #Timer(Progress) #PCWait(ms) #Hour #SPACE #ACTIVATED
DefaultCluster broker-a-m 0 10.193.7.3:10911 V5_1_4 0.00(0,0ms) 0.00(0,0ms
) 0-0(0.0w, 0.0, 0.0) 0 21.03 0.0300 true
DefaultCluster broker-a-s 1 10.193.7.4:11911 V5_1_4 0.00(0,0ms) 0.00(0,0ms
) 604770-0(0.0w, 0.0, 0.0) 0 472977.30 0.0400 false
DefaultCluster broker-b-m 0 10.193.7.4:10911 V5_1_4 0.00(0,0ms) 0.00(0,0ms
) 0-0(0.0w, 0.0, 0.0) 0 21.03 0.0400 true
DefaultCluster broker-b-s 1 10.193.7.3:11911 V5_1_4 0.00(0,0ms) 0.00(0,0ms
) 604758-0(0.0w, 0.0, 0.0) 0 472977.30 0.0300 false
[rocketmq@df3a352a6246 bin]$
因为此集群部署在内网环境中,连接这个rocketmq集群的java服务在另外一个公网环境中(并且他们在不同的内网环境),因此我们使用了一个代理ip把内网环境中nameserver的10.193.7.2:9876,映射到了我们java服务可以访问的公网ip+端口上,然后java服务中的nameserver连接地址写代理ip和端口,但启动服务一直会连接不上,并出现上面提到的日志。
所以想请教一下各位大佬,有没有遇到过同样的问题,你们是怎么解决的。
有人能就如何解决这个连接问题提出建议吗?如有任何见解或建议,我们将不胜感激。
提前感谢您的帮助!
以下为热心网友提供的参考意见
公网访问内网RocketMQ集群通常涉及到网络配置和安全策略的调整。以下是一些建议,帮助你实现公网访问内网RocketMQ集群:
确保内网RocketMQ集群所在的服务器具有公网IP地址,并且可以访问外网。
在路由器或防火墙设备上配置端口转发规则,将公网IP的特定端口(如默认的RocketMQ监听端口)转发到内网RocketMQ集群所在的服务器。这样,外部用户可以通过访问公网IP和指定的端口来访问内网RocketMQ集群。
确保内网RocketMQ集群的配置文件中的监听端口与路由器或防火墙设备上配置的端口一致。
如果需要更高的安全性,你可以考虑使用VPN(虚拟专用网络)或其他加密技术来保护数据传输的安全性。
监控网络流量和访问日志,确保只有授权用户能够访问内网RocketMQ集群,并及时发现和处理潜在的安全风险。
需要注意的是,公网访问内网RocketMQ集群可能涉及到数据传输的安全性和隐私保护问题。在实施之前,请确保充分了解相关的风险和挑战,并采取适当的安全措施来保护数据和系统免受未经授权的访问和攻击。
另外,具体的实施步骤和配置可能会因你的网络环境和RocketMQ集群的版本而有所不同。因此,建议参考RocketMQ官方文档和相关网络配置指南,以确保正确配置和实现公网访问内网RocketMQ集群。
以下为热心网友提供的参考意见
当然,我可以帮助你解决关于公网访问内网RocketMQ 5.1.4集群的问题。请告诉我你遇到的具体问题,我会尽力提供帮助。
另外,如果你在之前的描述中已经提到了问题,请忽略这条消息,我会继续关注你的问题并提供相应的解决方案。
以下为热心网友提供的参考意见
从你提供的信息来看,你遇到的问题是公网环境的Java服务无法连接到部署在内网环境的RocketMQ 5.1.4集群。虽然你已经将nameserver的端口映射到了一个代理公网IP和端口上,但是连接仍然不成功。
这个问题可能由以下几个原因引起:
网络配置问题:确保你的内网和外网之间的网络配置正确,包括防火墙、路由器等设备的配置。确认代理公网IP和端口映射配置正确,并且内网和外网之间的网络连接是畅通的。
RocketMQ配置问题:检查RocketMQ集群的配置,特别是broker和nameserver的配置。确保broker的IP地址和端口配置正确,并且nameserver能够正确解析broker的地址。另外,确认RocketMQ集群中的防火墙设置允许外部访问。
Java服务配置问题:检查Java服务的配置,确保连接到RocketMQ集群的IP地址和端口配置正确。如果使用的是集群模式连接,确保提供的nameserver地址列表中包含正确的代理公网IP和端口。
版本兼容性问题:确认你的Java服务使用的RocketMQ客户端版本与RocketMQ集群版本兼容。有时候,不同版本之间可能存在不兼容的问题。
针对这个问题,你可以尝试以下几个解决方案:
检查网络配置:确认内网和外网之间的网络连接正常,代理公网IP和端口映射配置正确。你可以尝试使用telnet等工具测试代理公网IP和端口的连通性。
检查RocketMQ配置:确认broker和nameserver的配置正确,并且nameserver能够正确解析broker的地址。你可以尝试在RocketMQ集群所在的机器上使用telnet等工具测试broker的连通性。
检查Java服务配置:确认Java服务连接到RocketMQ集群的配置正确,包括IP地址、端口以及nameserver地址列表。你可以尝试打印出连接的详细信息,查看是否有任何错误或异常。
升级或降级RocketMQ客户端版本:如果怀疑存在版本兼容性问题,你可以尝试升级或降级Java服务使用的RocketMQ客户端版本,与RocketMQ集群版本保持一致。
查看日志和错误信息:除了你提供的日志信息外,还可以查看RocketMQ集群和Java服务的详细日志和错误信息,以便进一步定位问题。
希望以上解决方案能够帮助你解决问题。如果问题仍然存在,请提供更多关于你的环境和配置的详细信息,以便更深入地帮助你分析和解决问题。
以下为热心网友提供的参考意见
我加了rocketmq的官方钉钉群,在群里有官方人员回复了:说nameserver 是mq集群的注册中心,如果代码中使用nameserver连接mq集群,他们必须都在一个内网中,或者broker的配置中ip1用主机的公网ip,否则外部通过nameserver连接不了;但rocketmq提供了一个proxy代理,我们可以通过配置proxy代理,把proxy代理的remotingListenPort给暴露出来,外部服务就可以通过这个连接内网的rocketmq集群了;
代理的配置文件:
cat /home/rocketmq/rocketmq-5.1.4/conf/rmq-proxy.json
{
"rocketMQClusterName": "DefaultCluster",
"remotingListenPort":28080,
"grpcServerPort":28081
}
然后启动broker的时候要加上–enable-proxy
例如:在机器A,启动第一个Master,例如NameServer的IP为:192.168.1.1
nohup sh bin/mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a.properties --enable-proxy &
然后把28080和28081映射出去:
现在外部代码只需要连接这个28080的proxy端口就可访问内部mq集群了
以下为热心网友提供的参考意见
根据您的描述,您的RocketMQ集群部署在内网环境中,而Java服务在另一个公网环境中。您已经将内网环境中的NameServer端口映射到一个代理公网IP和端口上,但Java服务仍然无法连接到RocketMQ集群。这个问题可能是由于网络配置或防火墙设置导致的。
以下是一些建议来解决这个问题:
-
确保代理服务器上的端口映射已正确配置。您可以使用
telnet
命令测试代理服务器上的端口是否可访问。例如,如果您将NameServer的端口映射到代理服务器的8080端口,请尝试运行以下命令:telnet 代理服务器IP地址 8080
如果端口不可访问,请检查代理服务器上的端口映射设置。
-
检查防火墙设置。确保代理服务器和Java服务所在的网络环境中的防火墙允许通过RocketMQ所需的端口(默认为9876)。您可能需要在防火墙中添加相应的入站规则。
-
在Java服务的配置文件中,将NameServer的地址更改为代理服务器的公网IP和端口。例如,如果您使用的是
application.properties
文件,可以将以下内容添加到文件中:rocketmq.nameserver.addr=代理服务器IP地址:端口号
-
如果问题仍然存在,您可以尝试在Java服务的代码中使用
DnsResolver
类解析NameServer的地址。这将允许Java服务自动处理DNS解析和连接问题。例如:import java.net.InetAddress; import java.net.UnknownHostException; import java.util.HashSet; import java.util.Set; import org.apache.rocketmq.client.config.ClientConfig; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message; public class RocketMQProducer { public static void main(String[] args) throws MQClientException, InterruptedException, UnknownHostException { // 创建生产者实例 DefaultMQProducer producer = new DefaultMQProducer("producer_group"); producer.setNamesrvAddr(getResolvedNameServerAddress()); producer.start(); // ...其他操作... producer.shutdown(); } private static String getResolvedNameServerAddress() throws MQClientException, InterruptedException, UnknownHostException { // 使用DnsResolver解析NameServer地址 Set<String> nameServerAddresses = new HashSet<>(); for (String address : ClientConfig.NAMESRV_ADDR_PREFIX) { InetAddress inetAddress = InetAddress.getByName(address); nameServerAddresses.add(inetAddress.getHostAddress()); } return StringUtils.join(nameServerAddresses, ";"); } }
本文来自投稿,不代表新手站长_郑州云淘科技有限公司立场,如若转载,请注明出处:https://www.cnzhanzhang.com/12103.html