0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

RabbitMQ是什么

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-09-25 14:36 ? 次閱讀

在工作中經(jīng)常會用到消息隊列處理各種問題,今天指北君帶領(lǐng)大家來學(xué)一個很常用到的技術(shù)-RabbitMQ;接下來還會有關(guān)于RabbitMQ的系列教程,對你有幫助的話記得關(guān)注哦~

RabbitMQ是什么

隊列 :一種數(shù)據(jù)結(jié)構(gòu),先進先出。

消息隊列 :簡單的說就是用來進行消息傳輸?shù)年犃小?/p>

消息中間件 :簡單的說就是用來傳輸消息的中間載體,就是將你的信息發(fā)送到接受方,它并不關(guān)心發(fā)送的數(shù)據(jù)是什么。RabbitMQ就是一個消息中間件。

RabbitMQ的特點

  • 可靠性。支持持久化,傳輸確認,發(fā)布確認等保證了MQ的可靠性。
  • 靈活的分發(fā)消息策略。這應(yīng)該是RabbitMQ的一大特點。在消息進入MQ前由Exchange(交換機)進行路由消息。分發(fā)消息策略有:簡單模式、工作隊列模式、發(fā)布訂閱模式、路由模式、通配符模式。
  • 支持集群。多臺RabbitMQ服務(wù)器可以組成一個集群,形成一個邏輯Broker。
  • 多種協(xié)議。RabbitMQ支持多種消息隊列協(xié)議,比如 STOMP、MQTT 等等。
  • 支持多種語言客戶端。RabbitMQ幾乎支持所有常用編程語言,包括 Java、.NET、Ruby 等等。
  • 可視化管理界面。RabbitMQ提供了一個易用的用戶界面,使得用戶可以監(jiān)控和管理消息 Broker。
  • 插件機制。RabbitMQ提供了許多插件,可以通過插件進行擴展,也可以編寫自己的插件。

為什么使用消息隊列

  1. 解耦 ,模塊間的通信使用消息隊列進行,降低模塊之間的耦合度。
  2. 異步 ,模塊A處理完核心業(yè)務(wù)之后,發(fā)消息給模塊B,就可以直接返回給客戶端,提高性能。
  3. 削峰 ,短時間內(nèi)有大量請求,可以通過消息隊列來逐個處理,防止系統(tǒng)宕機。

Hello World

首先,安裝RabbitMQ,可直接使用docker安裝一個。

docker 地址:https://hub.docker.com/_/rabbitmq/tags

# 拉取鏡像
docker pull rabbitmq:management

# 啟動容器
docker run -id --hostname my-rabbit 
 --name rabbitmq 
 -p 15672:15672 
 -p 5672:5672 
 -e RABBITMQ_DEFAULT_USER=admin 
 -e RABBITMQ_DEFAULT_PASS=admin 
 rabbitmq:management

然后在網(wǎng)頁訪問:http://服務(wù)器的ip:15672,輸入賬號密碼。記得開放端口

看到此頁面代表安裝成功

圖片

準備就緒,先寫個Hello World

  1. 導(dǎo)入pom依賴
    < dependency >
         < groupId >org.springframework.boot< /groupId >
         < artifactId >spring-boot-starter-amqp< /artifactId >
    < /dependency >
    
  2. 準備工具類
    public class ConnectionUtils {
    
        public static Connection getConnection() {
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("1.15.88.28");
            factory.setPort(5672);
            factory.setUsername("admin");
            factory.setPassword("admin");
            factory.setVirtualHost("/");
            try {
                return factory.newConnection();
            } catch (IOException | TimeoutException e) {
                e.printStackTrace();
            }
            return null;
        }
    }
    
  3. 生產(chǎn)者
    public class Producer {
        // 聲明隊列的名字
        private static final String QUEUE_NAME = "queue_helloworld_1";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            // 1. 獲取連接
            Connection connection = ConnectionUtils.getConnection();
            // 2. 創(chuàng)建數(shù)據(jù)傳輸通道
            Channel channel = connection.createChannel();
            // 3. 聲明隊列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            // 4. 發(fā)送數(shù)據(jù)到隊列
            channel.basicPublish("", QUEUE_NAME, MessageProperties.PERSISTENT_TEXT_PLAIN, "第一個隊列消息...".getBytes());
            // 5. 關(guān)閉通道
            channel.close();
            // 6. 關(guān)閉連接
            connection.close();
        }
    }
    
  4. 消費者
    public class Consumer {
        // 聲明隊列的名字
        private static final String QUEUE_NAME = "queue_helloworld_1";
    
        public static void main(String[] args) throws IOException, TimeoutException {
            // 1. 獲取連接
            Connection connection = ConnectionUtils.getConnection();
            // 2. 創(chuàng)建通道
            Channel channel = connection.createChannel();
            // 3. 聲明隊列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);
            // 4. 聲明消費者
            DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    System.out.println("接收到的消息是:" + new String(body));
                    channel.basicAck(envelope.getDeliveryTag(), false);
                }
            };
            // 5. 綁定消費者
            channel.basicConsume(QUEUE_NAME, false, defaultConsumer);
        }
    }
    
  5. 測試
    1. 先啟動消費者
    2. 再啟動生產(chǎn)者
    3. 可以看到消費者的控制臺打印出 生產(chǎn)者傳遞的消息
      圖片

小結(jié)

本文到這里就結(jié)束了,簡單介紹了一下RabbitMQ是什么,以及RabbitMQ的安裝;

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2630

    瀏覽量

    47228
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    8873

    瀏覽量

    84976
  • 交換機
    +關(guān)注

    關(guān)注

    20

    文章

    2602

    瀏覽量

    98921
  • 端口
    +關(guān)注

    關(guān)注

    4

    文章

    936

    瀏覽量

    31958
  • rabbitmq
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    1009
收藏 人收藏

    評論

    相關(guān)推薦

    RabbitMQ中的發(fā)布訂閱模型

    上一篇文章中,簡單的介紹了一下RabbitMQ的work模型。這篇文章來學(xué)習(xí)一下RabbitMQ中的發(fā)布訂閱模型。 發(fā)布訂閱模型(Publish/Subscribe):簡單的說就是隊列里面的消息會被
    的頭像 發(fā)表于 09-25 14:30 ?481次閱讀
    <b class='flag-5'>RabbitMQ</b>中的發(fā)布訂閱模型

    RabbitMQ通信模型中的work模型

    上一篇文章中,簡單的介紹了一下RabbitMQ,以及安裝和hello world。 有的小伙伴留言說看不懂其中的方法參數(shù),這里先解釋一下幾個基本的方法參數(shù)。 // 聲明隊列方法
    的頭像 發(fā)表于 09-25 14:34 ?482次閱讀
    <b class='flag-5'>RabbitMQ</b>通信模型中的work模型

    RabbitMq入門教程

    RabbitMQ是一個開源的,在AMQP基礎(chǔ)上完整的,可復(fù)用的企業(yè)消息系統(tǒng)。
    的頭像 發(fā)表于 12-04 11:10 ?451次閱讀
    <b class='flag-5'>RabbitMq</b>入門教程

    基于Docker Compose部署RabbitMQ的經(jīng)驗分享

    RabbitMQ 是一個功能強大的開源消息隊列系統(tǒng),它實現(xiàn)了高效的消息通信和異步處理。
    的頭像 發(fā)表于 01-03 10:22 ?1601次閱讀
    基于Docker Compose部署<b class='flag-5'>RabbitMQ</b>的經(jīng)驗分享

    請問有STM32F4上應(yīng)用RabbitMQ或MQTT的例子嗎?

    ,是需要跑FreeRTOS 或 uCOS 么? 還是裸跑也沒有問題的?3、有沒有前輩能提供一下應(yīng)用MOTT在STM32上的例子;另外,如果我想要用RabbitMQ呢?有沒有參考的例子?
    發(fā)表于 04-03 04:35

    【飛凌嵌入式 RK3399 開發(fā)板性能試用體驗】(安裝RabbitMQ消息隊列服務(wù))

    說明relang安裝成功安裝RabbitMQServer消息隊列服務(wù)apt-get install rabbitmq-server #安裝成功自動啟動查看RabbitMQServer安裝狀態(tài)
    發(fā)表于 10-28 17:03

    Rabbitmq與esp-open-rtos集成失敗了怎么解決?

    我嘗試將 Rabbitmq 與 esp-open-rtos 集成,但失敗了。 誰能幫忙?
    發(fā)表于 05-10 11:45

    RabbitMQ-CN RabbitMQ中文文檔

    RabbitMQ_into_Chinese.zip
    發(fā)表于 04-19 10:51 ?0次下載
    <b class='flag-5'>RabbitMQ</b>-CN <b class='flag-5'>RabbitMQ</b>中文文檔

    什么情況下使用RabbitMQ或 Kafka

    如果你問自己是否Apache Kafka比RabbitMQ更好或RabbitMQ是否比Apache Kafka更可靠,我想在這里阻止你。本文將從更廣泛的角度討論這兩種情況。它關(guān)注的是這兩個系統(tǒng)提供的功能,并將指導(dǎo)您做出正確的決定,決定何時使用哪個系統(tǒng)。
    的頭像 發(fā)表于 02-22 10:35 ?534次閱讀
    什么情況下使用<b class='flag-5'>RabbitMQ</b>或 Kafka

    什么情況下使用RabbitMQ或 Kafka

    如果你問自己是否Apache Kafka比RabbitMQ更好或RabbitMQ是否比Apache Kafka更可靠,我想在這里阻止你。本文將從更廣泛的角度討論這兩種情況。它關(guān)注的是這兩個系統(tǒng)提供的功能,并將指導(dǎo)您做出正確的決定,決定何時使用哪個系統(tǒng)。
    的頭像 發(fā)表于 02-24 11:12 ?568次閱讀
    什么情況下使用<b class='flag-5'>RabbitMQ</b>或 Kafka

    RabbitMQ:消息傳遞的中介

    電子發(fā)燒友網(wǎng)站提供《RabbitMQ:消息傳遞的中介.zip》資料免費下載
    發(fā)表于 06-14 16:08 ?0次下載
    <b class='flag-5'>RabbitMQ</b>:消息傳遞的中介

    rabbitmq是什么?rabbitmq安裝、原理、部署

    rabbitmq是什么? MQ的全稱是Messagee Queue,因為消息的隊列是隊列,所以遵循FIFO 先進先出的原則是上下游傳遞信息的跨過程通信機制。 RabbitMQ是一套開源(MPL
    的頭像 發(fā)表于 07-19 13:50 ?969次閱讀

    RocketMQ和RabbitMQ的區(qū)別

    RocketMQ和RabbitMQ的區(qū)別: 架構(gòu)設(shè)計:RocketMQ是基于主題(Topic)的發(fā)布/訂閱模式,而RabbitMQ則是基于隊列(Queue)的消息代理系統(tǒng)。 語言支持
    的頭像 發(fā)表于 07-24 13:39 ?1.4w次閱讀

    RabbitMQ中的路由模型(direct)

    路由模型 RabbitMQ 提供了五種不同的通信模型,上一篇文章中,簡單的介紹了一下RabbitMQ的發(fā)布訂閱模型模型。這篇文章來學(xué)習(xí)一下RabbitMQ中的路由模型(direct)。 路由模型
    的頭像 發(fā)表于 09-25 11:32 ?434次閱讀

    redis和rabbitMQ的區(qū)別

    Redis和RabbitMQ是兩個流行的開源消息傳遞技術(shù),用于構(gòu)建高可靠、可擴展和可擴展的應(yīng)用程序。雖然它們都用于實現(xiàn)消息傳遞機制,但它們在設(shè)計和運作方式上存在一些不同之處。在本文中,我們將詳細討論
    的頭像 發(fā)表于 12-04 14:48 ?1178次閱讀