01、RabbitMQ之入門
標簽: RabbitMQ
RabbitMQ之入門
一、什么是MQ?
消息隊列(Message Queue,簡稱MQ),從字面意思上看,本質是個隊列,FIFO先入先出,只不過隊列中存放的內容是message而已
二、主流MQ框架
MQ框架非常之多,比較流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里開源的RocketMQ。
區別:
本文主要介紹RabbitMQ
三、應用場景
主要解決異步處理、應用解耦、流量削鋒等問題,實現高性能,高可用,可伸縮和最終一致性架構
1.異步處理
用戶注冊后,需要發注冊郵件和注冊短信
2.應用解耦
用戶下單后,訂單系統需要通知庫存系統
3.流量削鋒(重點)
流量削鋒也是消息隊列中的常用場景,一般在秒殺或團搶活動中使用廣泛,例如雙十一
四、Docker安裝部署RabbitMQ
注意獲取鏡像的時候要獲取management
版本的,不要獲取last版本的,management版本的才帶有管理界面
1.查詢鏡像
$ docker search rabbitmq:management
2.獲取鏡像
$ docker pull rabbitmq:management
3.運行鏡像
##方式一:默認guest用戶,密碼也是guest
$ docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
##方式二:設置用戶名和密碼(推薦)
$ docker run -d \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
-v /data:/var/lib/rabbitmq \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--restart=always \
rabbitmq:management
參數說明:
-d:后臺運行容器
-name:指定容器名
-p:指定服務運行的端口(5672:應用訪問端口;15672:控制臺Web端口號)
-v:映射目錄或文件,啟動了一個數據卷容器,數據卷路徑為:/var/lib/rabbitmq,再將此數據卷映射到住宿主機的/data目錄
–hostname:主機名(RabbitMQ的一個重要注意事項是它根據所謂的 “節點名稱” 存儲數據,默認為主機名)
-e:指定環境變量;(
RABBITMQ_DEFAULT_VHOST:默認虛擬機名;
RABBITMQ_DEFAULT_USER:默認的用戶名;
RABBITMQ_DEFAULT_PASS:默認用戶名的密碼)
–restart=always:當Docker重啟時,容器能自動啟動
rabbitmq:management:鏡像名
端口解釋:
15672:后臺界面地址:http://[宿主機IP]:15672 ;
5672:Rabbit服務器端口
注意:
1.請記住虛擬機名稱,后面yml配置文件需要用到,如果啟動時沒指定,默認值為/
2.容器啟動后,可以通過docker logs 窗口ID/容器名字 查看日志
docker logs my-rabbitmq
五、RabbitMQ管理平臺
1.Virtual Hosts
就象mysql有數據庫的概念并且可以指定用戶對庫和表等操作的權限。那RabbitMQ呢?RabbitMQ也有類似的權限管理。
在RabbitMQ中可以虛擬消息服務器VirtualHost,每個VirtualHost相當于一個相對獨立的RabbitMQ服務器,
每個VirtualHost之間是相互隔離的。exchange、queue、message不能互通
另外,虛擬主機的限制有兩個:最大連接數和最大隊列數
MQ的核心概念:
生產者、隊列、消費者、消息
生產者生產消息并投遞到隊列中,
消費者可以從隊列中獲取消息并消費,
消息指的是各個服務之間要傳遞的數據**
六、 springboot整合rabbitmq
單一生產者和單一消費者
1.安裝好rabbitmq,登陸RabbitMQ管理平臺,新增管理用戶并設置權限
2.切換到springboot用戶登陸,在All users中,點擊Name為springboot, 進入權限設置頁面
3.在權限設置頁面,進入Permissions頁面,點擊“Set permission"
4.新建springboot項目,pom.xml添加rabbitmq依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
也可以網站在線生成
https://start.spring.io/
5.rabbitmq連接配置
# 服務的端口和項目名稱
server:
port: 8081
servlet:
context-path: /rabbitmq01
## rabbitmq config
spring:
rabbitmq:
host: 你的ip地址 #rabbitma服務器的id地址
port: 5672 #rabbitmq服務器的端口號
username: springcloud #用戶名稱
password: 123456 #密碼
## 與啟動容器時虛擬主機名字一致~~~與啟動容器時虛擬主機名字一致~~~與啟動容器時虛擬主機名字一致~~~
virtual-host: my_vhost #和你創建容器時的服務名稱一樣
6.生成配置類
package com.zking.rabbitmq01.rabbitmq;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
/*
* 功能描述: 定義消息隊列,并指定隊列名稱first-queue和two-queue
* 〈〉
* @Param:
* @Return:
* @Author: 驕傲的骨傲天
* @Date: 2019/12/22 21:45
*/
@Bean
public Queue firstQueue(){
return new Queue("first-queue",true);
}
@Bean
public Queue twoQueue(){
return new Queue("two-queue",true);
}
}
7.創建生產者,給消息列表添加消息
package com.zking.rabbitmq01.controller;
import org.apache.tomcat.jni.Local;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.xml.crypto.Data;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/*
* 功能描述: <br>
* 〈〉生產者發送消息——》隊列
* @Param:
* @Return:
* @Author: 驕傲的骨傲天
* @Date: 2019/12/22 21:48
*/
@Component
public class SendController {
@Autowired
private AmqpTemplate amqpTemplate;
public void send(){
//創建時間
String createDate= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//發送
amqpTemplate.convertAndSend("first-queue","hello,rabbitmq!!!+date="+createDate);
}
public void send2(){
//創建時間
String createDate= LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//發送
amqpTemplate.convertAndSend("two-queue","hello,rabbitmq!!!+date="+createDate);
}
}
8.消費者
package com.zking.rabbitmq01.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
/*
* 功能描述: <br>
* 〈〉消費者,消費消息隊列中的消息
* @Param:
* @Return:
* @Author: 驕傲的骨傲天
* @Date: 2019/12/23 17:05
*/
@Component
@RabbitListener(queues = {"first-queue","two-queue"})
@Slf4j
public class QueueReceiver {
@RabbitHandler
public void handlerMessage(String message){
log.info("消費者已經接收到隊列中的message");
log.info("message={}",message);
}
}
給生產者創建Junit測試
package com.zking.rabbitmq01.controller;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class SendControllerTest {
@Autowired
private SendController sendController;
@Test
public void send() {
//調用兩方法給消息隊列發送信息
sendController.send();
sendController.send2();
}
}
七、測試
運行測試類
最終效果
在這里插入圖片描述
智能推薦
rabbitMQ入門
序:安裝rabbitMQ 參考:https://blog.csdn.net/Yuwen_forJava/article/details/81661929 1. 什么是rabbitMQ MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。MQ是消費-生產者模型的一個典型的代表,一端往消息隊列中不斷寫入消息,而另一端則可以讀取隊列中的消息。 Rabbi...
RabbitMQ入門
文章目錄 1、RabbitMQ簡介 各大主流中間件對比 初識RabbitMQ 哪些大廠在用RabbitMQ,為什幺? RabbitMQ高性能的原因? 什么是AMQP高級消息隊列協議? AMQP核心概念(重點) 2、RabbitMQ安裝及使用 Centos安裝方式 詳細步驟 Docker安裝方式(推薦) 常用操作命令 命令行與管控臺-基礎操作 命令行與管控臺-高級操作 3、RabbitMQ快速入門 ...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
猜你喜歡
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...