1. 程式人生 > >SpringBoot28 RabbitMQ知識點、Docker下載RabbitMQ、SpringBoot整合RabbtiMQ

SpringBoot28 RabbitMQ知識點、Docker下載RabbitMQ、SpringBoot整合RabbtiMQ

wired provide 進行 prop oca key plugin sim clu

1 RabbitMQ知識點

  1.1 整體架構圖

    消息生產者將消息投遞到exchange中,exchange會以某種路由機制將生產者投遞的消息路由到queue中,消息消費者再從queue中獲取消息進行消費

技術分享圖片

技術分享圖片

  1.2 核心概念

    1.2.1 server

      又稱Broker,接收客戶端的連接,實現AMQP實體服務

    1.2.2 Connection

      連接,應用服務與Broker的網絡連接(PS:和JDBC中的connection作用相似)

    1.2.3 Channel

      網絡信道,幾乎所有的操作都在Channel中進行,Channel是進行消息讀寫的通道。客戶端可建立多個Channel,每個Channel代表一個會話。【PS:相當於JDBC的Statement】

    1.2.4 Message

      消息,服務器和應用程序之間傳遞的數據,由Properties和Body組成;Properties可以對消息進行修飾,比如消息的優先級、遲延等高級特性;Body則就是消息的內容。

    1.2.5 Virtual Host

      虛擬地址,用於進行邏輯隔離的最上層的消息路由。一個Virtual Host 裏面可以有若幹個Exchange 和 Queue,同一個Virtual Host裏面不能有相同名稱的Exchange或Queue;默認是 / , Virtual Host 通常用來進行項目劃分,即:一個項目相關的exchange 和 queue 都在一個Virtual Host中。

    1.2.6 Exchange

      交換機,用於接收消息;根據路由鍵轉發消息綁定的隊列

    1.2.7 Binding

      Exchange 和 Queue 之間的虛擬連接,Binding 可以包含routing key。

    1.2.8 Routing Key

      一個路由規則,虛擬機可以用它來確定如何路由一個特定消息;就是exchange和queue的路由規則

    1.2.9 Queue

      也稱Message Queue,消息隊列,保存消息並將他們轉發給消費者

  1.3 RabbitMQ消息的流轉

    消息發布者會發送一個消息、exchange、routeing Key 到rabbtiMQ,他們先經過 Virtual Host , 再經過 Exchange, 再到Queue;消息消費者再到Queue中獲取消息

技術分享圖片

2 Docker下載RabbiMQ

  2.1 Docker環境搭建

    請參見另外一篇博文:點擊前往

    docker版本為:

技術分享圖片

  2.2 安裝RabbitMQ

    2.2.1 拉取RabbitMQ鏡像

docker pull rabbitmq:3.7.7-management

      技巧01:rabbitMQ的版本可以去官網進行查看

技術分享圖片

    2.2.2 查看拉取的鏡像列表

技術分享圖片

    2.2.3 創建並啟動rabbitMQ容器

docker run -d --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.7.7-management

      技巧01:-p 是將虛擬機的端口和docker中的端口做一個映射,這樣訪問虛擬機的端口就相當於訪問了docker中的端口

      技巧02:5672是連接rabbtiMQ的端口,15672是連接rabbitMQ管理頁面的端口

    2.2.4 查看啟動的rabbitMQ容器

技術分享圖片

  2.3 連接rabbitMQ管理頁面

    技巧01:直接在瀏覽器訪問 虛擬機IP + rabbtiMQ管理頁面端口 即可,例如:

http://192.168.233.135:15672/

    技巧02:第一次訪問的時候需要輸入用戶名和用戶密碼,默認的用戶名和用戶密碼是guest

技術分享圖片

    技巧03:訪問成功後的界面如下

技術分享圖片

3 SpringBoot整合RabbitMQ之消費發布者

  3.1 創建一個SpringBoot項目

    引入相關依賴:web、amqp,其他的都是輔助依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
技術分享圖片
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xunyji</groupId>
    <artifactId>rabbitmq01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>rabbitmq01</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
pom.xml

  3.2 配置文件

技術分享圖片

技術分享圖片
# rabbitMQ基本配置
spring.rabbitmq.addresses=192.168.233.135:5672
spring.rabbitmq.username=guest
spring.activemq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000

server.servlet.path=/
server.port=8001


spring.http.encoding.charset=UTF-8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
spring.jackson.default-property-inclusion=non_null
application.properties

  3.3 發布消息

    依賴註入RabbitTemplate的實例並調用實例方法convertAndSend發布消息

技術分享圖片

    技巧01:在進行發布之前需要在rabbitMQ中設置響應的exchange和queue

    3.3.1 在RabbitMQ中添加exchange

技術分享圖片

      技巧01:添加完成後exchange列表中就會出現新增的exchange信息

技術分享圖片

    3.3.2 在RabbitMQ中添加Queue

技術分享圖片

      技巧01:添加完queue後就會在queue列表中看到新添加的queue

技術分享圖片

    3.3.3 設置exchange和queue的路由規則

      技巧01:exchange和queue都可以進行設置,只有一方設置了就可以啦

技術分享圖片

  3.4 測試

    向rabbitMQ發布一則消息

技術分享圖片

技術分享圖片
package com.xunyji.rabbitmq01.producer;

import com.xunyji.rabbitmq01.Rabbitmq01ApplicationTests;
import com.xunyji.rabbitmq01.entity.Order;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.UUID;

import static org.junit.Assert.*;

@Component
@Slf4j
public class OrderSenderTest extends Rabbitmq01ApplicationTests {

    @Autowired
    private OrderSender orderSender;

    @Test
    public void test01() throws Exception {

        Order order = Order.builder()
                .id("20180830")
                .name("測試訂單01")
                .messageId(System.currentTimeMillis() + "$" + UUID.randomUUID().toString())
                .build();

        orderSender.sendOrder(order);


    }

}
View Code

    技巧01:發送成功後,queue中就會有有一條為被消費的消息;當消息消費者消費了過後才會從隊列中剔除

技術分享圖片

4 SpringBoot整合RabbitMQ之消費訂閱者

  4.1 創建一個SpringBoot項目

    引入必要依賴:web、ampq,其余都是輔助依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
技術分享圖片
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.xunyji</groupId>
    <artifactId>rabbitmq02-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>rabbitmq02-consumer</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
pom.xml

  4.2 配置文件

技術分享圖片

技術分享圖片
#springboot整合mq的基本配置
spring.rabbitmq.addresses=192.168.233.135:5672
spring.rabbitmq.username=guest
spring.activemq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000

#springboot整合mq的消費配置
spring.rabbitmq.listener.simple.concurrency=5
spring.rabbitmq.listener.simple.max-concurrency=10
spring.rabbitmq.listener.simple.acknowledge-mode=manual
spring.rabbitmq.listener.simple.prefetch=1


server.servlet.path=/
server.port=8002


spring.http.encoding.charset=UTF-8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
spring.jackson.default-property-inclusion=non_null
View Code

  4.3 消費方法編寫

    在消費方法上利用註解開啟監聽和指定監聽那個隊列即可

    技巧01:@RabbitHandler 和 @RabbitListener 註解可以自動到rabbitMQ中生成exchange和queue的綁定關系

技術分享圖片

    4.4 獲取消息

      由於rabbitMQ中已經有一條消息待處理了,所以直接啟動項目就可以完成消息的消費,消費後rabbitMQ中待消費的消息數量就為0啦

技術分享圖片

5 本博文源代碼

  點擊前往

    

技術分享圖片

SpringBoot28 RabbitMQ知識點、Docker下載RabbitMQ、SpringBoot整合RabbtiMQ