文章目錄
- 前言
- 1.安裝erlang 語言
- 2.安裝rabbitMQ
- 3. 內網穿透
- 3.1 安裝cpolar內網穿透(支持一鍵自動安裝腳本)
- 3.2 創建HTTP隧道
- 4. 公網遠程連接
- 5.固定公網TCP地址
- 5.1 保留一個固定的公網TCP端口地址
- 5.2 配置固定公網TCP端口地址
前言
RabbitMQ是一個在 AMQP(高級消息隊列協議)基礎上完成的,可復用的企業消息系統,是當前最主流的消息中間件之一。
由erlang開發的AMQP(Advanced Message Queue 高級消息隊列協議 )的開源實現,由于erlang 語言的高并發特性,性能較好,本質是個隊列,FIFO 先入先出,里面存放的內容是message,下面介紹通過在ubuntu+cpolar+rabbitMQ環境下,實現mq服務端遠程訪問。
1.安裝erlang 語言
由于rabbitMQ是erlang語言實現的,所以我們需要安裝erlang
sudo apt-get install erlang-nox
2.安裝rabbitMQ
安裝最新版rabbitMQ
sudo apt-get install rabbitmq-server
查看rabbitMQ狀態,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. 內網穿透
接著我們使用cpolar穿透本地MQ服務,使得遠程可以進行訪問連接,cpolar支持http/https/tcp協議,不限制流量,操作簡單,無需公網IP,也無需路由器。
cpolar官網:https://www.cpolar.com/
3.1 安裝cpolar內網穿透(支持一鍵自動安裝腳本)
- cpolar 安裝(國內使用)
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官網后臺,點擊左側的驗證,查看自己的認證token,之后將token貼在命令行里
cpolar authtoken xxxxxxx
- 向系統添加服務
sudo systemctl enable cpolar
- 啟動cpolar服務
sudo systemctl start cpolar
正常顯示為active
則表示服務為正常在線啟動狀態
3.2 創建HTTP隧道
在ubuntu系統本地安裝cpolar內網穿透之后,在ubuntu瀏覽器上訪問本地9200端口,打開cpolar web ui界面:http://127.0.0.1:9200。
點擊左側儀表盤的隧道管理——創建隧道,由于rabbitMQ中默認的是5672端口,因此我們要來創建一條http隧道,指向5672端口:
- 隧道名稱:可自定義,注意不要重復
- 協議:tcp
- 本地地址:5672
- 域名類型:選擇隨機域名
- 地區:選擇China VIP
點擊創建
打開在線隧道列表,查看隨機公網tcp地址,使用下面隨機的tcp公網地址,即可遠程連接MQ
4. 公網遠程連接
maven坐標
<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.10.0</version></dependency>
這里使用java 測試使用上面公網地址進行連接,編寫發布者
ConnectionFactory factory = new ConnectionFactory();//cpolar公網地址factory.setHost("1.tcp.cpolar.cn");//公網地址對于的端口號factory.setPort(24889);//用戶名和密碼factory.setUsername("admin");factory.setPassword("123456");Connection connection = null;Channel channel = null;try {// 1.創建連接和通道connection = factory.newConnection();channel = connection.createChannel();// 2.為通道聲明exchange和exchange的類型channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.FANOUT);String msg = " hello world";// 3.發送消息到指定的exchange,隊列指定為空,由exchange根據情況判斷需要發送到哪些隊列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公網地址factory.setHost("1.tcp.cpolar.cn");//公網地址對于的端口號factory.setPort(24889);//用戶名和密碼factory.setUsername("admin");factory.setPassword("123456");Connection connection = null;Channel channel = null;try {// 1.創建連接和通道connection = factory.newConnection();channel = connection.createChannel();// 2.為通道聲明exchange以及exchange類型channel.exchangeDeclare("exchange", BuiltinExchangeType.FANOUT);// 3.創建隨機名字的隊列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.通過回調生成消費者并進行監聽Consumer consumer = new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope,com.rabbitmq.client.AMQP.BasicProperties properties, byte[] body) throws IOException {// 獲取消息內容然后處理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();}
先啟動消費者,然后啟動發布者,然后消費者控制臺輸出消費者發送的消息表示成功.我們實現了遠程訪問MQ。
5.固定公網TCP地址
由于以上創建的隧道使用的是隨機地址隧道,地址會在24小時內變化,為了使連接更加穩定,我們還需要固定tcp地址。
5.1 保留一個固定的公網TCP端口地址
登錄cpolar官網后臺,點擊左側的預留,選擇保留的TCP地址。
- 地區:選擇China VIP
- 描述:即備注,可自定義填寫
點擊保留
地址保留成功后,系統會生成相應的固定公網地址,將其復制下來
5.2 配置固定公網TCP端口地址
在瀏覽器上訪問9200端口,登錄cpolar web ui管理界面,點擊左側儀表盤的隧道管理——隧道列表,找到上面創建的隧道,點擊右側的編輯
修改隧道信息,將保留成功的固定tcp地址配置到隧道中
- 端口類型:修改為固定tcp端口
- 預留的tcp地址:填寫保留成功的地址
點擊更新
隧道更新成功后,點擊左側儀表盤的狀態在線隧道列表,找到需要編輯的隧道,可以看到公網地址已經更新成為了固定TCP地址。
更新好后,我們修改代碼中的兩個參數
//cpolar公網地址,改為我們固定的地址factory.setHost("5.tcp.vip.cpolar.cn");//固定地址對應的端口號factory.setPort(13630);
然后我們重新啟動消費者,再啟動生產者,正常發布和消費消息表示成功