前言
MQ,消息隊列,排隊處理消息。以下爲如何離線安裝rabbitMQ
一、Linux安裝rabbitMQ
1、前提
(1)mq以及erlang下載地址: https://www.rabbitmq.com/install-rpm.html#downloads ,有四個,選擇第一個即可。我這裏選擇的是3.6.6版本。
(2)rabbitMQ是用erlang語言寫的,需要先安裝erlang
(3)在 /user/local/ 下新建文件夾rabbitMQ,將兩個安裝包複製到這裏。
2、安裝erlang
(1)在rabbitMQ文件夾下,安裝erlang
rpm -ivh erlang-19.0.4-1.el7.centos.x86_64.rpm
(2)驗證是否安裝成功
3、安裝rabbitMQ
(1)安裝
rpm -ivh rabbitmq-server-3.6.6-1.el7.noarch.rpm
(2)如果提示依賴檢測失敗,安裝socat
yum install socat
(3)再次安裝rabbitMQ
rpm -ivh rabbitmq-server-3.6.6-1.el7.noarch.rpm
二、配置
1、開啓服務和查看狀態
service rabbitmq-server stop #關閉
service rabbitmq-server start #啓動
service rabbitmq-server status #狀態
2、添加用戶 admin、用戶授權
(1)添加用戶、授權
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
(2)查詢用戶
rabbitmqctl list_users
(3)查詢用戶權限
rabbitmqctl list_permissions -p /
3、開啓遠程訪問
修改配置文件 /etc/rabbitmq/rabbitmq.config
進入 /etc/rabbitmq/ 沒有rabbitmq.config
直接新建編輯 vi rabbitmq.config
rabbitmq.config裏添加以下配置
[
{rabbit,
[
{tcp_listeners, [5672]},
{loopback_users, ["admin"]}
]
}
].
4、開啓web管理界面
(1)開啓web管理界面
rabbitmq-plugins enable rabbitmq_management
(2)開放5672(代碼訪問端口)和15672(web頁面端口)端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
5、瀏覽器訪問
ip:15672 例如: 192.168.1.206:15672
輸入添加的用戶名和密碼登錄
三、springboot結合rabbitMQ
1、添加依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2、application.properties裏配置
spring.rabbitmq.host=192.168.1.102
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000
#採用消息確認模式,消息發出去後,異步等待響應
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.template.mandatory=true
#消費端配置
#消費者監聽併發數
spring.rabbitmq.listener.simple.concurrency=10
#最大併發數
spring.rabbitmq.listener.simple.max-concurrency=20
#簽收模式 推薦使用manual手工簽收
spring.rabbitmq.listener.simple.acknowledge-mode=manual
#限流,每次消費一條,完事再取
spring.rabbitmq.listener.simple.prefetch=5
3、配置類
創建RabbitMQ的配置類 RabbitConfig,用來配置隊列、交換器、路由等高級信息。這裏我們以入門爲主,先以最小化的配置來定義,以完成一個基本的生產和消費過程。
4、生產者
通過注入 AmqpTemplate接口的實例來實現消息的發送, AmqpTemplate接口定義了一套針對AMQP協議的基礎操作。在Spring Boot中會根據配置來注入其具體實現。在該生產者,我們會產生一個字符串,併發送到名爲 hello的隊列中。
5、消費者
通過 @RabbitListener註解定義該類對 hello隊列的監聽,並用 @RabbitHandler註解來指定對消息的處理方法。所以,該消費者實現了對 hello隊列的消費,消費操作爲輸出消息的字符串內容。
6、測試
(1)創建測試類
(2)啓動應用主類
從控制檯中,我們看到如下內容,程序創建了一個訪問 127.0.0.1:5672的連接。
(3)運行測試類
運行單元測試類,我們可以看到控制檯中輸出下面的內容,消息被髮送到了RabbitMQ Server的 hello隊列中。
(4)查看應用主類的控制檯
切換到應用主類的控制檯,我們可以看到類似如下輸出,消費者對 hello隊列的監聽程序執行了,並輸出了接受到的消息信息。
四、使用模式
1、單生產者,多消費者(秒殺,搶紅包)
(1)配置
(2)生產者
(3)消費者
(4)controller
打印結果:
生產者發送了十條消息,分別被兩個消費者消費了
2、發佈訂閱
(1)配置類
(2)生產者
(3)消費者
(4)controller
(5)打印結果
由以上結果可知:就算fanoutSender發送消息的時候,指定了routing_key爲"abcd.ee",但是所有接收者都接受到了消息
3、topic
(1)配置類
(2)生產者
(3)消費者
(4)controller
(5)打印結果
由以上結果可知:sender1發送的消息,routing_key是“topic.message”,所以exchange裏面的綁定的binding_key是“topic.message”,topic.#都符合路由規則,所以sender1發送的消息,兩個隊列都能接收到;
sender2發送的消息,routing_key是“topic.messages”,所以exchange裏面的綁定的binding_key只有topic.#都符合路由規則;所以sender2發送的消息只有隊列topic.messages能收到。