Rabbitmq從安裝到簡單入門
1:Rabbitmq是什麼?
- RabbitMQ是實現了高階訊息佇列協議(AMQP)的開源訊息代理軟體(亦稱面向訊息的中介軟體)。
- 它由以高效能、健壯以及可伸縮性出名的 Erlang 寫成。
2:它的優點:
- 它可以使架構變得鬆耦合,增強緩衝,從而更有彈性,更靈活
- 效能,rabbitmq效能比較的全面,是訊息中介軟體的首選。
- 高併發,從實現語言來看的話,rabbitmq最高,這主要的就是因為,rabbitmq實現語言是天生就具備高併發高可用的erlang語言
- 持久化訊息方面比較,zeroMq不支援activeMq和rabbitMq都支援
3:Rabbitmq的名詞解釋(來自尚矽谷mq教程:
1:Virtual host:出於多租戶和安全因素設計的,把 AMQP 的基本元件劃分到一個虛擬的分組中,類似
於網路中的 namespace 概念。當多個不同的使用者使用同一個 RabbitMQ server 提供的服務時,可以劃分出
多個 vhost,每個使用者在自己的 vhost 建立 exchange/queue 等
2:Connection:
publisher/consumer 和 broker 之間的 TCP 連線
3:Channel
如果每一次訪問 RabbitMQ 都建立一個 Connection,在訊息量大的時候建立 TCP
Connection 的開銷將是巨大的,效率也較低。Channel 是在 connection 內部建立的邏輯連線,如果應用程
序支援多執行緒,通常每個 thread 建立單獨的 channel 進行通訊,AMQP method 包含了 channel id 幫助客
戶端和 message broker 識別 channel,所以 channel 之間是完全隔離的。Channel 作為輕量級的
Connection 極大減少了作業系統建立 TCP connection 的開銷
4:Exchange
message 到達 broker 的第一站,根據分發規則,匹配查詢表中的 routing key,分發
訊息到 queue 中去。常用的型別有:direct (point-to-point), topic (publish-subscribe) and fanout
(multicast)
5:Queue:
訊息最終被送到這裡等待 consumer 取走
6:Binding:
exchange 和 queue 之間的虛擬連線,binding 中可以包含 routing key,Binding 資訊被保
存到 exchange 中的查詢表中,用於 message 的分發依據
docker run --name rabbit --restart=always -p 15672:15672 -p 5672:5672 -d rabbitmq:management
即可找到docker的映象自動下載 然後訪問 伺服器ip:15672 即可
如果訪問不了可能是防火牆問題: 關閉防火牆即可:
systemctl stop firewalld
web端顯示這樣就表示連線成功
使用者名稱和密碼統一預設為
guest
如果想新增可以在:
5:java中如何使用Rabbitmq:
第一步引入依賴:
<!--指定 jdk 編譯版本--> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build> <dependencies> <!--rabbitmq 依賴客戶端--> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.8.0</version> </dependency> <!--操作檔案流的一個依賴--> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> </dependencies>
第二步:模擬生產者傳送訊息:
/** * 生廠者 */ public class Producer { private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception { //建立一個連線工廠 ConnectionFactory factory = new ConnectionFactory(); //ip factory.setHost("ip地址"); //使用者名稱 factory.setUsername("使用者名稱"); //密碼 factory.setPassword("密碼"); //channel 實現了自動 close 介面 自動關閉 Connection connection = factory.newConnection(); //建立一個通道 Channel channel = connection.createChannel(); /** * 建立一個佇列 * 引數解釋: * 1:第一個引數是佇列名稱 * 2:第二個引數是是否將裡面的訊息持久化 預設為false * 3:第三個是否開啟訊息共享 允許多個消費者消費 * 4:是否自動刪除訊息 當斷開連線則 自動刪除 true自動刪除 false不自動 * 5:其他引數 */ channel.queueDeclare(QUEUE_NAME,false,false,false,null); //傳送訊息 模擬 String message="hello world"; /** * 傳送訊息 * 1:傳送到哪個交換機 * 2:佇列名稱 * 3:前臺引數資訊 * 4:傳送訊息內容 二進位制體 */ channel.basicPublish("",QUEUE_NAME,null,message.getBytes()); System.out.println("訊息以傳送"); } }
執行可在客戶端檢視結果 是否生產成功:
那麼就可以寫消費者了:
/* 消費者 */ public class Consumer { //佇列的名稱 private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception{ //建立一個連線工廠 ConnectionFactory factory = new ConnectionFactory(); //ip factory.setHost("47.98.130.29"); //使用者名稱 factory.setUsername("root"); //密碼 factory.setPassword("5825600"); //channel 實現了自動 close 介面 自動關閉 Connection connection = factory.newConnection(); //建立一個通道 Channel channel = connection.createChannel(); //消費沒成功的回撥 DeliverCallback deliverCallback=(consumerTag,message)->{ System.out.println(new String(message.getBody())); }; //消費取消的回撥 CancelCallback callback= consumerTag->{ System.out.println("訊息以中斷"); }; /** * 消費者消費訊息 * 1:消費哪個佇列 * 2:設定自動應答還是手動 true 和false * 3:訊息沒有成功消費的回撥 * 4:消費者取消消費的回掉 */ channel.basicConsume(QUEUE_NAME,true,deliverCallback,callback); } }
所以 rabbitmq的hello,world完成
明天更新 工作佇列