有时候,一个物联网项目,A客户想要本地使用,B客户想要线上使用,C客户想要本地部署,当有网环境时能线上使用。这个时候就需要本地MQTT服务和线上MQTT服务能相互自动转发。
后来经我一翻研究,其实Activemq支持配置activemq.xml来实现两个broker(mqtt服务)的转发。但是线上服务器配置activemq.xml时,需要提供一个内网固定IP,但是一般用户网络没有固定IP,这种情况下,就可以再加一个利器ngrok,可以将内网TCP或HTTP协议及端口穿透,实现反向代理。
以下是实现步骤:
1、配置本地activemq.xml(在broker节点里加)
<networkConnectors>
<!-- 连接到远程服务器 -->
<networkConnector uri="static://(tcp://112.2.10.28:61616)" duplex="true" name="local-to-remote"/>
</networkConnectors>
说明:地址112.2.10.28.61616是线上服务器地址,注意需配置服务器防火墙,开放此端口)
2、配置线上activemq.xml
<networkConnectors>
<!-- 连接到公司服务器 -->
<networkConnector uri="static://(tcp://0.tcp.ap.ngrok.io:13164)"
duplex="true"
name="remote-to-local"/>
</networkConnectors>
说明:tcp://0.tcp.ap.ngrok.io:13164是通过ngrok生成的外部访问地址(下文会说到获取方法),13164端口同样需要配置服务器打开此端口。
3、安装和启动ngrok,实现内网穿透
(1)申请ngrok账号
官网: https://www.ngrok.com
(2)本地电脑安装ngrok(以下是mac os示例,其它系统可参考官方文档,很简单):
brew install ngrok
(3)配置ngrok的token(token可在用户管理中获得):
ngrok config add-authtoken 2VsdP4736wyq5I321VdL126hqRzf_38BHTUJvd2LGdfm4cm7X
(4)启动代理
ngrok tcp 192.168.110.168:61616
(5)启动后显示以下结果表示成功,得到一个TCP协议的外网地址,当访问这个ngrok地址时,就相当于访问本地192.168.110.168中61616这个地址了。
4、 线上activemq.xml和本地activemq.xml都配置完成后,重启两个activemq服务就可以。可以直接关掉activemq客户端,或是重启activemq服务。
5、actiemq显示以下表示转发成功: