Rabbitmq 基础

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rabbitmq 基础相关的知识,希望对你有一定的参考价值。

一、概述
什么是MQ?
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息

1、队列、生产者、消费者
队列是RabbitMQ的内部对象,用于存储消息。生产者(下图中的P)生产消息并投递到队列中,消费者(下图中的C)可以从队列中获取消息并消费。
技术分享图片
多个消费者可以订阅同一个队列,这时队列中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。

2、Exchange、Binding
生产者将消息投递到队列中,实际上在RabbitMQ中这种事情永远都不会发生。生产者将消息发送到Exchange(交换器,下图中的X),再通过Binding将Exchange与Queue关联起来
技术分享图片

3、Exchange Type、Bingding key、routing key
在绑定(Binding)Exchange与Queue的同时,一般会指定一个binding key。在绑定多个Queue到同一个Exchange的时候,这些Binding 允许使用相同的 binding key。
消费者 将消息发送给Exchange时,一般会指定一个routing key;当binding key与routing key相匹配时,消息将会被路由到对应的Queue中。

RabbitMQ常用的Exchange Type有三种:fanout、direct、topic。
(1) fanout:  不处理Routing Key。只需要简单的将队列绑定到Exchange上,然后本类型 把所有发送到该Exchange的消息投递到所有与它绑定的队列中。也就是一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。 很像子网广播,每台子网内的主机(每个绑定本exchange的queue)都获得了一份复制的消息。Fanout交换机转发消息是最快的。 
    ![](http://i2.51cto.com/images/blog/201805/24/d7cca317d6dc43d3dcf3e5674ffef06e.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

direct: 处理Routing key。把消息投递到那些binding key与routing key完全匹配的队列中。 需要将队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。 例如一个队列绑定到该交换机上要求路由键 “dog”,则只有被标记为“dog”的消息才被转发,不会转发dog.puppy,也不会转发dog.guard,只会转发dog。

技术分享图片

topic:将路由键和某模式进行匹配。将消息路由到binding key与routing key模式匹配的队列中。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。 例如“audit.#”能够匹配到“audit.irs.corporate”,但是“audit.*” 只会匹配到“audit.irs”。 

技术分享图片

二、安装
Yum配置如下:
rpm --import https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
[[email protected] yum.repos.d]# cat erlang.repo
[rabbitmq-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
repo_gpgcheck=0
enabled=1

启动RabbitMQ服务命令
/sbin/service rabbitmq-server start

查看RabbitMQ服务状态命令
/sbin/service rabbitmq-server status

三、配置网页访问RabbitMQ

1、查看RabbitMQ中用户命令
rabbitmqctl list_users
2、创建用户命令
rabbitmqctl add_user hjp hjp
3、赋予用户权限命令
rabbitmqctl set_permissions -p "/" hjp ‘.‘ ‘.‘ ‘.*‘
4、赋予用户角色命令
rabbitmqctl set_user_tags hjp administrator
5、开启rabbitmq管理控制台命令
rabbitmq-plugins enable rabbitmq_management
6、访问http://192.168.196.136:15672/

删除用户(删除guest用户)
[[email protected] rabbitmq]# rabbitmqctl delete_user guest
Deleting user "guest" #rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问。

修改用户的密码
rabbitmqctl change_password Username Newpassword

[[email protected] ~]# rabbitmqctl change_password admin 0GM1aol4z8GeSZY99
Changing password for user "admin"

日志跟踪插件
rabbitmq-plugins enable rabbitmq_tracing #rabbitmq启用trace插件
rabbitmqctl trace_on #打开trace的开关
rabbitmqctl trace_on -p test #打开trace的开关(test为需要日志追踪的vhost)
rabbitmqctl trace_off #关闭trace的开关

防火墙开放端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent 添加5672端口
firewall-cmd --zone=public --add-port=15672/tcp --permanent 添加15672端口
firewall-cmd --reload 重新载入

chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
[[email protected] ~]# ls /var/lib/rabbitmq/
config mnesia schema
[[email protected] ~]#
说明:
Rabbitmq的集群是依附于erlang的集群来工作的,所以必须先构建起erlang的集群镜像。Erlang的集群中各节点是经由过程一个magic cookie来实现的,这个cookie存放在 $home/.erlang.cookie 中,我的是用rpm安装的,所以.erlang.cookie就放在/var/lib/rabbitmq中
erlang.cookie是erlang实现分布式的必要文件,erlang分布式的每个节点上要保持相同的.erlang.cookie文件,同时保证文件的权限是400,不然节点之间就无法通信。
打开文件然后需要先把其中的一台服务器的.erlang.cookie中的内容复制到别的机器上,最好是复制内容,因为文件权限不对的话会出现问题,在最后退出保存的时候使用wq!用!来进行强制保存即可.
也可是直接使用scp传过去,记得文件权限和用户属主属组如scp .erlang.cookie [email protected]:/tmp
[[email protected] ~]# cat /var/lib/rabbitmq/.erlang.cookie
XFPDRSDKRKPHENWCULHM[[email protected] ~]#
[[email protected] ~]# ll /var/lib/rabbitmq/.erlang.cookie
-r-------- 1 rabbitmq rabbitmq 20 2018/05/23 00:00:00 /var/lib/rabbitmq/.erlang.cookie
[[email protected] ~]# scp /var/lib/rabbitmq/.erlang.cookie vm2:/var/lib/rabbitmq/.erlang.cookie
The authenticity of host ‘vm2 (192.168.40.206)‘ can‘t be established.
ECDSA key fingerprint is SHA256:CDxAQmj6gUkIxB6XUofbZ853GuPM5LS2QO4a5dD7jRo.
ECDSA key fingerprint is MD5:4e:20:72:a7:46:c6:d7:5d:bb:9d:ce:c3:f3:da:43:f9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘vm2,192.168.40.206‘ (ECDSA) to the list of known hosts.
[email protected]‘s password:
.erlang.cookie 100% 20 28.7KB/s 00:00
[[email protected] ~]#
[[email protected] ~]# firewall-cmd --zone=public --add-port={4369/tcp,25672/tcp} --permanent
success
[[email protected] ~]# firewall-cmd --reload
success
[[email protected] ~]#

[[email protected] ~]# firewall-cmd --zone=public --add-port={4369/tcp,25672/tcp} --permanent
success
[[email protected] ~]# firewall-cmd --reload
success
[[email protected] ~]# rabbitmqctl stop_app
Stopping rabbit application on node [email protected] ...
[[email protected] ~]# rabbitmqctl reset
Resetting node [email protected] ...
[[email protected] ~]# rabbitmqctl join_cluster [email protected]
Clustering node [email protected] with [email protected]
[[email protected] ~]# rabbitmqctl start_app
Starting node [email protected] ...
completed with 3 plugins.
[[email protected] ~]#
[[email protected] ~]# rabbitmqctl cluster_status
Cluster status of node [email protected] ...br/>[{nodes,[{disc,[[email protected],[email protected]]}]},
{running_nodes,[[email protected],[email protected]]},
br/>{cluster_name,<<"[email protected]">>},
{partitions,[]},
br/>{alarms,[{[email protected],[]},{[email protected],[]}]}]
[[email protected] ~]#




以上是关于Rabbitmq 基础的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ基础组件和SpringBoot整合RabbitMQ简单示例

[vscode]--HTML代码片段(基础版,reactvuejquery)

RabbitMQ-从基础到实战— Hello RabbitMQ

[Go] 通过 17 个简短代码片段,切底弄懂 channel 基础

RabbitMQ:消费者ACK机制生产者消息确认

六.RabbitMQ消息队列的基础+实战