1. 程式人生 > >SpringBoot(八) Spring和訊息佇列RabbitMQ

SpringBoot(八) Spring和訊息佇列RabbitMQ

概述

1.大多數應用中,可以通過訊息服務中介軟體來提升系統非同步能力和拓展解耦能力。

2.訊息服務中的兩個重要概念:訊息代理(Message broker)目的地(destination)

當訊息傳送者傳送訊息後,將由訊息代理接管,訊息代理保證訊息傳遞到指定目的地。

3.訊息佇列主要有兩種形式的目的地: 

    1. 佇列:點對點方式通訊(point-to-point)
    2. 主題:釋出/訂閱訊息服務

點對點式:訊息傳送者傳送訊息後,訊息代理將其放入一個佇列中,訊息接受者從佇列中讀取資料,接受者接收資料後,將訊息移除佇列。

釋出訂閱:訊息釋出者將訊息釋出到主題中,多個接受者可以訂閱主題,當訊息到達時,所有的訂閱者都會接收到訊息。

4.JMS(Java Message Service) Java訊息服務:基於JVM訊息代理的規範。

5.AMQP(Advanced Message Queuing Protocol):它是一個面向訊息中介軟體的開放式標準應用層協議。相容JMS,RabbitMQ是AMQP的一個實現。


JMS
AMQP
定義 Java API 網路線級協議
跨平臺
跨語言
Model (1)、Peer-2-Peer
(2)、Pub/Sub
(1)、direct exchange
(2)、fanout exchange
(3)、topic change
(4)、headers exchange
(5)、system exchange
後四種都是pub/sub ,差別路由機制做了更詳細的劃分
支援訊息型別 TextMessage
MapMessage
ByteMessage
StreamMessage
ObjectMessage
Message
byte[]通常需要序列化

RabbitMQ

Message:訊息頭和訊息體組成,訊息體是不透明的,而訊息頭上則是由一系列的可選屬性組成,屬性:路由鍵【routing-key】,優先順序【priority】,指出訊息可能需要永續性儲存【delivery-mode】

Publisher:訊息的生產者,也是一個向交換器釋出訊息的客戶端應用程式

Exchange:交換器,用來接收生產者傳送的訊息並將這些訊息路由給伺服器中的佇列

Exchange的4中型別:direct【預設】點對點,fanout,topic和headers, 釋出訂閱,不同型別的Exchange轉發訊息的策略有所區別

Queue:訊息佇列,用來儲存訊息直到傳送給消費者,它是訊息的容器,也是訊息的終點,一個訊息可投入一個或多個佇列,訊息一直在佇列裡面,等待消費者連線到這個佇列將資料取走。

Binding:繫結,佇列和交換機之間的關聯,多對多關係

Connection:網路連線,例如TCP連線

Channel:通道,多路複用連線中的一條獨立的雙向資料流通道,通道是建立在真是的TCP連結之內的虛擬連線AMQP命令都是通過通道傳送出去的。不管是釋出訊息,訂閱佇列還是接受訊息,都是通道,減少TCP的開銷,複用一條TCP連線。

Consumer:訊息的消費者,表示一個從訊息佇列中取得訊息的客戶端的 應用程式

VirtualHost:小型的rabbitMQ,相互隔離

Broker:表示訊息佇列 服務實體

Exchange的三種方式

direct:根據路由鍵直接匹配,一對一

fanout:不經過路由鍵,直接傳送到每一個佇列

topic:類似模糊匹配的根據路由鍵,來分配繫結的佇列。#匹配一個或者多個單詞,*匹配一個單詞

RabbitMQ安裝與使用

在RabbitMQ官網的下載頁面https://www.rabbitmq.com/download.html中,我們可以獲取到針對各種不同作業系統的安裝包和說明文件。這裡,我們將對幾個常用的平臺一一說明。

下面我們採用的Erlang和RabbitMQ Server版本說明:

  • Erlang/OTP 19.1
  • RabbitMQ Server 3.6.5

Windows安裝

  1. 安裝Erland,通過官方下載頁面http://www.erlang.org/downloads獲取exe安裝包,直接開啟並完成安裝。
  2. 安裝RabbitMQ,通過官方下載頁面https://www.rabbitmq.com/download.html獲取exe安裝包。
  3. 下載完成後,直接執行安裝程式。
  4. RabbitMQ Server安裝完成之後,會自動的註冊為服務,並以預設配置啟動起來。

Docker安裝

1、開啟虛擬機器,在docker中安裝RabbitMQ

#1.安裝rabbitmq,使用映象加速
docker pull registry.docker-cn.com/library/rabbitmq:3-management
[[email protected] ~]# docker images
REPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE
registry.docker-cn.com/library/rabbitmq        3-management        c51d1c73d028        11 days ago         149 MB
#2.執行rabbitmq
##### 埠:5672 客戶端和rabbitmq通訊 15672:管理介面的web頁面

docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq c51d1c73d028

#3.檢視執行
docker ps

2、開啟網頁客戶端並登陸   網址:http://localhost:15672/,賬號【guest】,密碼【guest】,登陸。

3、新增 【direct】【faout】【topic】的繫結關係等

4、釋出資訊測試 。

SpringBoot整合RabbitMQ

(1)Java程式碼的方式使用RabbitMQ

1.在pom.xml檔案中新增依賴

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.7.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2.在application.properties中配置關於RabbitMQ的連線和使用者資訊,使用者可以回到上面的安裝內容,在管理頁面中建立使用者。

spring:
  rabbitmq:
    host: 192.168.1.125
    port: 5672
    username: guest
    password: guest

3.建立訊息生產者。通過注入RabbitTemplate介面的例項來實現訊息的傳送,RabbitTemplate介面定義了一套針對AMQP協議的基礎操作。在Spring Boot中會根據配置來注入其具體實現。

 @Autowired
    RabbitTemplate rabbitTemplate;

    @Test
    public void contextLoads() {
        //Message需要自己構建一個;定義訊息體內容和訊息頭
        // rabbitTemplate.send(exchange, routingKey, message);
        //Object 預設當成訊息體,只需要傳入要傳送的物件,自動化序列傳送給rabbitmq;
        Map<String,Object> map = new HashMap<>();
        map.put("msg", "這是第一個資訊");
        map.put("data", Arrays.asList("helloWorld",123,true));
        //物件被預設序列以後傳送出去 exchange 和 routingKey都是在瀏覽器端定義好的。
        rabbitTemplate.convertAndSend("exchange.direct","test.news",map);
    }

 4.JSON序列化

@Configuration
public class MyAMQPConfig  {

    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

5.接收訊息(取出佇列中的訊息)

@Test
public void reciverAndConvert(){

    Object o = rabbitTemplate.receiveAndConvert("test.news");
    System.out.println(o.getClass());
    System.out.println(o);

}

(2)註解方式使用RabbitMQ

1.主程式開啟RabbitMQ的註解

@EnableRabbit //開啟基於註解的rabbitmq
@SpringBootApplication
public class AmqpApplication {

    public static void main(String[] args) {
        SpringApplication.run(AmqpApplication.class, args);
    }
}

2.使用註解的方式接收

@Service
public class BookService {
    @RabbitListener(queues = "test.news")
    public void receive(Book book){
        System.out.println(book);
    }

    @RabbitListener(queues = "test")
    public void receive02(Message message){
        System.out.println(message.getBody());
        System.out.println(message.getMessageProperties());
    }
}

(3)建立 Exchange(交換器)、Queue(訊息佇列)、Bind(繫結規則)--- AmqpAdmin。

1.建立一個Exange

@Test
public void createExchange(){
    amqpAdmin.declareExchange(new DirectExchange("amqpadmin.direct"));
    System.out.println("Create Finish");
}

2.建立Queue

@Test
public void createQueue(){

    //引數1:名字  引數2:是否持久化  
    amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
    System.out.println("Create Queue Finish");
}

3.建立Bind規則

@Test
public void createBind(){
    //引數1:目的地    引數2:型別(佇列或者交換器)   引數3:exchange的名稱    引數4:路由件       引數5:引數
    amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE , "amqpadmin.direct", "amqp.haha", null));
}

 4.刪除

@Test
public void deleteExchange(){
    amqpAdmin.deleteExchange("amqpadmin.direct");
    System.out.println("delete Finish");
}

相關推薦

SpringBoot() Spring訊息佇列RabbitMQ

概述 1.大多數應用中,可以通過訊息服務中介軟體來提升系統非同步能力和拓展解耦能力。 2.訊息服務中的兩個重要概念:訊息代理(Message broker)和目的地(destination) 當訊息傳送者傳送訊息後,將由訊息代理接管,訊息代理保證訊息傳遞到指定目的地。 3.訊息佇列主要有兩種形式的目的

SpringBoot() Spring消息隊列RabbitMQ

tap [] 應用 三種 jms 鏈接 安裝 tps name 概述 1.大多數應用中,可以通過消息服務中間件來提升系統異步能力和拓展解耦能力。 2.消息服務中的兩個重要概念:消息代理(Message broker)和目的地(destination) 當消息發送者發送

Spring整合訊息佇列RabbitMQ(訊息失敗處理)

1. RabbitMQ簡介 1.1. RabbitMQ RabbitMQ是由Erlang(愛立信公司)語言開發,實現Advanced Message Queuing Protocol (AMQP高階訊息佇列協議)的訊息中介軟體。訊息中介軟體主要用於元件之間的解耦,訊息的傳送者無需知道訊息使用者的存在,

springboot整合rabbitmq,根據查詢的資訊建立多個訊息中心訊息佇列,並實現不同的訊息傳送到不同的訊息中心

      今天接到一個需求,就是在傳送訊息到rabbitmq訊息中心的時候,需要根據裝置型別,將訊息傳送到不同的訊息佇列,因此要建立不同的訊息佇列。       修改之前是把配置資訊寫在配置文中,專案啟動時,獲取配置檔案中的配置資訊,建立訊息佇列。       修改後的邏輯

Rabbitmq交換器Exchange訊息佇列

通常我們談到佇列服務, 會有三個概念: 發訊息者、佇列、收訊息者,RabbitMQ 在這個基本概念之上, 多做了一層抽象, 在發訊息者和 佇列之間, 加入了交換器 (Exchange). 這樣發訊息者和佇列就沒有直接聯絡, 轉而變成發訊息者把訊息給交換器, 交換器根據排程策略再把訊息再給佇列。 交換器的功能

java B2B2C Springboot電子商城系統-訊息佇列RabbitMQ

常見的訊息佇列 需要JAVA Spring Cloud大型企業分散式微服務雲構建的B2B2C電子商務平臺原始碼請加企鵝求求:二一四七七七五六三三 目前業界有四款常用的訊息佇列,它們分別是RabbitMQ、RocketMQ、ActiveMQ和Kafka。 RabbitMQ Rabbit

訊息佇列RabbitMQSpring整合

1.RabbitMQ簡介 RabbitMQ是流行的開源訊息佇列系統,用erlang語言開發。RabbitMQ是AMQP(高階訊息佇列協議)的標準實現。 官網:http://www.rabbitmq.com/ 2.Spring整合RabbitM

訊息佇列 RabbitMQSpring 整合使用

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSc

MQ訊息佇列--RabbitMQ整合Spring理論及例項講解

今天Boss叫我去他的小黑屋分配任務,出門就記得倆詞“MQ”、“訊息佇列”。從來都沒聽說過這讓我怎麼搞?對於這種情況我慣有的方法論就是:先搞清楚它是什麼、有什麼用、有什麼工具可用、怎麼用,然後就是……擼起袖子使勁幹吧! 1、什麼是訊息佇列 訊息是指在兩個

訊息佇列 RabbitMQ

什麼叫訊息佇列 訊息(Message)是指在應用間傳送的資料。訊息可以非常簡單,比如只包含文字字串,也可以更復雜,可能包含嵌入物件。 訊息佇列(Message Queue)是一種應用間的通訊方式,訊息傳送後可以立即返回,由訊息系統來確保訊息的可靠傳遞。訊息

訊息佇列RabbitMQ應答模式

為了確保訊息不會丟失,RabbitMQ支援訊息應答。消費者傳送一個訊息應答,告訴RabbitMQ這個訊息已經接收並且處理完畢了。RabbitMQ就可以刪除它了。如果一個消費者掛掉卻沒有傳送應答,RabbitMQ會理解為這個訊息沒有處理完全,然後交給另一個消費者去重新處理。這樣,你就可以確認即使消費者偶爾掛掉也

activeMQ的訂閱者訊息佇列的應用

1.PTP模型 PTP(Point-to-Point)模型是基於佇列(Queue)的,對於PTP訊息模型而言,它的訊息目的是一個訊息佇列(Queue),訊息生產者每次傳送訊息總是把訊息送入訊息佇列中,訊息消費者總是從訊息佇列中讀取訊息.先進佇列的訊息將先被訊息消費者讀取. 傳送方發訊息到佇列

訊息佇列rabbitmq在mac上的安裝

一、安裝rabbitMq.         在mac平臺上安裝rabbitMq,開啟終端,在終端上輸入以下命令: brew install rabbitmq        安裝rabbitMq需要一些時間

springboot整合redis實現訊息佇列

在java中直接使用redis的時候,直接使用簡單的兩個指令lpush和rpop或者rpush和lpop就可以實現訊息佇列的操作。當與spring結合時,可以使用RedisTemplate和StringRedisTemplate;這兩個Template是spring封裝了對Redis的一些常用的

Python 訊息佇列rabbitmq使用之工作佇列使用多個worker接收訊息

前面已經介紹過怎麼安裝rabbitmq以及要使用的三方庫 因此這裡直接進入例項 1、釋出端程式碼 # new_task.py import pika # 匯入pika import sys

Python 訊息佇列rabbitmq使用之 更加細緻的 有選擇的 釋出訊息/接收訊息

1、釋出端程式碼 # new_topic_p.py import pika import sys connection = pika.BlockingConnection(pika.Connec

Python 訊息佇列rabbitmq使用之 實現一個RPC系統

1、服務端程式碼 # rpc_server.py import pika # 建立連線 connection = pika.BlockingConnection(pika.ConnectionP

使用訊息佇列RabbitMQ

RabbitMQ 即一個訊息佇列,主要是用來實現應用程式的非同步和解耦,同時也能起到訊息緩衝,訊息分發的作用。 RabbitMQ是實現AMQP(高階訊息佇列協議)的訊息中介軟體的一種,AMQP,即Advanced Message Queuing Protocol, 高階訊息

Spring原始碼——訊息佇列

前言 內容主要參考自《Spring原始碼深度解析》一書,算是讀書筆記或是原書的補充。進入正文後可能會引來各種不適,畢竟閱讀原始碼是件極其痛苦的事情。 本文主要涉及書中第十三章的部分,依照書中內容以及個人理解對Spring原始碼進行了註釋,詳見Github倉庫:https://gi

第 21 講 在Springboot使用Redis實現訊息佇列

第二十一講 在Springboot使用Redis實現訊息佇列 1.引入依賴:pom.xml <dependency> <groupId>org.springframew