RabbitMQ学习(二)


目录:

(1)Fanout交换机类型介绍

(2)发送消息到Fanout交换机中 

(3)Topic交换机类型介绍

(4) Topic类型消息的接收

(5)集群模式的介绍

(6)搭建普通模式集群

(7)搭建镜像模式的集群


(1)Fanout交换机类型介绍

每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去。fanout 交换器不处理路由键,只是简单的将队列绑定到交换器上,每个发送到交换器的消息都会被转发到与该交换器绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。fanout 类型转发消息是最快的。 

RabbitMQ学习(二)_第1张图片

(2)发送消息到Fanout交换机中 

 在生产者配置类RabbitMQConfig类:中声明交换机:

RabbitMQ学习(二)_第2张图片

 声明3个队列:

RabbitMQ学习(二)_第3张图片

 声明绑定关系:

RabbitMQ学习(二)_第4张图片

在SendMessage中发送消息:

RabbitMQ学习(二)_第5张图片 RabbitMQ学习(二)_第6张图片

 发送消息RabbitMQ学习(二)_第7张图片

 启动主启动类:运行发送消息RabbitMQ学习(二)_第8张图片

出现了队列接收到了消息 

 给队列加false,换成非持久化:feature缺少了D

RabbitMQ学习(二)_第9张图片

 添加其他参数

RabbitMQ学习(二)_第10张图片

 RabbitMQ学习(二)_第11张图片

 在消费者模块进行消费:

RabbitMQ学习(二)_第12张图片

 在ReceiveMesssage类中

RabbitMQ学习(二)_第13张图片RabbitMQ学习(二)_第14张图片RabbitMQ学习(二)_第15张图片

RabbitMQ学习(二)_第16张图片

重新运行发送者发送消息:RabbitMQ学习(二)_第17张图片 

 复制3个端口号运行:8003、8004、8005

RabbitMQ学习(二)_第18张图片

 分别启动8003、8004、8005他们启动时对应上面的receiveFanoutMessage1、receiveFanoutMessage2、receiveFanoutMessage3,进行注释启动RabbitMQ学习(二)_第19张图片

 重新启动7003:发送消息

8003接收到一条消息

RabbitMQ学习(二)_第20张图片

 8004、8005也接收一条消息:

RabbitMQ学习(二)_第21张图片

RabbitMQ学习(二)_第22张图片

 如果停掉8005消息只能被8003、8004接收,它重新再启动也接收不到

(3)Topic交换机类型介绍

topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“*”。#匹配0个或多个单词,“*”匹配不多不少一个单词。

RabbitMQ学习(二)_第23张图片

RabbitMQ学习(二)_第24张图片

(4) Topic类型消息的接收

首先在生产者模块中RabbitMQConfig类中:声明交换机、队列、绑定关系

RabbitMQ学习(二)_第25张图片

RabbitMQ学习(二)_第26张图片

 RabbitMQ学习(二)_第27张图片

 在SendMessage类中发送消息:

RabbitMQ学习(二)_第28张图片

RabbitMQ学习(二)_第29张图片

 在启动类RabbitMQ7003Application中调用方法发送消息:

RabbitMQ学习(二)_第30张图片

 运行启动类:发现对类中消息的数目total1,1,3根接收的规则是一样的RabbitMQ学习(二)_第31张图片

 RabbitMQ学习(二)_第32张图片

 在接收者Modul中的ReceiveMessage类中接收消息:

RabbitMQ学习(二)_第33张图片

RabbitMQ学习(二)_第34张图片

 RabbitMQ学习(二)_第35张图片

(5)集群模式的介绍

 普通模式(默认):对于Queue来说,消息实体只存在于其中的一个节点,A/B两个节点仅有相同的元数据,即队列结构.(交换机的所有元数据在所有节点上是一致的,而队列的完整信息只有在创建它的节点上,各个节点仅有相同的元数据,即队列结构)当消息进入A节点的Queue中后,consumer从B节点拉取数据时,RabbitMQ会临时在A.B间进行消息传输,把A中的消息实体取出并经过B发送给consumer.所以consumer应尽量连接每个节点,从中取消息.即对于同一个逻辑队列,要在多个节点建立物理Queue,否则无论consumer连A或B,出口总在A,会产生瓶颈.该模式存在一个问题就是当A节点故障后,B节点无法取到A节点中还未消费的消息实体.如果做个消息持久化,那么等A几点恢复,然后才可被消费;如果没有做持久化,然后就...该模式非常适合非持久化队列,只有该队列是非持久化的,客户端才能重新连接到集群中的其他节点,并且重新创建队列,如果该队列是持久化的,那么唯一的办法就是将故障节点恢复起来.

RabbitMQ学习(二)_第36张图片

 RabbitMQ学习(二)_第37张图片

 镜像模式(高可用模式):把需要的队列做成镜像模式,存在于多个节点,数据Rabbitmq的HA方案.该模式解决了上述问题,其实质和普通模式的不同之处在于,消息实体会主动在镜像节点间同步,而不会在consumer取数据时临时拉取.该模式带来的副作用也很明显,除了降低系统性能意外,如果镜像队列过多,加之有大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉,所以在对可靠性要求较高的场合中适用.

RabbitMQ学习(二)_第38张图片

 (6)搭建普通模式集群

  1. 安装2两台Linux操作系统并修改hostname 分别为A和B

             执行vi /etc/hosts 文件内容如下

127.0.0.1 A  localhost localhost.localdomain localhost4 localhost4.localdomain4

::1       A  localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.222.129 A

192.168.222.130 B

 注意:2Linux服务器需要完成同样的操作

        关闭防火墙确保2台机器相互ping 同可以执行ping A ping B命令进行测试

在2台Linux服务中分别安装RabbitMQ

安装RabbitMQ之前必须要先安装所需要的依赖包可以使用下面的一次性安装命令

yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto -y

安装Erlang

1、 将Erlang源代码包otp_src_19.3.tar.gz上传到Linux的/home目录下

  2、解压erlang 源码包

tar -zxvf otp_src_19.3.tar.gz

3、手动创建erlang 的安装目录

mkdir /usr/local/erlang

4、进入erlang的解压目录

cd otp_src_19.3

 5、配置erlang的安装信息

 ./configure --prefix=/usr/local/erlang --without-javac

 6、编译并安装

make && make install

 7、配置环境变量

vim /etc/profile

 8、将这些配置填写到profile文件的最后

ERL_HOME=/usr/local/erlang

PATH=$ERL_HOME/bin:$PATH

export ERL_HOME PATH

9、启动环境变量配置文件

source /etc/profile

安装RabbitMQ

1、将RabbitMQ安装包rabbitmq-server-3.7.2-1.el7.noarch.rpm上传到/home目录

2、安装RabbitMQ

rpm -ivh --nodeps rabbitmq-server-3.7.2-1.el7.noarch.rpm

3、安装管控台插件

rabbitmq-plugins enable rabbitmq_management

         注意:需要分别在2Linux服务器中安装RabbitMQ

 配置Cookie文件

Erlang Cookie是保证不同节点可以互相通信的秘钥,要保证集群中的不同节点互相通信必须共享相同的Erlang Cookie,具体存放在/var/lib/rabbitmq/.erlang.cookie

例如

[root@A ~]# cat /var/lib/rabbitmq/.erlang.cookie

MZFQSBXIIJJMUZRTJFWQ

[root@A ~]# ~

         必须要保证2台Linux的Cookie 文件内容完全相同,可以选择使用vim进行编辑

也可以使用scp命令完成文件跨机器拷贝例如

[root@A ~]# scp /var/lib/rabbitmq/.erlang.cookie 192.168.222.130:/var/lib/rabbitmq

注意:由于这个文件的权限是只读因此无论是使用vim还是scp来实现Cookie文件的同步都会失败,因此必须要修改这个文件的权限,

例如 chmod 777 /var/lib/rabbitmq/.erlang.cookie

Cookie文件同步完成以后再修改权限回只读

例如 chmod 400 /var/lib/rabbitmq/.erlang.cookie

 

组建集群

分别启动2台Linux机器中的RabbitMQ服务器

rabbitmqctl stop

rabbitmq-server -detached

注意:rabbitmq-server –detached 表示在后台运行

启动之后进行开放端口:

RabbitMQ学习(二)_第39张图片 连接上130、137的了RabbitMQ学习(二)_第40张图片

 RabbitMQ学习(二)_第41张图片

 

 

将某个RabbitMQ加入到某个服务器节点

rabbitmqctl stop_app

rabbitmqctl join_cluster rabbit@A

rabbitmqctl start_app

注意:

  rabbitmqctl join_cluster rabbit@A 命令中的A为某个机器的hostname,在hostnameB的机器中执行这些命令

停下某一个节点,加入另外一个上,在加入时出现不能连接4369、25672,需要开启另外一台的端口 

RabbitMQ学习(二)_第42张图片

开启另外一台节点的的端口 

 RabbitMQ学习(二)_第43张图片

 这台节点也开启下端口,重新加入:就加入成功了,可以启动了

RabbitMQ学习(二)_第44张图片

 

 

查看集群状态确认节点成功添加

[root@B ~]# rabbitmqctl cluster_status

Cluster status of node rabbit@B ...

[{nodes,[{disc,[rabbit@A,rabbit@B]}]},

 {running_nodes,[rabbit@A,rabbit@B]},

 {cluster_name,<<"rabbit@A">>},

 {partitions,[]},

 {alarms,[{rabbit@A,[]},{rabbit@B,[]}]}]

[root@B ~]#

注意:

         当查看节点状态时发现2台机器的节点同时显示机表示集群搭建完成

查看节点状态: 

RabbitMQ学习(二)_第45张图片 

 现在就是一个节点集群了

其他命令

         如果要将某个节点从集群中移除,使其变回独立节点,可以使用以下命令:

rabbitmqctl stop_app

rabbitmqctl reset

rabbitmqctl start_app

 

使用SpringBoot连接RabbitMQ集群

 配置RabbitMQ的账号

分别为2台Linux中的RabbitMQ添加账号并进行授权

rabbitmqctl add_user root root

rabbitmqctl set_user_tags root administrator

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

RabbitMQ学习(二)_第46张图片 

在两台里面添加完角色以后就可以使用root登录了:

RabbitMQ学习(二)_第47张图片 

 RabbitMQ学习(二)_第48张图片

 

 SpringBoot配置

修改SpringBoot的application.properties文件进行集群的继承

#spring.rabbitmq.port=5672

#配置RabbitMQ的集群访问地址
spring.rabbitmq.addresses=192.168.222.129:5672,192.168.222.130:5672
#配置RabbitMQ服务器的访问账号
spring.rabbitmq.username=root
#配置RabbitMQ服务器的访问密码
spring.rabbitmq.password=root

 修改创建者的端口:发送的时候为137的节点

RabbitMQ学习(二)_第49张图片

 修改消费者的端口:接收的时候从130接收:

RabbitMQ学习(二)_第50张图片

启动消息的发送者启动类:出现了节点

RabbitMQ学习(二)_第51张图片 

 启动消费者:

RabbitMQ学习(二)_第52张图片

重新启动消息的发送者主启动类,这个时候停掉30端口节点:

 

这个时候B节点就没了:

RabbitMQ学习(二)_第53张图片 

这个时候就不能去130端口消费了

RabbitMQ学习(二)_第54张图片 

 重新启动B节点:

RabbitMQ学习(二)_第55张图片

这个时候就可以重新消费了:RabbitMQ学习(二)_第56张图片 

 (7)搭建镜像模式的集群

需要配置我们的策略信息 

RabbitMQ学习(二)_第57张图片

添加所有节点为高可用的模式 

RabbitMQ学习(二)_第58张图片 

RabbitMQ学习(二)_第59张图片 

 RabbitMQ学习(二)_第60张图片

RabbitMQ学习(二)_第61张图片 

+1就是镜像同步:把交换机和消息队列同步到对应的节点当中RabbitMQ学习(二)_第62张图片

 重新发送消息:就会镜像同步到节点当中

 RabbitMQ学习(二)_第63张图片

启动消费者消费:

RabbitMQ学习(二)_第64张图片 

 

你可能感兴趣的:(#,rabbitmq,学习,分布式)