1. 程式人生 > >帶著新人學springboot的應用05(springboot+RabbitMQ 上)

帶著新人學springboot的應用05(springboot+RabbitMQ 上)

  這次就來說說RabbitMQ,這個應該不陌生了,隨便一查就知道這個是用來做訊息佇列的。(注意:這一節很多都是概念的東西,需要操作的比較少)

  至於AMQP協議(Advanced Message Queuing Protocol),專業名稱叫做高階訊息佇列協議,就是隻要你遵守這個協議,那麼做出來的產品就能跨平臺,跨語言,很牛的一個協議,具體多麼牛可以自己百度一下。

  而RabbitMQ就是基於這個協議的!很多語言都可以用RabbitMQ,例如python,C語言,PHP,Java等語言,而且windows,linux,macos等平臺都可以使用。。。

 

簡單看看使用場景:

  運用場景1:比如大家註冊部落格園的時候,註冊資訊寫入資料庫之後,還需要啟用吧!你要等部落格園的一個執行緒給你發郵件,假如這個時候註冊的人很多,那就需要非常多的執行緒,大家也知道執行緒到達一定數目效率反而是降低的,而且只有等到郵件給你傳送之後你才知道註冊成功,你就可能一直卡了幾分鐘。所以這個時候,就把很多個發郵件需要的訊息放到一個訊息佇列中你就馬上收到響應“註冊成功”,然後你就可以去玩玩手機,等一下就會收到郵件,其實對部落格園來說,只需要幾個或者幾十個執行緒慢慢的從這個佇列中取訊息、一個一個慢慢發郵件就是了。

  運用場景二:大家都知道雙11,淘寶各種活動,假如一個店鋪生意特別好,一下子賣了十幾萬件。那麼假如每個人都是提交訂單,還要去庫存那邊查查之後再呼叫方法減庫存,然後再給你響應訂單成功,emmmm....你就慢慢等十幾分鍾吧!使用者體驗賊差!但是直接把所有訂單訊息給訊息佇列(也叫做訊息中介軟體),然後立刻給使用者響應:訂單成功!使用者可以想幹嘛就幹嘛去了,而這邊的庫存系統只需要從訊息佇列中慢慢拿資料就ok,假如沒貨了還能通知店主補充貨物。

  運用場景三:很多秒殺活動,就在那一秒鐘看誰的是單身三十年的手速了!然而秒殺的點選量太高,會把那個系統卡爆了。。。所以做了一個限制,將前n個人點選的訊息放入訊息佇列(可以就設定這個佇列長度為1,那麼第二個及之後的訊息自動全部捨棄),後面的無論多少點選,直接丟掉並響應秒殺失敗!而秒殺業務只需要慢慢從這個佇列取訊息就可以做後續的操作了。

  

  簡單的下載安裝一下,因為這個RabbitMQ是用erlang這個語言開發的(反正我是沒有用過這個語言....),雖然我們不用,但是RabbitMQ啟動的時候要用這個的環境。

  就像我們的java程式要執行,肯定要jre啊,這是一個道理!所以下載一個erlang(這個讀音是不是挺像二郎啊,哈哈!話說RabbitMQ,Rabbit是兔子的意思,M指的是Message,Q代表Queue,我猜意思是不是兔子訊息佇列啊,哈哈哈)

 

1.RabbitMQ的簡單安裝

  新建一個資料夾,把erlang和RabbitMQ放在一起。

  下載relang地址:http://erlang.org/download/,多往下翻!!!我用的是下圖的這個,版本可以根據條件選擇。下完之後安裝,然後就一直next就ok了 ,存放的位置自己看著辦。(我用360極速瀏覽器下了三次都沒成功,用了谷歌一次就成功了,可還各種給我提醒不安全、對電腦有害,emmmm......看我電腦今天會不會爆炸)

  

  一番努力之後這個erlang下好了,然後到http://www.rabbitmq.com/install-windows.html下載,如果點了下面這個跳轉到了github,就點9M多的那個檔案進行下載,下完之後也是一直下一步。

 

  ok,兩個不知道什麼鬼的軟體下好了,我們就能夠看到這兩個資料夾,其中erl資料夾沒什麼用,我們把重點放在rabbitmq_server,看名字就知道這個就是一個服務端,只要啟動它,我們基本的功能就能用了(雖然我們也就只會用到基本的功能)

  

 

  開啟rabbitmq_server-3.7.9,有個sbin,進去,開啟命令視窗

 

  然後執行命令

  第一種:rabbitmq-plugins.bat enable rabbitmq_management(用了這個命令就可以直接在瀏覽器裡視覺化的看到RabbitMQ內部的資料了,類似Druid)

  第二種:"C:\Program Files\RabbitMQ Server\rabbitmq_server-3.6.5\sbin\rabbitmq-plugins.bat" enable rabbitmq_management

  其實我感覺兩種應該是一樣的,但是可能會碰到祕之錯誤,看情況用啊!出現類似下圖這個介面就ok了(因為這個命令我運行了一次了,所以可能有些出入,但大概的應該差不多),還有估計還會有其他的錯誤,其實很正常,試試命令net stop RabbitMQ && net start RabbitMQ,重啟一下試試,沒用的話就慢慢百度是什麼錯誤吧!

 

  到此安裝成功,開啟瀏覽器,輸入url:http://localhost:15672,使用者名稱和密碼都是:guest

  登入成功,出現如下這個頁面就成功了。

 

  話說這個RabbitMQ可以新增新使用者,許可權啊什麼的,emmm....我們就自己用的,不搞這麼麻煩了。

  如果不小心關閉了RabbitMQ服務端或者下次再想開啟,可以在安裝目錄xxx\rabbitmq_server-3.7.9\sbin,雙擊rabbitmq-server.bat就開啟服務端了,當然你也可以去設定windows服務。

 

2.說說RabbitMQ的基本概念

  剛開始說專業名詞很是頭痛,而聽不懂,我就來用一個小場景來引出一些概念。

  小王,小李和小陳一起去路邊小飯店吃飯,這個飯店規模不大,就一個廚師,一個服務員,我們要吃飯,怎麼辦呢?首先是跟服務員點菜,就點兩個菜,清炒小白菜和魚香肉絲,然後服務員將點好的選單丟給廚師師傅做。

  場景一: 廚師做好了,把一盤小白菜給服務員,說了一句“這是清炒小白菜”,服務員就端著小白菜就跑過來了,對那三人也說了一句“這是清炒小白菜”,然後放桌子上,服務員就走了;那三人沒過幾秒鐘就把小白菜吃完了。過了一會兒,魚香肉絲做好了,根據上面的步驟又走了一遍,魚香肉絲也被拿到桌子上,慢慢的等著被吃,服務員在這過程中是離開的,而且無論點了多少個菜,都是這樣的流程;等三人吃飽喝足之後,三人也就走了,剩下的空碗空盤子和桌子會被處理。

  這裡涉及幾個關鍵的地方:廚師,一盤小白菜,“這是清炒小白菜”,服務員,“這是清炒小白菜”,桌子,三人,服務員離開,吃完了,桌子被處理

  好了,故事聽完了,現在看看RabbitMQ的大概原理:生產者(Producer,或者叫做Publisher)生產訊息(Message),併為訊息設定一個路由鍵(Routing key),將訊息交給交換器(Exchange),交換器通過一個繫結鍵(Binding key)和一個訊息佇列繫結,只有當路由鍵和繫結鍵相同的時候,交換器就會將訊息丟給訊息佇列(Message Queue),然後交換器就不管了,然後消費者(Consumer)過來取佇列中的訊息,取完一個訊息佇列就刪除一個。

   我隨便找個圖可以看一下,下圖所示:broker在這裡指的就是RabbitMQ

 

   想想啊,小飯店可能就只有一個廚師,一個服務員,就只有你們一桌人在吃飯,但是五星級大酒店呢?肯定是廚師師傅十幾個甚至幾十個,服務員更是很多,吃飯的人也是多不勝數,很多桌都有老闆在吃飯,而訊息中介軟體也是一樣。

  實際情況就是:生產者可能有多個,交換器可能有多個,Queue可能有多個,消費者也可能有多個,下圖也只是粗略的顯示了一下幾個關鍵點。下圖的那個RoutingKey其實指的是:交換器根據不同Message內的RoutingKey,交換器和不同Queue繫結的Binding key,將這兩個key比較一下(要符合一定的規則),交換器就會把訊息丟到目的Queue內。

 

3.RabbitMQ名詞解釋(核心是RoutingKey,交換器和繫結)

  Publisher(生產者):其實就是一兩行程式碼或者一個程式,呼叫一個什麼方法傳送一個訊息

  Message(訊息):由訊息頭和訊息體組成。訊息體是真正要傳送的資料,訊息頭裡面可以設定屬性RoutingKey,其他屬性碰到再說

  Exchange(交換器):接收生產者傳過來的訊息,按照一定的規則丟給指定的Queue,具體什麼規則跟交換器型別有關,只說三種,direct(預設型別,那兩個key一定要一樣才會發給指定的一個或幾個Queue),fanout(不管什麼key了,給所有Queue發一遍訊息,類似微信公眾號的功能),topic(兩個key模糊匹配一下,差不多就行了,然後發給一個或幾個Queue)

  Queue(訊息佇列):存訊息的容器,其實就類似一個List集合,就是放物件的容器,而且有順序。

  Binding(繫結):其實就是交換器和Queue的繫結,說白了就是靠那個BindingKey(預設會用Queue的名字)嘛!注意,交換器和Queue是多對多的關係!!!一個虛擬主機可能有多個交換器,一個交換器可以繫結多個佇列,一個佇列也可以繫結多個交換器。

  Connection(網路連線):emmmm....訊息到達交換器、消費者從佇列取訊息總不可能是憑空就能做吧?肯定要建立連線啊,這裡是TCP連線

  Channel(通道):就是Connection裡面很多條通道,就跟公路一樣,分為很多個車道,讓流通更快嘛!而且每個消費者去佇列取訊息都開啟一個TCP,那麼很浪費資源,也就是會很卡。

  消費者(Consumer):表示一個程式或一兩行程式碼,從佇列拿訊息。

  Virtual Host(虛擬主機):專業的話來說就是一個RabbitMQ伺服器,可以設定很多個虛擬主機,每個虛擬主機都可以看作一個迷你型的RabbitMQ,虛擬主機之間隔離。emmmm....不就是跟電腦的虛擬機器一個道理嗎???,預設的虛擬主機url是“/”,我們還可以設定其他的虛擬主機“/abc”,"/ccd",隨意。。。

  Broker:代表訊息佇列服務主體,在我們這裡不就是RabbitMQ伺服器嘛!