天天看點

RabbitMQ簡介以及安裝

1.簡介

  rabbitMQ是一種基于AMQP協定的消息中間件,用Erlang語言開發。AMQP(Advanced message queuing protocol)是一個提供統一消息服務的應用層标準協定,基于此協定的用戶端與消息中間件可傳遞消息,并不受用戶端、中間件等不同産品,不同開發語言等條件的限制。

  rabbitMQ最初起源于金融系統,用在分布式系統中存儲轉發消息,在易用性、擴充性、高可用等方面表現不俗,具體特點包括:

1.可靠性:使用一些機制保證可靠性,如持久化、傳輸确認、釋出确認。

2.靈活的路由:在消息進入隊列之前,通過Exchange交換機來路由消息。對于典型的路由功能,RabbitMQ已經提供了一些内置的Exchange來實作。針對更複雜的路由功能,可以将多個Exchange綁定在一起或開發自己的Exchange。

3.消息叢集:多個RabbitMQ組成一個叢集,形成一個邏輯的broker。

4.高可用:隊列可以在叢集中的機器上進行鏡像,使得在部分節點出問題的情況下隊列下仍然可用。

5.多種協定:支援多種消息隊列協定,比如STOMP、MQTT等。

6.多語言用戶端:支援幾乎所有常用語言,比如java、rubu、.NET等。

7.管理界面:提供了一個易用的使用者界面,使得使用者可以監控和管理消息的broker

8.跟蹤機制:如果消息異常,rabbitMQ提供了消息跟蹤機制,使用者可以找出發生了什麼。

2.RabbitMQ安裝

erlang官網:https://www.erlang.com/ 

rabbitmq官網:https://www.rabbitmq.com/

  采用windows環境的docker安裝。也可以用linux環境的docker安裝。如果是手動安裝的話需要安裝erlang環境和rabbitmq。

1.檢視docker版本

C:\Users\liqiang>docker -v
Docker version 18.01.0-ce, build 03596f51b1      

2.docker安裝rabbitmq

docker pull hub.c.163.com/library/rabbitmq:management      

3.運作鏡像

(1)預設guest 使用者,密碼也是 guest

docker run -d --hostname my-rabbit --name rabbit -p 15672:15672  hub.c.163.com/library/rabbitmq:management      

(2)設定使用者名和密碼 zs/111222

docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=zs -e RABBITMQ_DEFAULT_PASS=111222 -p 15672:15672 hub.c.163.com/library/rabbitmq:management      

補充:一般也需要暴露5672端口,5672是用戶端連接配接操作的端口,15672是management暴露的端口

docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672  hub.c.163.com/library/rabbitmq:management      

4.通路登入:

RabbitMQ簡介以及安裝

  上management控制台可以看到CPU相關資訊。後期主要關注的tab是Exchanges交換機和Queues隊列。Admin使用者管理使用者,可以添加和删除使用者以及對使用者賦權。

 由于我是windows虛拟的docker機器,所有虛拟機位址,可以通過如下指令檢視:

C:\Users\liqiang>docker-machine ip default
192.168.99.100      

3.rabbitmq簡單使用

下面的指令都是基于rabbit指令執行,需要先進入docker容器:

(1)docker ps -a  檢視容器ID為:d65feaa67533

(2)進入容器

$ docker exec -it d6 /bin/bash      

1.rabbitmq插件管理-management插件實際是15672端口看到的界面

rabbitmq-plugins用于管理插件,用法如下:

root@my-rabbit:/# rabbitmq-plugins
Error: could not recognise command
Usage:
rabbitmq-plugins [-n <node>] <command> [<command options>]

Commands:
    list [-v] [-m] [-E] [-e] [<pattern>]
    enable [--offline] [--online] <plugin> ...
    disable [--offline] [--online] <plugin> ...
    set [--offline] [--online] <plugin> ...      

(1) 檢視插件

root@my-rabbit:/# rabbitmq-plugins list | grep management
[  ] rabbitmq_federation_management    3.6.11
[E*] rabbitmq_management               3.6.11
[e*] rabbitmq_management_agent         3.6.11
[  ] rabbitmq_management_visualiser    3.6.11
[  ] rabbitmq_shovel_management        3.6.11      

(2)禁用插件rabbitmq_management(這個插件實際負責web界面展示)

root@my-rabbit:/# rabbitmq-plugins disable rabbitmq_management
The following plugins have been disabled:
  amqp_client
  cowlib
  cowboy
  rabbitmq_web_dispatch
  rabbitmq_management_agent
  rabbitmq_management

Applying plugin configuration to rabbit@my-rabbit... stopped 6 plugins.      

  禁用之後通路15672端口會通路不到。

(3)啟用插件rabbitmq_management

rabbitmq-plugins enable rabbitmq_management      

  啟用之後又可以通路15672端口。

2.使用者管理

1.添加使用者

root@my-rabbit:/# rabbitmqctl add_user root 123456
Creating user "root"      

2.修改密碼

root@my-rabbit:/# rabbitmqctl change_password root 111222
Changing password for user "root"      

3.修改角色:

文法如下:

rabbitmqctl set_user_tags {username} {tag}      

例如:

root@my-rabbit:/# rabbitmqctl set_user_tags root administrator monitoring
Setting tags for user "root" to [administrator,monitoring]      

rabbitmq的角色包括:none、management、policymaker、monitoring、administrator

(1)none: 不能通路 management plugin

(2)management:

使用者可以通過AMQP做的任何事外加:

  列出自己可以通過AMQP登入的virtual hosts  

  檢視自己的virtual hosts中的queues, exchanges 和 bindings

  檢視和關閉自己的channels 和 connections

  檢視有關自己的virtual hosts的“全局”的統計資訊,包含其他使用者在這些virtual hosts中的活動。

(3)policymaker 

management可以做的任何事外加:

  檢視、建立和删除自己的virtual hosts所屬的policies和parameters

(4)monitoring  

  列出所有virtual hosts,包括他們不能登入的virtual hosts

  檢視其他使用者的connections和channels

  檢視節點級别的資料如clustering和memory使用情況

  檢視真正的關于所有virtual hosts的全局的統計資訊

(5)administrator   

policymaker和monitoring可以做的任何事外加:

  建立和删除virtual hosts

  檢視、建立和删除users

  檢視建立和删除permissions

  關閉其他使用者的connections

4.删除使用者

root@my-rabbit:/# rabbitmqctl delete_user root
Deleting user "root"      

3.rabbitMQ權限管理

  使用者權限指的是使用者對exchange,queue的操作權限,包括配置權限,讀寫權限。配置權限會影響到exchange,queue的聲明和删除。讀寫權限影響到從queue裡取消息,向exchange發送消息以及queue和exchange的綁定(bind)操作。

1.授權指令

rabbitmqctl  set_permissions  [-p  VHostPath] {User}  {ConfP}  {WriteP}  {ReadP}      

-p VHostPath:用于指定使用者一個資源的命名空間,例如/表示根路徑命名空間。可以了解為檔案系統的路徑。

user:需要賦權的使用者

confP:一個正規表達式match哪些配置資源能被該使用者配置

writeP:一個正規表達式match哪些配置資源能被該使用者寫

readP:一個正規表達式match哪些配置資源能被該使用者讀

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

2.檢視使用者權限:

rabbitmqctl  list_permissions  [vhostpath]      

(1)檢視根路徑下所有使用者權限

rabbitmqctl  list_permissions      

(2)檢視vhost為abc的所有使用者權限

rabbitmqctl  list_permissions -p abc      

3.檢視使用者的權限

rabbitmqctl  list_user_permissions zs      

4. vhost管理

vhost本質上是一個mini版的RabbitMQ伺服器,擁有自己的隊列、綁定、交換器和權限控制;

vhost通過在各個執行個體間提供邏輯上分離,允許你為不同應用程式安全保密地運作資料;

vhost是AMQP概念的基礎,必須在連接配接時進行指定,RabbitMQ包含了預設vhost:“/”;

當在RabbitMQ中建立一個使用者時,使用者通常會被指派給至少一個vhost,并且隻能通路被指派vhost内的隊列、交換器和綁定,vhost之間是絕對隔離的。

root@my-rabbit:/# rabbitmqctl list_vhosts  #檢視vhost
Listing vhosts
/
root@my-rabbit:/# rabbitmqctl add_vhost abc  #添加vhost
Creating vhost "abc"
root@my-rabbit:/# rabbitmqctl list_vhosts
Listing vhosts
abc
/
root@my-rabbit:/# rabbitmqctl delete_vhost abc  #删除vhost
Deleting vhost "abc"      

 補充:今天我在windows的docker環境下docker info的時候報錯

error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.35/info: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuration on Windows, the docker client must be run elevated to connect. This error may also indicate that the docker daemon is not running.      

解決辦法:

(1)在git bash中執行:

$ docker-machine env default
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\liqiang\.docker\machine\machines\default"
export DOCKER_MACHINE_NAME="default"
export COMPOSE_CONVERT_WINDOWS_PATHS="true"
# Run this command to configure your shell:
# eval $("E:\docker\Docker Toolbox\docker-machine.exe" env default)      

之後執行上面的指令即可:

export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="C:\Users\liqiang\.docker\machine\machines\default"
export DOCKER_MACHINE_NAME="default"
export COMPOSE_CONVERT_WINDOWS_PATHS="true"      

(2)如果cmd視窗報錯,執行:

SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.100:2376
SET DOCKER_CERT_PATH=C:\Users\liqiang\.docker\machine\machines\default
SET DOCKER_MACHINE_NAME=default
SET COMPOSE_CONVERT_WINDOWS_PATHS=true      

【當你用心寫完每一篇部落格之後,你會發現它比你用代碼實作功能更有成就感!】