<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 41  文章 - 7  trackbacks - 0
    <2016年6月>
    2930311234
    567891011
    12131415161718
    19202122232425
    262728293012
    3456789

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    本章我們將覆蓋:
    1. 使用虛擬主機
    2. 配置用戶
    3. 使用SSL
    4. 實現客戶端證書
    5. 從瀏覽器中管理RabbitMQ
    6. 配置RabbitMQ參數
    7. 開Python程序來監控RabbitMQ
    8. 自己開發web程序來監控RabbitMQ
    介紹
    一旦安裝后,RabbitMQ不需要任何配置就可以工作. 然而,RabbitMQ有許多的配置選項,這些配置選項使得它更為靈活,能工作于多種不同環境中.
    在本章中,我們將看到如何改變配置來滿足應用程序的需求。同時我們也會展示如何使用應用程序來監控RabbitMQ.

    使用虛擬主機
    在單個RabbitMQ實例中,可以包含多個不同的,獨立的虛擬broker。通過此方式,多個不同應用程序可以不用擔心命名沖突來在同一個broker中使用。你可在Chapter03/Recipe01目錄中找到簡單的java代碼, ,除了虛擬主機的使用外,它與本書的第一個食譜中的例子基本相同。

    準備
    要練習此食譜,你只需要在Linux命令行提示窗口或在Windows啟動菜單命令提示中(sbindir)敲一些命令.

    如何做
    要創建一個新虛擬主機,需要執行下面的步驟:
    1. 使用下面的命令來列出可用的虛擬主機:
    rabbitmqctl list_vhosts
    2. 執行下面的命令來創建一個新虛擬主機book_orders:
    rabbitmqctl add_vhost book_orders
    3. 列出其交換器:
    rabbitmqctl list_exchanges -p book_orders
    4. 列出用戶權限:
    rabbitmqctl list_permissions
    rabbitmqctl list_permissions -p book_orders
    5. 授權guest用戶訪問book_orders虛擬主機:
    rabbitmqctl set_permissions guest .* .* .* -p book_orders
    6. 在Java client library中使用虛擬主機:
    factory.setVirtualHost("book_orders");

    如何工作
    安裝后,RabbitMQ只定義了默認虛擬主機 /,我們很容易地通過步驟1中的命令進行檢查.
    然后我們通過執行rabbitmqctl add_vhost (步驟2)來創建一個新虛擬主機.
    在此之后,后面所有的命令都需要使用-p選項來指定新的虛擬主機。如果省略了,后續命令來應用到默認虛擬主機上。
    新加的虛擬主機還不能使用,可通過步驟4中的列出權限來快速檢查新虛擬主機還沒有進行認證,因此不能執行任何操作。
    接下來,我們為默認用戶guest在book_orders虛擬主機授予了所有權限(step 5).
    自此,我們已經能夠在連接工廠中指定新虛擬主機了,這樣就可以使得RabbitMQ客戶端連接使用新的虛擬主機,而不是默認虛擬主機。

    配置用戶
    RabbitMQ用戶對于broker實例來說是全局的,但每個用戶對于每個獨立的虛擬主機都可以設置其自己的權限。不同應用程序可使用獨立用戶和虛擬主機來作到解藕 。然而,同一應用程序可受益于相同虛擬主機的用戶權限。我們將看到如何來管理用戶以及它們的權限,并且如何在Chapter03/Recipe02 java例子中來使用.
    準備
    要運行此食譜,我們需要執行一些rabbitmqctl配置命令,并使用java設置來練習這些配置。

    如何做
    通過執行下面的步驟,我們可以看到如何來管理用戶及其權限,以用如何使用它們:
    1. 使用各自的密碼來創建一些用戶:
    rabbitmqctl add_user stat_sender password1
    rabbitmqctl add_user stat_receiver password2
    2. 給它們授予一些權限:
    rabbitmqctl set_permissions stat_sender "stat_exchange.*" "stat_.*" "^$"
    rabbitmqctl set_permissions stat_receiver "stat_.*" "stat_queue_.*" "(stat_exchange_.*)|(stat_queue_.*)"

    3. 讓Producer.java使用stat_sender用戶來連接RabbitMQ:
    factory.setUsername("stat_sender");
    factory.setPassword("password1");
    4. 然后執行下面的操作:
    channel.exchangeDeclare(...);
    channel.basicPublish(...);
    5. 讓Consumer.java使用stat_receiver用戶來連接RabbitMQ:
    factory.setUsername("stat_receiver");
    factory.setPassword("password2");
    6. 然后再執行下面的操作:
    channel.exchangeDeclare(...);
    channel.queueDeclare(...);
    channel.queueBind(...);
    channel.basicConsume(...);

    如何工作
    要本練習中,我們創建了兩個用戶(step 1).為了使用它們,我們需要使用下面的命令來分配權限:
    rabbitmqctl set_permissions <username> <conf> <write> <read>
    這里, <conf><write>, and <read> 是三個正則表達式.指定的<username>將擁有匹配隊列,交換器上的配置,寫入,讀取權限。
    在我們的例子中,Producer.java使用stat_sender用戶來訪問RabbitMQ.在步驟4中,調用了queueDeclare(),因此它必須在名為stat_exchange_03/02交換器上擁有配置權限。然后,它會發布消息到同一個交換器中,因此它也必須擁有寫入權限。但消息還會路由到stat_queue_03/02隊列中,因此該用戶還應該有此隊列上的寫入權限,否則消息就不能路由到此隊列上。通過將寫入權限設為正則表達式"stat_.*",就可授權用戶將消息發布到交換器和隊列中。
    Producer.java不需要任何的讀取權限,因此可通過指定空正則表達式"^$"來禁止讀取權限, 就像例子中展示的一樣,或者只是一個空字符串。
    另一方面,Consumer.java的用戶需要在交換器和隊列上都要擁有配置權限,同時也需要讀取權限,在我們的食譜中是"stat_.*"(在例子中也是"(stat_exchange_.*)|(stat_queue_.*)"的同義詞)。
    Consumer.java為了能將隊列綁定到交換器上,它也需要在stat_queue_03/02隊列上擁有寫入權限.
    更多
    通過用戶,我們可以限制限制其對資源的訪問,并調整其對分布應用程序中不同組件的權限。
    權限角色指的是訪問特定AMQP資源的授權:
    1. configure: 授權用戶可以聲明,刪除與指定模式匹配的隊列和交換器
    2. write: 授權用戶可以在匹配模式的資源上綁定隊列和交換器以及發布消息
    3. read: 授權用戶可綁定匹配模式的隊列和交換器,并可以消費消息

    要了解不同AMQP操作需要的權限,你可以參考http://www.rabbitmq.com/access-control.html.


    使用管理插件中的User tags
    用戶權限只是針對AMQP操作.RabbitMQ管理插件(more details later in this chapter)使用user tags繼承了這種權限模型,因此可以分配一個或多個tag字符串給任何用戶。
    要讓用戶能夠訪問管理插件,它必須擁有下面tags中的一個:
    1. management: 用戶可在其虛擬主機內查看所有隊列和交換器
    2. monitoring: 用戶可以訪問所有虛擬主機,并能查看所有隊列和交換器
    3. administration: 用戶可執行任何管理操作
    例如,要為用戶分配administrator tag,可使用下面的命令:
    rabbitmqctl set_user_tags username administrator
    默認guest用戶在默認情況下,擁有administrator tag.

    使用SSL
    無論何時,只要當RabbitMQ broker暴露在Internet上,強烈建議使用SSL library來保護連接.
    RabbitMQ 自身并沒有實現SSL,但它會使用給定語言的證書機制,服務端的Erlang以及Java, .NET,以及任何客戶端.
    在這里,我們將了解如何使用SSL來作基礎保護,以及如何來加密RabbitMQ clients與broker之間的連接.這足可以應對簡單的安全攻擊。如果沒有SSL,用戶名和密碼都在網絡上明文傳送。

    準備
    本例中需要包含下面的前提條件:
    1. 一個能運行RabbitMQ broker的Linux OS
    2. openssl Linux package
    3. 最新的Erlang包—至少為R14B
    4. 客戶端Java JDK,Linux或window之上
    在本食譜中,我們只選擇Linux作為服務器端,因為在windows上,有太多的版本組合,有一些是受限制的,有一些缺少功能。關于Windows的支持信息,可參考http://www.rabbitmq.com/ssl.html.
    如何做
    執行下面的步驟來設置證書頒發機構,并配置服務器:
    1. 在服務器上,創建CA目錄,就像Chapter03/Recipe03/certificates/01_setup_CA.sh腳本中展示的一樣:
    mkdir testca
    cd testca

    mkdir certs private
    chmod 700 private
    echo 01 > serial
    touch index.txt
    2.定制openssl配置文件,你可以在Chapter03/Recipe03/certificates/testca/openssl.cnf找到.
    3.如Chapter03/Recipe03/certificates/02_create_CA_certificates.sh中展示的一樣來創建自簽名CA證書:
    openssl req -x509 -config openssl.cnf -newkeyrsa:2048
    -days 365 -out cacert.pem -outform PEM
    -subj /CN=MyTestCA/ -nodes
    openssl x509 -in cacert.pem -out cacert.cer -outform DER
    4.如Chapter03/Recipe03/certificates/03_create_server_certificates.sh腳本中展示的來創建 RabbitMQ server private key :
    openssl genrsa -out key.pem 2048
    5.創建服務端證書請求:
    openssl req -new -key key.pem -out req.pem -outform PEM
    -subj /CN=$(hostname)/O=server/ -nodes
    6.在CA目錄,
    請求獲得簽署證書簽名:
    openssl ca -config openssl.cnf -in ../server/req.pem –out
    ../server/cert.pem -notext -batch –extensions
    server_ca_extensions
    7.從Chapter03/Recipe03/certificates,將我們剛才創建的CA 證書, 證書,以及server private key, 拷貝到下面的路徑:
    /usr/local/certificates/testca/cacert.pem
    /usr/local/certificates/server/cert.pem
    /usr/local/certificates/server/key.pem
    8.創建RabbitMQ配置文件: rabbitmq.config 可從Chapter03/Recipe03/rconfig目錄中適當的目錄(/etc/rabbitmq):
    [
    {rabbit, [
    {ssl_listeners, [5671]},
    {ssl_options, [
    {cacertfile,"/usr/local/certificates/testca/cacert.pem"},
    {certfile,"/usr/local/certificates/server/cert.pem"},

    {keyfile,"/usr/local/certificates/server/key.pem"},
    {verify,verify_peer},
    {fail_if_no_peer_cert,false}]}
    ]}
    ].
    9. 重啟RabbitMQ server:
    rabbitmqctl stop
    rabbitmq-server–detached.
    當你重啟RabbitMQ節點時,Erlang節點也會重啟.
    10. 在Java client,連接服務端可以像下面這樣做,正如Chapter03/Recipe03/src/rmqexample/Publish.java中展示的一樣:
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost(hostname);
    factory.setPort(5671);
    factory.useSslProtocol();
    Connection connection = factory.newConnection();

    如何工作
    我們通過創建一個可用于簽名服務端證書的CA目錄來開始本食譜.我們已經在服務器上執行了此步驟,但在真實世界中,CA和其私有密鑰(private key) (由步驟3創建)應該分開保存.在準備好CA之后, 我們需要像步驟4-6中展示的一樣來準備服務端證書.我們幾乎完成了,最后我們只需要將CA證書,服務端證書,以及服務端公共密鑰(public key)拷貝到最終路徑下(步驟7). 
    我們可以選擇將其存儲在/usr/local/certificates中,但其位置通常是任意的,因為它們的位置可在RabbitMQ 配置文件(rabbitmq.config)中進行指定.此文件在默認情況下,是不存在的.它必須安置在標準配置目錄,通常是位于/etc/rabbitmq中.
    除了安全文件,我們還需要配置RabbitMQ SSL端口(5671), 以及在rabbitmq.config中配置幾個選項:
    1. Verify: 當設置為to verify_peer時,它將通知RabbitMQ:如果client存在證書,那么需要進行檢查,并在證書無效時(可能是因為CA不同,或者是因為證書已過期了)進行拒絕
    2. fail_if_no_peer_cert: 當設置為false,它將通知RabbitMQ在重啟后接受那些不存在任何證書的client(你必須使用rabbitmqctl stop 和restart 服務).你可以檢查/var/log/rabbitmq中的日志文件來驗證此選項的信息. 
    你應該能夠找到下面的行:
    started SSL Listener on [::]:5671
    此外,從瀏覽器打開管理插件時,你也能夠看到相似的信息(參考Managing RabbitMQ from a browser 食譜), 就像下面展示的一樣:

    現在,如果client要通過SSL來連接broker,只需要在連接工廠上添加下面的兩個選項:
    factory.setPort(5671);
    factory.useSslProtocol();
    現在就可以使用服務器中配置的keys來加密連接了.

    更多
    由于我們只使用了服務端證書,雖然server和client之間的通信是加密的,但我們不能阻止MITM (man-in-the-middle)攻擊(中間人攻擊).如果我們想讓任何client連接server,并且避免MITM 攻擊的話, 我們采取與在HTTPS和瀏覽中的相同策略,即由可信的第三方CA機構來簽名證書,并在證書中驗證中其域,否則,我們只能繼續閱讀后面的食譜.
    實現客戶端證書
    當RabbitMQ broker和client通過Internet來通信時,只允許授權的clients來連接broker是合理的.
    這是典型的用戶密碼身份驗證的范圍,但除此之外,客戶端證書對于分布式應用程序的安全性來說具有更高的改進,同時它也可以避免MITM攻擊的可能性.
    本食譜是前面一個的擴展,因此假設我們已經進行了CA設置和服務端配置,正如前面食譜中看到的.

    如何做
    client要連接RabbitMQ server,需要執行下面的步驟:
    1. 拷貝上一個食譜中創建的證書,密鑰到Chapter03/Recipe04/certificates目錄:
    cp –rp ../Recipe03/certificates/testca .
    cp –rp ../Recipe03/certificates/server .
    2. 在client證書目錄,創建client private key,如Chapter03/Recipe04/certificates/04_create_client_certificates.sh中展示的一樣:
    openssl genrsa -out key.pem 2048
    3. 創建證書簽名請求:
    openssl req -new -key key.pem -out req.pem -outform PEM -subj /CN=$(hostname)/O=client/ -nodes
    4.在CA目錄,簽名client證書:
    openssl ca -config openssl.cnf -in ../client/req.pem -out ../client/cert.pem -notext -batch -extensions client_ca_extensions
    5. 回到client目錄,創建一個PKCS#12存儲,其中包含client證書和由密碼保護的密鑰:
    openssl pkcs12 -export -out keycert.p12 -in cert.pem -in keykey.pem -passout pass:client1234passwd
    6. 創建一個Java密鑰庫,其中包含由密碼保護的服務端證書,如Chapter03/Recipe04/certificates/05_create_keystore.sh中展示的一樣:
    keytool -importcert -alias server001 -file server/cert.pem -keystore keystore/rabbit.jks -keypass passwd1234

    7. 將rabbitmq.config中的fail_if_no_peer_cert選項設置為true:
    {fail_if_no_peer_cert,true}
    8. 重啟RabbitMQ:
    rabbitmqctl stop
    rabbitmq-server –detached
    9. 在client端, 配置SSL上下文來設置安全連接:
    char[] keyPassphrase = "client1234passwd".toCharArray();
    KeyStoreks = KeyStore.getInstance("PKCS12");
    ks.load(newFileInputStream("certificates/client/keycert.p12"), keyPassphrase);
    KeyManagerFactorykmf =KeyManagerFactory.getInstance("SunX509");
    kmf.init(ks, keyPassphrase);
    char[] trustPassphrase = "passwd1234".toCharArray();
    KeyStoretks = KeyStore.getInstance("JKS");
    tks.load(newFileInputStream("certificates/keystore/rabbit.jks"), trustPassphrase);
    TrustManagerFactorytmf =TrustManagerFactory.getInstance("SunX509");
    tmf.init(tks);
    SSLContext c = SSLContext.getInstance("SSLv3");
    c.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
    ConnectionFactory factory = newConnectionFactory();
    factory.setHost(hostname);
    factory.setPort(5671);
    factory.useSslProtocol(c);
    Connection connection = factory.newConnection();

    如何工作
    client證書要能工作,必須使用簽名服務端的同一個CA來簽名. 一旦準備好證書,將其保存到密鑰庫中是非常有用的, 如步驟5中展示的PKCS#12存儲.
    client 也需要服務端證書—它包含了服務端公共密鑰—對此我們也準備了一個密鑰庫(通過Java keytool命令生成的密鑰庫).

    隨后我們重新配置了RabbitMQ (步驟6-7).通過這種方式,如果client沒有提供證書,服務端就會拒絕其連接.現在你可以很容易地運行前面的例子來進行檢查.
    一旦client證書準備就緒,RabbitMQ client (步驟8)必須使用它們來設置SSLContext.與先前例子不同,我們只需要下面的調用:
    factory.useSslProtocol(c);
    client只有遵循這些設置才能連接RabbitMQ server. client 雖提供了這些證書,但不能連接到帶有不同服務端私鑰的服務器,因為它們之間的加密通信使用的是存儲在服務器證書中服務端公共密鑰.

    從瀏覽器中管理RabbitMQ
    在本食譜中,我們將展示如何使用管理插件中的HTTP API來管理RbbitMQ.這個插件提供實時圖表來監控你的消息流. 幸運的是,它也提供了HTTP API來分析RabbitMQ. 為了執行這些活動,這些是外部監控系統( Ganglia (http://ganglia.sourceforge.net/), Puppet (http://puppetlabs.com),以及其它系統)所必須的.
    準備
    你只需要一個 web瀏覽器.
    如何做
    為了啟用插件,你必須執行下面的步驟:
    1. 執行下面的命令:
    rabbitmq-plugins enable rabbitmq_management
    2. 重啟RabbitMQ.
    3. 插件會啟用一個web服務器,它可以通過http://localhost:15672/訪問. 要從其它機器訪問,可以用你的RabbitMQ 主機名/IP來替換localhost.
    如何工作
    默認情況下,web application使用guest/guest作為RabbitMQ 用戶的用戶名/密碼. Web 管理是非常直觀的,你可以管理隊列,交換器,用戶,連接,虛擬主機,當然也可以發送和接收信息.
    在第一個tab中,你可以找到系統的概述信息:如排隊的消息,消息速率,以及全局計數.然后,你可以找到節點描述信息.點擊節點可以得到更多詳細信息:
    在之前的screenshot中,你可以看到可幫助你診斷問題的信息.
    TIP
    如果在Windows上運行RabbitMQ,你需要在執行路徑(C:/Windows/system32)中安裝Hanlde.exe工具 (http://technet.microsoft.com/enus/sysinternals/bb896655. 否則,控制臺不能顯示文件描述符的總數信息.
    在同個頁面,還可以看到Erlang模塊的版本信息(譯者注:右上角).
    在overview的下邊部分,你還可以看AMQP broker監聽的端口,以及安裝的插件(web contexts):

    更多 
    在http://localhost:15672/api/,你可以訪問HTTP API. 通過使用HTTP APIs,用戶可以創建一個自定義的控制臺,就像我們即將在開發Python 程序來監控RabbitMQ食譜中看到的一樣.


    也可參考
    http://www.rabbitmq.com/management.html, 你可以找到關于console的所有信息.

    配置RabbitMQ參數
    在本食譜中,我們將介紹RabbitMQ參數.默認情況下,broker不會創建配置文件,因為在大多數情況下,你不需要改變它們.但,知道如何配置環境變量和broker參數是很重要的.

    如何做
    在RabbitMQ中,你可以配置環境變量和服務端文件配置(注意區別).使用環境變量,你可以修改像服務器端口和節點名稱的參數.可通過兩種方式來修改變量:
    1. 在你的shell環境中定義變量.
    2. 在 /etc/rabbitmq中創建一個rabbitmq-env.conf文件.
    例如,如果你想要修改RabbitMQ節點名稱,你可以這樣做:
    1. 停止server.
    2. 要么在shell中執行RABBITMQ_NODENAME=mylittlerabbit,要么在 /etc/rabbitmq/rabbitmqenv.conf中插入字符串NODENAME=mylittlerabbit,.
    3. 重啟broker.

    如何工作
    最初,web management會顯示默認節點名稱-rabbit@hostname,如下所示:
    在配置過后,將會顯示mylittlerabbit@hostname,如下所示:
    通過這種方式,你可以修改在https://www.rabbitmq.com/configure.html#define-environment-variables中找到的所有環境變量信息.
    TIP
    環境變量是以前輟RABBITMQ_開頭的,但rabbitmq-env.conf中配置變量時,則不需要此前輟.

    使用服務端文件配置,你可以修改內部broker配置. 配置文件名稱為rabbitmq.config,它與rabbitmqenv.conf位于相同位置. 可使用環境變量RABBITMQ_CONFIG_FILE 來修改此位置 . 你可在https://www.rabbitmq.com/configure.html#configuration-file找到完整的參數列表.
    更多
    在本食譜中,我們只是介紹了RabbitMQ配置.在后面的章節中,我們將修改某些參數來優化性能或配置集群.
    開發Python程序監控RabbitMQ
    在本例中,我們將使用可從http://localhost:15672/api/訪問的JSON API來創建Python腳本來監控RabbitMQ.
    本例的目的是創建一個自定義的Python腳本,它可以執行一些檢查,并在檢測到錯誤時,發送電子郵件.你可在Chapter03/Recipe07找到源碼.
    準備
    你需要Python 2.7+,并啟用管理插件.

    如何做
    按照下面的步驟,使用JSON API創建Python腳本來監控RabbitMQ:
    1. 導入下面的包:
    import sys
    import urllib2,base64
    import json
    import logging
    2. 從JSON API中獲取所需的RabbitMQ信息:
    urllib2.Request("http://"+rabbitmqhost+":15672/api/nodes")
    urllib2.Request("http://"+rabbitmqhost+":15672/api/connections")
    urllib2.Request("http://"+rabbitmqhost+":15672/api/aliveness-test/%2f")
    3.加載并執行JSON結果:
    json.load(urllib2.urlopen(request));
    4. 如果出現錯誤(或者是達到報警條件),則發送e-mail:
    if error_message != "":
    sendAlarmStatus(error_message);


    如何工作
    /api/nodes JSON調用中,我們檢查了運行狀態和對每個RabbitMQ節點的內存警報. 在/api/connections中,我們監控了已經連接的clients.
    /api/aliveness-test/ JSON 調用 創建了一個test隊列,并打算在默認虛擬主機%2f (當在URL中指定/時,必須將其編碼)上發送和接收消息. 如果結果是{"status": "ok"},則表明沒有錯誤.
    腳本需要使用下面的代碼來認證:
    base64.encodestring('%s:%s' % ('guest', 'guest'))
    request.add_header("Authorization", "Basic %s" % base64string);

    TIP
    你必須使用帶有monitor權限的RabbitMQ用戶.

    如果檢測失敗了,腳本會帶有問題信息的郵件.要嘗試這個例子,你需要修改使用自己的帳戶來修改函數sendAlarmStatus(message)

    TIP
    此腳本可通過Linux crontab來調度或在Windows中使用Scheduler Task來調度.

    在我們的例子中, 我們會將日志寫入到/var/tmp/myMonitorRMQ.log文件中.

    更多
    在這個例子中,我們只是選擇了部分APIs. 當然,這里還有更多的API,使用這些API,你可根據你自己的需求來創建檢查RabbitMQ健康的監控工具.
    你也可以使用rabbitmqadmin來監視broker: 文件可以從broker自身的地址:http://localhost:15672/cli/下載. 這個Python腳本,因此可從shell腳本中調用,例如:
    ./rabbitmqadmin –f raw_json list nodes
    此命令按JSON格式將節點信息輸出到標準輸出中,這已經在本食譜的步驟2看過了.

    也可參考
    你可在http://hg.rabbitmq.com/rabbitmqmanagement/raw-file/rabbitmq_v3_0_4/priv/www/api/index.html找到全部的API文檔.

    自己開發web程序來監控RabbitMQ
    在本食譜中,我們將展示如何來創建一個自定義的web程序來監控RabbitMQ日志.為了檢查日志,你需要綁定一個隊列到amq.rabbitmq.log 交換器中,正如在Chapter 12Managing RabbitMQ Error Conditions中看到的一樣.你可在Chapter03/Recipe08中找到本食譜的代碼.

    準備
    為了理解這個例子,我們需要下面的東西:
    1. Spring
    2. Apache Tomcat
    3. Apache Maven
    4. WebSocket
    5. Query/HTML5/Twitter Bootstrap
    我們推薦Spring工具箱(Spring tool suite,譯者注:確實好用,強烈推薦). 同時,你也需要因特網來訪問Maven, bootstrap,以及jQuery.

    如何做
    執行下面的步驟來創建一個自定義的web程序來監控RabbitMQ日志:
    1.從工具中選擇一個可用的模板來創建一個基本的MVC (Model View Controller) Spring project,如下所示:

    2. 修改Maven文件(POM.xml),增加下面的依賴:
    tomcat-coyote // needed for websockets
    tomcat-servlet-api// needed for websockets
    tomcat-catalina// needed for websockets
    spring-rabbit// needed for rabbitmq

    3. 使用org.springframework.amqp包中的類,創建一個新bean RabbitMQInstance來創建RabbitMQ界面.
    你可以在root-context.xml中找到bean的生命周期.在這個例子中,RabbitMQ 必須與Tomcat運行在同一臺機器上,但你也可以根據實際情況修改連接參數.
    4. 創建一個名為RmqWebSocket的新類,此類將繼承WebSocketServlet (Tomcat的WebSocket 類),并添加@WebServlet ("/websocket")注解.
    5. RmqWebSocket類創建一個私有的amqp消費者:
    LogListener implements MessageListener.
    6. 消費者使用SimpleMessageListenerContainer來啟動,如下所示:
    container.setConnectionFactory(rmq.getConnectionFactory());
    ...
    container.start();
    7. 使用下面的代碼來將瀏覽器WebSocket綁定到server:
    ws = new WebSocket('ws://' host':8080/rmq/websocket');
    8. 使用下面的代碼來訂閱:
    ws.onmessage = function(message){..}
    9. 每當瀏覽器收到消息,它就會使用jQuery來更新HTML table:
    $("#tablebody").prepend("<tr><td>"+message.data+"</td></tr>");
    10. 現在,一切都準備好了.你可以build Maven,并將其部署到Tomcat容器.

    如何工作
    RabbitMQInstance bean中,我們創建一個隊列,并使用路由鍵#將其綁定到topic交換器-amq.rabbitmq.log中.在root-context.xml文件中,我們定義了bean ID,以及init/deinit方法,這樣在web程序啟動時就可以連接 AMQP clients,并在其關閉時,斷開連接.
    RabbitMQ連接和隊列已經準備好了.
    RmqWebSocket是一個Tomcat websocket,在這里,我們使用SimpleMessageListenerContainer(使用rabbitMQInstance參數(連接和隊列)實現) 來啟動了一個消費者.
    消費者準備好了

    在RmqWebSocket的StreamInbound方法中, 對于每個連接,我們都注冊了websocket連接(通過瀏覽器來初始化一個新的ClientMessage類),且Collection<ClientMessage> clients 代碼行中包含了活動clients.
    websocket后端準備好了.
    在步驟7中,瀏覽器連上了服務端,現在所有都準備好了,如下圖所示:

    當日志消息發送到topic交換器amq.rabbitmq.log時,LogListener類將引發一個事件:
    public void onMessage(Message message) {..}
    消息將以for循環的方式廣播給clients集合:
    for(ClientMessage item: clients){
    CharBuffer buffer = CharBuffer.wrap(new String(message.getBody()) );
    item.myoutbound.writeTextMessage(buffer);
    現在,瀏覽器收到的消息將使用jQuery來更新HTML table.

    Tomcat默認使用8080端口,且應用程序URL為/rmq, 完整的URL為http://yourtomcatmachine:8080/rmq/, 正如下面展示的,你應該在web瀏覽器中指向這個地址:
    我們是在HTML5和Bootstrap使用的,你也可以在移動設備上使用.

    TIP
    客戶端連接或斷開連接足可以引發標準日志事件.

    更多
    在這個例子中,為了真實地展示如何整合RabbitMQ與當前web技術,我們已經介紹了多種不同技術.
    雖然這里我們用的是RabbitMQ日志消息,但你可以輕易將同樣的架構應用到你的分布式/web應用程序中.
    TIP
    要直接運行這個例子,你可在(Chapter03/Recipe08)獲取源碼,并使用Maven來準備所需的.然后將其部署到Tomcat.
    也可參考
    Spring: http://spring.io/
    Apache Tomcat: http://tomcat.apache.org/
    Apache Maven: http://maven.apache.org/
    WebSocket: http://www.websocket.org/
    http://tomcat.apache.org/tomcat-7.0-doc/web-socket-howto.html
    jQuery: http://jquery.com/
    HTML5: http://en.wikipedia.org/wiki/HTML5
    Twitter Bootstrap: http://getbootstrap.com/

    posted on 2016-06-05 20:10 胡小軍 閱讀(1606) 評論(0)  編輯  收藏 所屬分類: RabbitMQ
    主站蜘蛛池模板: 亚洲日韩在线观看免费视频| 毛片免费视频在线观看| 亚洲国产精品不卡毛片a在线| 亚洲av无码不卡久久| 69堂人成无码免费视频果冻传媒 | 亚洲视频在线免费观看| 国产成人综合亚洲AV第一页| 一级毛片免费在线播放| 亚洲人成伊人成综合网久久久| 久久精品免费大片国产大片| 亚洲av中文无码乱人伦在线r▽| a在线观看免费网址大全| 亚洲AV永久无码精品| 精品一区二区三区免费毛片爱 | 亚洲日本在线观看视频| 2022国内精品免费福利视频| 亚洲精品国产成人片| 91免费国产精品| 亚洲中文字幕无码中文| 四虎永久免费影院| 国产精品黄页免费高清在线观看| 亚洲色婷婷一区二区三区| 91精品手机国产免费| 国产亚洲精品影视在线| 免费在线观看亚洲| h视频在线免费观看| 亚洲免费视频网站| 成年女性特黄午夜视频免费看| 国产亚洲一卡2卡3卡4卡新区| 亚洲日本中文字幕一区二区三区| 精品免费tv久久久久久久| 亚洲一级黄色大片| 亚洲AV无码乱码精品国产| 99国产精品视频免费观看| 在线综合亚洲欧洲综合网站| 亚洲国产成人影院播放| 免费人成毛片动漫在线播放| 亚洲色少妇熟女11p| 亚洲色大成网站WWW久久九九| 在线天堂免费观看.WWW| 91av免费在线视频|