SpringBoot(八) Spring和訊息佇列RabbitMQ
概述
1.大多數應用中,可以通過訊息服務中介軟體來提升系統非同步能力和拓展解耦能力。
2.訊息服務中的兩個重要概念:訊息代理(Message broker)和目的地(destination)
當訊息傳送者傳送訊息後,將由訊息代理接管,訊息代理保證訊息傳遞到指定目的地。
3.訊息佇列主要有兩種形式的目的地:
- 佇列:點對點方式通訊(point-to-point)
- 主題:釋出/訂閱訊息服務
點對點式:訊息傳送者傳送訊息後,訊息代理將其放入一個佇列中,訊息接受者從佇列中讀取資料,接受者接收資料後,將訊息移除佇列。
釋出訂閱:訊息釋出者將訊息釋出到主題中,多個接受者可以訂閱主題,當訊息到達時,所有的訂閱者都會接收到訊息。
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安裝
- 安裝Erland,通過官方下載頁面
http://www.erlang.org/downloads
獲取exe安裝包,直接開啟並完成安裝。 - 安裝RabbitMQ,通過官方下載頁面
https://www.rabbitmq.com/download.html
獲取exe安裝包。 - 下載完成後,直接執行安裝程式。
- 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
訊息佇列RabbitMQ與Spring整合
1.RabbitMQ簡介 RabbitMQ是流行的開源訊息佇列系統,用erlang語言開發。RabbitMQ是AMQP(高階訊息佇列協議)的標準實現。 官網:http://www.rabbitmq.com/ 2.Spring整合RabbitM
訊息佇列 RabbitMQ 與 Spring 整合使用
<?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