• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 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();
        }
    }
    

    七、測試
    運行測試類

    最終效果
    在這里插入圖片描述
    在這里插入圖片描述

    版權聲明:本文為qq_43469718原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_43469718/article/details/103671005

    智能推薦

    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快速入門 ...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    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 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...

    精品国产乱码久久久久久蜜桃不卡