環境介紹
OS:CentOS7.4
RabbitMQ:3.7.7
依賴環境:erlang、socat
端口介紹:
4369 ##erlang發現口
5672 ##client端通信口
15672 ##管理界面ui端口
25672 ##server間內部通信
依賴環境安裝
[root@localhost yum.repos.d]# cat a.repo [bbitmq-erlang] name=rabbitmq-erlang baseurl=https://dl.bintray.com/rabbitmq/rpm/erlang/20/el/7 gpgcheck=1 gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc enabled=1
導入gpgcheck
[root@localhost yum.repos.d]# rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
安裝socat
[root@localhost yum.repos.d]# yum -y install socat
下載RabbitMQ安裝包
[root@localhost ~]# wget https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.7.7-1.el7.noarch.rpm [root@localhost ~]# yum -y localinstall rabbitmq-server-3.7.7-1.el7.noarch.rpm
啓用RabbitMQ的web插件
[root@localhost ~]# rabbitmq-plugins enable rabbitmq_management The following plugins have been configured: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch Applying plugin configuration to rabbit@localhost... The following plugins have been enabled: rabbitmq_management rabbitmq_management_agent rabbitmq_web_dispatch started 3 plugins.
[root@localhost ~]# netstat -ntlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 38383/epmd tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1253/dnsmasq tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1015/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1012/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1182/master tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 38454/beam.smp tcp6 0 0 :::111 :::* LISTEN 1/systemd tcp6 0 0 :::4369 :::* LISTEN 38383/epmd tcp6 0 0 :::22 :::* LISTEN 1015/sshd tcp6 0 0 ::1:631 :::* LISTEN 1012/cupsd tcp6 0 0 ::1:25 :::* LISTEN 1182/master tcp6 0 0 :::5672 :::* LISTEN 38454/beam.smp
開機啓動rabbit
[root@localhost ~]# systemctl enable rabbitmq-server
啓動rabbitmq
[root@localhost ~]# systemctl restart rabbitmq-server Job for rabbitmq-server.service failed because the control process exited with error code. See "systemctl status rabbitmq-server.service" and "journalctl -xe" for details.
查看狀態
[root@localhost ~]# systemctl status rabbitmq-server ● rabbitmq-server.service - RabbitMQ broker Loaded: loaded (/usr/lib/systemd/system/rabbitmq-server.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2019-01-15 01:24:21 CST; 1min 19s ago Process: 41443 ExecStop=/usr/sbin/rabbitmqctl shutdown (code=exited, status=69) Main PID: 41607 (beam.smp) Status: "Initialized"
一般這個狀態是因爲文件".erlang.cookie"用戶和用戶組權限的問題
將該文件通過chown授權給rabbitmq
啓動rabbitmq,查看端口
[root@localhost ~]# netstat -antlp | grep 5672 tcp 0 0 0.0.0.0:15672 0.0.0.0:* LISTEN 3641/beam.smp tcp 0 0 0.0.0.0:25672 0.0.0.0:* LISTEN 3641/beam.smp tcp 0 0 127.0.0.1:25672 127.0.0.1:56251 TIME_WAIT - tcp6 0 0 :::5672 :::* LISTEN 3641/beam.smp
瀏覽器訪問測試
用戶名密碼都是guest
rabbit搭建完成!
RabbitMQ使用方法
查看當前的連接
[root@localhost ~]# rabbitmqctl list__connectios
列出多有隊列及隊列的消息數
[root@localhost ~]# rabbitmqctl list__queues
查看當前隊列消息
[root@localhost ~]# rabbitmqctl status Status of node rabbit@localhost ... [{pid,3641}, ...
設置用戶權限爲超級管理員權限
[root@localhost ~]# rabbitmqctl set_user_tags root administartor
創建虛擬機管理消息隊列
[root@localhost ~]# rabbitmqctl add_vhost read Adding vhost "read" ...
刪除虛擬機
[root@localhost ~]# rabbitmqctl delete_vhost read
查看當前虛擬機
[root@localhost ~]# rabbitmqctl list_vhosts Listing vhosts ... / ##默認虛擬機 read
RabbitMQ用戶管理、角色和權限管理
創建用戶
[root@localhost ~]# rabbitmqctl add_user {user}root {password}123456
刪除用戶
[root@localhost ~]# rabbitmqctl add_user {username}
修改用戶密碼
[root@localhost ~]# rabbitmqctl change_password {username} {newpassword}
查看用戶列表
[root@localhost ~]# rabbitmqctl list_users
角色權限分配
[root@localhost ~]# rabbitmqctl set_user_tags {username} {tag}
tag用戶角色分類:none、management、policymaker、manitoring、administrator
tag常用角色:administrator、monitoring、management
權限描述
none:不能訪問management plugin插件
administrator角色權限
擁有 policymaker和monitoring的所有權限,還擁有: 創建和刪除 virtual hosts 查看、創建和刪除users 查看創建和刪除 permissions 關閉其他用戶的 connection
monitoring角色權限:
擁有management 的所有權限,還擁有: 列出所有 virtual hosts,包括他們丌能登錄的 virtual hosts 查看其他用戶的 connections和channels 查看節點級別的數據如clustering和memory使用情冴 查看真正的關於所有 virtual hosts的全局的統計信息
management角色權限:
列出自己可以通過AMQP登入的virtual hosts
policymaker角色權限
擁有management的所有權限,同時擁有查看、創建、刪除自己的vhosts所屬的policies(策略)和parameters(參數)
查看自己的vhosts中的queues,exchange和bindings
查看和關閉自己的channels和connections
查看有關自己的vhosts的全局的統計信息,包含其他用戶在這些vhosts中的活動
權限設置
[root@localhost ~]# rabbitmqctl set_permissions [-p vhostpath] {user} {conf} {write} {read}
[root@localhost ~]# rabbitmqctl set_permissions -p / root '.*' '.*' '.*' #設置用戶對根目錄有配置、讀、寫權限
conf:一個正則表達式match哪些配置資源能夠被該用戶訪問
write:哪些資源能夠被用戶寫
read:哪些資源能夠被用戶讀
查看(指定vhosts)所有用戶的權限信息
[root@localhost ~]# rabbitmqctl list_permissions -p / Listing permissions for vhost "/" ... rootguest
清除用戶的權限信息
[root@localhost ~]# rabbitmqctl clear_permissions -p / root Clearing permissions for user "root" in vhost "/" ...
使用python調用rabbitmq測試
安裝py
[root@localhost ~]# yum -y install python-pip
安裝epel擴展源
[root@localhost ~]# yum -y install epel-release
更新pip
[root@localhost ~]# pip install --upgrade pip
安裝pika模塊
[root@localhost ~]# pip install pika
創建生產者代碼
[root@localhost ~]# cat send.py #!/bin/env python import pika #指定連接的主機參數爲localhost connection=pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) #連接引導 channel=connection.channel() #聲明rabbitmq的隊列BindingKey channel.queue_declare(queue='hello') #指定Exchange匹配模式,指定RoutingKey channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') print("[x] Sent 'Hello World'") #關閉連接 connection.close()
創建消費者代碼
[root@localhost ~]# cat receive.py #!/usr/bin/env python import pika #指定連接的主機參數爲localhost connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) #連接引導 channel = connection.channel() #聲明rabbitmq的隊列BindingKey channel.queue_declare(queue='hello') #指定調用的消息 def callback(ch, method, properties, body): print(" [x] Received %r" % body) channel.basic_consume(callback, queue='hello', no_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()
測試腳本
[root@localhost ~]# python send.py [x] Sent 'Hello World'
查看瀏覽器,消息隊列產生了兩個(腳本執行兩次)且已處理完成