轉載自遠控源碼文章:無公網(wǎng)IP,在外公網(wǎng)遠程訪問RabbitMQ服務「內(nèi)網(wǎng)穿透」
前言
RabbitMQ是一個在 AMQP(高級消息隊列協(xié)議)基礎上完成的,可復用的企業(yè)消息系統(tǒng),是當前最主流的消息中間件之一。
由erlang開發(fā)的AMQP(Advanced Message Queue 高級消息隊列協(xié)議 )的開源實現(xiàn),由于erlang 語言的高并發(fā)特性,性能較好,本質是個隊列,F(xiàn)IFO 先入先出,里面存放的內(nèi)容是message,下面介紹通過在ubuntu+cpolar+rabbitMQ環(huán)境下,實現(xiàn)mq服務端遠程訪問。
1.安裝erlang 語言
由于rabbitMQ是erlang語言實現(xiàn)的,所以我們需要安裝erlang
sudo apt-get install erlang-nox
2.安裝rabbitMQ
安裝最新版rabbitMQ
sudo apt-get install rabbitmq-server
查看rabbitMQ狀態(tài),active(running)
表示在線
sudo systemctl status rabbitmq-server
設置訪問MQ用戶名賬號和密碼,admin表示賬號(可自定義),123456表示密碼(可自定義)
sudo rabbitmqctl add_user admin 123456
設置上面admin用戶的角色,administrator表示是最高管理員
sudo rabbitmqctl set_user_tags admin administrator
設置admin角色權限
sudo rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
以上信息設置好后,我們往下走。
3. 內(nèi)網(wǎng)穿透
接著我們使用cpolar穿透本地MQ服務,使得遠程可以進行訪問連接,cpolar支持http/https/tcp協(xié)議,不限制流量,操作簡單,無需公網(wǎng)IP,也無需路由器。
cpolar官網(wǎng):https://www.cpolar.com/
3.1 安裝cpolar內(nèi)網(wǎng)穿透(支持一鍵自動安裝腳本)
- cpolar 安裝(國內(nèi)使用)
curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
- 或 cpolar短鏈接安裝方式:(國外使用)
curl -sL https://git.io/cpolar | sudo bash
- 查看版本號
cpolar version
- token認證
登錄cpolar官網(wǎng)后臺,點擊左側的驗證,查看自己的認證token,之后將token貼在命令行里
cpolar authtoken xxxxxxx
- 向系統(tǒng)添加服務
sudo systemctl enable cpolar
- 啟動cpolar服務
sudo systemctl start cpolar
正常顯示為active
則表示服務為正常在線啟動狀態(tài)
3.2 創(chuàng)建HTTP隧道
在ubuntu系統(tǒng)本地安裝cpolar內(nèi)網(wǎng)穿透之后,在ubuntu瀏覽器上訪問本地9200端口,打開cpolar web ui界面:http://127.0.0.1:9200。
點擊左側儀表盤的隧道管理——創(chuàng)建隧道,由于rabbitMQ中默認的是5672端口,因此我們要來創(chuàng)建一條http隧道,指向5672端口:
- 隧道名稱:可自定義,注意不要重復
- 協(xié)議:tcp
- 本地地址:5672
- 域名類型:選擇隨機域名
- 地區(qū):選擇China VIP
點擊創(chuàng)建
打開在線隧道列表,查看隨機公網(wǎng)tcp地址,使用下面隨機的tcp公網(wǎng)地址,即可遠程連接MQ
4. 公網(wǎng)遠程連接
maven坐標
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.10.0</version>
</dependency>
這里使用java 測試使用上面公網(wǎng)地址進行連接,編寫發(fā)布者
ConnectionFactory factory = new ConnectionFactory();
//cpolar公網(wǎng)地址
factory.setHost("1.tcp.cpolar.cn");
//公網(wǎng)地址對于的端口號
factory.setPort(24889);
//用戶名和密碼
factory.setUsername("admin");
factory.setPassword("123456");
Connection connection = null;
Channel channel = null;
try {
// 1.創(chuàng)建連接和通道
connection = factory.newConnection();
channel = connection.createChannel();
// 2.為通道聲明exchange和exchange的類型
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);
String msg = " hello world";
// 3.發(fā)送消息到指定的exchange,隊列指定為空,由exchange根據(jù)情況判斷需要發(fā)送到哪些隊列
channel.basicPublish(EXCHANGE_NAME, "", null, msg.getBytes());
System.out.println("product send a msg: " + msg);
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
} finally {
// 4.關閉連接
if (channel != null) {
try {
channel.close();
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
編寫消費者
ConnectionFactory factory = new ConnectionFactory();
//cpolar公網(wǎng)地址
factory.setHost("1.tcp.cpolar.cn");
//公網(wǎng)地址對于的端口號
factory.setPort(24889);
//用戶名和密碼
factory.setUsername("admin");
factory.setPassword("123456");
Connection connection = null;
Channel channel = null;
try {
// 1.創(chuàng)建連接和通道
connection = factory.newConnection();
channel = connection.createChannel();
// 2.為通道聲明exchange以及exchange類型
channel.exchangeDeclare("exchange", BuiltinExchangeType.FANOUT);
// 3.創(chuàng)建隨機名字的隊列
String queueName = channel.queueDeclare().getQueue();
// 4.建立exchange和隊列的綁定關系
channel.queueBind(queueName, "exchange", "");
System.out.println(" **** Consumer1 keep alive ,waiting for messages, and then deal them");
// 5.通過回調(diào)生成消費者并進行監(jiān)聽
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope,
com.rabbitmq.client.AMQP.BasicProperties properties, byte[] body) throws IOException {
// 獲取消息內(nèi)容然后處理
String msg = new String(body, "UTF-8");
System.out.println("*********** Consumer1" + " get message :[" + msg + "]");
}
};
// 6.消費消息
channel.basicConsume(queueName, true, consumer);
} catch (IOException e) {
e.printStackTrace();
} catch (TimeoutException e) {
e.printStackTrace();
}
先啟動消費者,然后啟動發(fā)布者,然后消費者控制臺輸出消費者發(fā)送的消息表示成功.我們實現(xiàn)了遠程訪問MQ。
5.固定公網(wǎng)TCP地址
由于以上創(chuàng)建的隧道使用的是隨機地址隧道,地址會在24小時內(nèi)變化,為了使連接更加穩(wěn)定,我們還需要固定tcp地址。
5.1 保留一個固定的公網(wǎng)TCP端口地址
登錄cpolar官網(wǎng)后臺,點擊左側的預留,選擇保留的TCP地址。
- 地區(qū):選擇China VIP
- 描述:即備注,可自定義填寫
點擊保留
地址保留成功后,系統(tǒng)會生成相應的固定公網(wǎng)地址,將其復制下來
5.2 配置固定公網(wǎng)TCP端口地址
在瀏覽器上訪問9200端口,登錄cpolar web ui管理界面,點擊左側儀表盤的隧道管理——隧道列表,找到上面創(chuàng)建的隧道,點擊右側的編輯
修改隧道信息,將保留成功的固定tcp地址配置到隧道中
- 端口類型:修改為固定tcp端口
- 預留的tcp地址:填寫保留成功的地址
點擊更新
隧道更新成功后,點擊左側儀表盤的狀態(tài)在線隧道列表,找到需要編輯的隧道,可以看到公網(wǎng)地址已經(jīng)更新成為了固定TCP地址。
更新好后,我們修改代碼中的兩個參數(shù)
//cpolar公網(wǎng)地址,改為我們固定的地址
factory.setHost("5.tcp.vip.cpolar.cn");
//固定地址對應的端口號
factory.setPort(13630);
然后我們重新啟動消費者,再啟動生產(chǎn)者,正常發(fā)布和消費消息表示成功文章來源:http://www.zghlxwxcb.cn/news/detail-410222.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-410222.html
到了這里,關于內(nèi)網(wǎng)穿透實現(xiàn)在外遠程連接RabbitMQ服務的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!