RabbitMQ:安裝

作為《學習RabbitMQ,這里沒有廢話》系列的開篇,理論上按照我個人的風格是要介紹一下什么是消息,什么是消息中間件,然后再過渡到本篇《RabbitMQ:安裝》。但之前在《學習RocketMQ,這里沒有廢話》系列的開篇《RocketMQ:消息中間件簡介》已經做過介紹,所以這里就不多說了,下面直接進入今天的主題。

RabbitMQ是當前最主流的消息中間件之一。RabbitMQ是一個開源的AMQP實現,服務器端用Erlang語言編寫,支持多種客戶端,如:Python、Java、JMS、C、PHP等,支持AJAX。用于在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。

1. 準備工作

安裝之前,當然是要下載RabbitMQ。RabbitMQ當前最新版本:3.8.5,本次我們使用的是3.8.3這個版本。

因為RabbitMQ是由Erlang語言編寫,所以在安裝RabbitMQ之前,我們需要安裝Erlang的環境。本次我們使用的是22.1這個版本。

需要注意的是,RabbitMQ和Erlang之間是有版本依賴關系的,我們可以在這里查找。

2. 安裝Erlang

(1)先解壓tar.gz文件到/usr/local/erlang目錄下

tar -zxvf opt_src_22.1.tar.gz

(2)在編譯安裝之前,先安裝一下依賴包

yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
yum -y install unixODBC unixODBC-devel

(3)編譯并安裝

cd otp_src_22.1 
./configure --prefix=/usr/local/erlang
make && make install 

(4)配置環境變量

vim /etc/profile
PATH=$PATH:/usr/local/erlang/bin
source /etc/profile

(5)使用erl命令檢查是否安裝成功

3. 安裝RabbitMQ

(1)解壓到/usr/local/rabbitmq目錄下

xz -d rabbitmq-server-generic-unix-3.8.3.tar.xz

tar xf rabbitmq-server-generic-unix-3.8.3.tar

mv rabbitmq_server-3.8.3/ /usr/local/rabbitmq/

(2)安裝必要的環境

yum install python -y
yum install xmlto -y
yum install python-simplejson -y

(3)配置環境變量

vim /etc/profile
PATH=$PATH:/usr/local/rabbitmq/rabbitmq_server-3.8.3/sbin
source /etc/profile

4. 啟動和關閉RabbitMQ服務

  • 啟動
# 后臺啟動
rabbitmq-server -detached
  • 停止
rabbitmqctl stop
  • 查看服務狀態
rabbitmqctl status

4.1 開啟web管理界面插件

RabbitMQ的優勢之一是提供了豐富的界面管理平臺,但默認情況下該插件是不開啟的。所以我們需要手動開啟。

rabbitmq-plugins enable rabbitmq_management

開啟后,通過瀏覽器訪問http://localhost:15672,用戶名和密碼都是guest

需要注意的是,guest用戶只能在localhost環境下登錄,如果我們在宿主機去訪問虛擬機的RabbitMQ管理界面使用guest用戶是不允許登錄的。

既然guest用戶不允許在宿主機登錄,我們則需要自己添加一個用戶。

4.2 創建遠程登錄用戶

(1)添加一個用戶

rabbitmqctl add_user root rabbitmq

(2)給root用戶設置權限

rabbitmqctl set_permissions -p / root ".*" ".*" ".*"

(3)賦予root用戶管理員權限

rabbitmqctl set_user_tags root administrator

此時再用root用戶即可登錄web管理界面了。

5. 測試RabbitMQ

Maven依賴:

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.7.3</version>
</dependency>

5.1 發送消息

public class BaseProducer {

    private static final String EXCHANGE_NAME = "demo.direct";
    private static final String ROUTING_KEY = "demo.routingkey";
    private static final String QUEUE_NAME = "demo.queue";

    public static void main(String[] args) throws Exception {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.1.17");
        connectionFactory.setUsername("root");
        connectionFactory.setPassword("rabbitmq");

        Connection connection = connectionFactory.newConnection();

        Channel channel = connection.createChannel();
        channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true, false, null);
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);

        String message = "Hello World!";
        channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());

        channel.close();
        connection.close();
    }
}

5.2 接收消息

public class BaseConsumer {

    private static final String QUEUE_NAME = "demo.queue";

    public static void main(String[] args) throws Exception {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("192.168.1.17");
        connectionFactory.setUsername("root");
        connectionFactory.setPassword("rabbitmq");

        Connection connection = connectionFactory.newConnection();

        Channel channel = connection.createChannel();
        Consumer consumer = new DefaultConsumer(channel) {
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("message:" + new String(body));
                channel.basicAck(envelope.getDeliveryTag(), false);
            }
        };
        channel.basicConsume(QUEUE_NAME, consumer);
    }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373