RabbitMQ自学笔记
MQ(message queue)
AMQP协议
AMQP ladvanced message queuing protool)‘在2003年时被提出,最早用于解决金融领不同平台之间的消
息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protoco1(链接协
议),这是其和UNS的本质差别,AMOP不从API层进行限定,而是直接定义网络交换的数据格式。这使
得实现了AMOP的provider天然性就是跨平台的。以下是ANOP协议模型:
rabbitMq安装:(安装版本为3.8.14.1,系统为centOS7)
进入官网下载rabbitmq-server-3.8.14-1.el7.noarch.rpm和erlang-23.2.1-1.el7.x86_64.rpm官网地址:https://packagecloud.io/rabbitmq利用ftp工具将文件放入linux系统,socat安装:yum install -y updateyum install -y socat启动rabbitMq:systemctl start rabbitmq-server或者rabbitmq-server -detached //启动rabbitmq,-detached代表后台守护进程方式启动查看rabbitMq状态:rabbitmqctl status查看rabbitmq是否启动:systemctl status rabbitmq-server停止rabbitMq:rabbitmqctl stop列出角色:rabbitmqctl list_users配置 rabbitmq 监控地址: rabbitmq-plugins enable rabbitmq_management关闭防火墙:systemctl stop firewalld.service添加用户:rabbitmqctl add_user admin admin # rabbitmqctl set_permissions -p / admin ".*" ".*" ".*" //添加权限# rabbitmqctl set_user_tags admin administrator //修改用户角色rabbitmqctl help:查看更多命令
本地访问:虚拟机地址:15672
项目实例:
1.创建项目,引入依赖
<!-- 引入rabbitMq相关依赖 --><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.7.2</version></dependency>
第一种模型(直连):
p:生产者,也就是要发送消息的的程序c:消费者,消息的接受者,会一直等待消息的到来queue:消息队列,类似于一个邮箱,可以缓存消息。生产者网其中投放消息,消费者从中取出消息。
第二种模型(work queue):
当消息处理比较耗时时,可能生产消息的速度远远大于消费消息的速度,长此以往,
就会造成消息堆积,这种情况下,就可以使用工作队列。让多个消费者绑定到一个队列,共同消费队列中的消息。获取消息方式类似于轮询。
第三种模型(fanout):
fanout:扇出,也称为广播在广播模式下,消息发送流程是这样的:· 可以有多个消费者· 每个消费者有自己的队列· 每个队列都要绑定到交换机· 生产者发送的消息只能发送到交换机,交换机来决定发送到哪个队列,生产者无法决定· 交换机把消息发送给绑定过的队列· 队列的消费者都能拿到消息,实现一条消息被多个消费者消费
第四种模型(Routing):
Routing之订阅模型-Direct(直连)在Fanout模式中,一条消息,会被所有订阅的队列都消费。但是,在某些场景下,我们希望不同的消息被不同的队列消费。这时就要用到Direct类型的Exchange。
在Direct模型下:·队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)·消息的发送方在向Exchange发送消息时,也必须指定消息的RoutingKey 。·Exchange不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key完全一致,才会接收到消息流程:Puttina it all toaether
routing之订阅模型-Topic
Topic类型的Exchange与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。
只不过Topic类型Exchange可以让队列在绑定Routing key的时候使用通配符! 这种模型
Routingkey一般都是由一个或多个单词组成,多个单词之间以""分割,例如: item.insert
SpringBoot整合rabbitMq使用:
1.创建项目
创建项目,在导包的时候搜索 spring fot rabbitMq,导入amqp依赖包
2.项目配置(yml文件):
spring:application:name: rabbitmq_springBootrabbitmq:host: // 虚拟机主机的ipport: 5672 //端口默认5672virtual-host: /ems //自己创建的虚拟username: admin //用户名和密码password: admin
第一种模型:hello模型在整合后的使用:
provider:生产者代码public void testHello(){rabbitTemplate.convertAndSend("hello","hello world");}customer:消费者代码@Component@RabbitListener(queuesToDeclare = @Queue("hello")) // 默认名称hello,durable="true",autodelete="false"public class Customer {@RabbitHandlerpublic void receive1(String message){System.out.println("message:"+message);}}
第二种模型:workQueue使用
生产者代码:// work queue@Testpublic void testWork(){for (int i = 0; i < 10; i++) {rabbitTemplate.convertAndSend("work","work message"+i);}}消费者代码:@Componentpublic class WorkCustomer {@RabbitListener(queuesToDeclare = @Queue(value = "work"))public void receive1(String message){System.out.println("message1:"+message);}@RabbitListener(queuesToDeclare = @Queue(value = "work"))public void receive2(String message){System.out.println("message2:"+message);}}
第三种模型:fanout广播
生产者代码:public void testFanout(){rabbitTemplate.convertAndSend("logs","","这是广播模型的消息");}
消费者代码@Componentpublic class FanoutCustomer {@RabbitListener(bindings = {@QueueBinding(value = @Queue, //@Queue代表一个临时队列exchange = @Exchange(value = "logs",type = "fanout"))})public void receive1(String message){System.out.println("message1:"+message);}@RabbitListener(bindings = {@QueueBinding(value = @Queue, //@Queue代表一个临时队列exchange = @Exchange(value = "logs",type = "fanout"))})public void receive2(String message){System.out.println("message2:"+message);}}
第四种模型:Routing之订阅模型-Direct(直连)
生产者代码:public void testRouting(){rabbitTemplate.convertAndSend("directs","error","routingKey message");}
消费者代码:@Componentpublic class DirectCustomer {@RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "directs",type = "direct"),key = {"info","error","warn"})})public void receive1(String message){System.out.println("message1:"+message);}@RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "directs",type = "direct"),key = {"error"})})public void receive2(String message){System.out.println("message2:"+message);}}
rabbitmq集群
集群架构
–普通集群
默认情况下 :RabitMQ代理操作所需的所有数据/状态都将跨所有节点复制。这方面的一个例外是消息队列,默认情况下,消息队列位于一个节点上,尽管它们可以从所有节点看到和访问核心解决问题:当集群中某一时刻master节点宕机,可以对Quene中信息,进行备份
主从配置:
rabbitmq-server -detached无法启动rabbitMq的,可以参考:
https://blog.51cto.com/13777111/2300898
虚拟机:192.168.1.32 主192.168.1.33 从192.168.1.34 从
1.ip映射vim /etc/hosts 加入192.168.1.32 mq1192.168.1.33 mq2192.168.1.34 mq3修改完成之后将所有虚拟机hosts文件同步 scp /etc/hosts root@mq2:/etc/,断点续传也行
2.机器安装rabbitmq和erlang,如果克隆了安装了这两个的虚拟机(VMware),则可以省略
3.查看cookie是否一致(VMware克隆的机器是一样的,不一样就用scp同步)cat /var/lib/rabbitmq/.erlang.cookie
4.启动rabbitMq,成功访问管理界面rabbitmq-server -detached
5.在node2和node3执行加入集群命令:1.关闭 rabbitmqctl stop_app2.加入集群 rabbitmqctl join_cluster rabbit@mq13.启动服务:rabbitmqctl start_app
6.查看集群状态,任意节点执行:rabbitmqctl cluster_status
7.如果出现如下显示,集群搭建成功:Cluster status of node rabbit@mq3 ...[ {nodes, [ idisc, [ rabbit@mq1 , rabbit@mq2 , rabbit@mq3]}]》.frunning_nodes , [ rabbit@mq1 , rabbit@mq2 , rabbit@mq3 ]}.{cluster_name , <<" rabbit@mq1">>},{partitions, [ ]},{alarms, [ {rabbit@mq1, [ ]},{rabbit@mq2,[] },{rabbit@mq3, []》]}]
镜像集群:
1.镜像架构图
2.配置集群架构
策略说明rabbitmqctl set.policy [-p vhost>] [--priority <priority ] [--apply-to <apply-to>] <names <pattern<definition>-p Vhost:可选参数,针对指定vhost下的queue进行设置Name :policy的名称Pattern : queue的匹配模式(正则表达式)Definition:镜像定义,包括三个部分ha-mode,ha-params,ha-sync-modeha-mode:指明镜像队列的模式,有效值为all/exactly/nodesall:表示在集群中所有的节点上进行镜像exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定ha-params: ha-mode模式需要用到的参数ha-sync-mode:进行队列中消息的同步方式,有效值为automatic和manualpriority:可选参数, policy的优先级
1.查看当前策略rabbitmqctl list_policies
2.添加策略rabbitmqctl set_policy ha-all ' ^hello' '{" ha-mode" : "all" , " ha-sync-mode" : " automatic" }'说明:策略正则表达式为“A”表示所有匹配所有队列名称^hello:匹配hello开头队列
3.删除策略rabbitmqctl set_policy ha-all '^hello' ' { " ha-mode " : "all" , " ha-sync-mode " : " automatic" }'
RabbitMQ自学笔记相关推荐
- 字节、阿里等大厂的技术如何?看看这些Java程序员的自学笔记
这份笔记涉及JVM.JAVA集合.JAVA多线程并发.JAVA基础.Spring原理.微服务.Netty与RPC.网络.日志.Kafka.RabbitMQ.Hbase.MongoDB.设计模式.负载均 ...
- 字节跳动大佬的Python自学笔记.pdf
1. 字节跳动大佬的Python自学笔记 这是我的一个朋友自学资料包,通过这个资料包自学拿到了字节跳动的Offer, 下面是他之前入门学习Python时候的学习资料,非常全面,从Python基础.到w ...
- JAVA自学笔记07
JAVA自学笔记07 1.构造方法 1) 例如:Student s = new Student();//构造方法 System.out.println(s);// Student@e5bbd6 2)功 ...
- MySQL自学笔记2--select的5个子句
MySQL自学笔记 使用的MySQL自带命令客户端,其中具体的操作是在自建的数据库下room303表中进行的,表中的列有:id.name.age.email.tel.salary.riqi.class ...
- RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决)
RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) 参考文章: (1)RabbitMQ学习笔记四:RabbitMQ命令(附疑难问题解决) (2)https://www.cnblogs. ...
- JAVA自学笔记24
JAVA自学笔记24 1.能使用同步代码块就使用同步代码块,除非锁对象是this,就可以考虑使用同步方法.静态方法的锁是类的字节码对象. 2.JDK5新特性 1)接口Lock void Lock()/ ...
- 怎么用vc采集ni卡数据_SystemLink自学笔记(6):SystemLink架构和数据服务
1. SystemLink架构和数据服务 1.1. 架构和特点 现在在对SystemLink的功能有了一个大概的了解后,可以进一步从它的整体架构学习这门新技术了.NI官网给出了白皮书,原文是英文资料, ...
- JAVA自学笔记22
JAVA自学笔记22 1.操作基本数据类型的流 DataInputStream DataOutputStream 数据输出流允许应用程序以适当方式将基本的Java数据类型写入输出流中.然后,应用程序可 ...
- 深入理解弹性盒布局(fiex-box)——Web前端系列自学笔记
文章目录 弹性盒布局 弹性盒布局概述 弹性盒布局属性 display flex-flow justify-content align-items order flex align-self 总结 弹性 ...
最新文章
- C++之Boost使用
- Doctype作用? 严格模式与混杂模式如何区分?它们有何意义
- python idle退出_【ZZ】windows+python2.7在IDLE中执行sys.exit()出现的问题及解决方案
- 名校生都去哪些互联网公司?
- PHP如何解决网站大流量与高并发
- sqlserver 性能计数器的问题
- java n*n矩阵求值及求逆矩阵
- springcloud-知识点总结(三):Hystrix Dashboard turbine Zuul SpringCloud Config
- 封装jxl导出不同数据类型的excel
- 程序员应当注意的肢体语言
- 编程猫编程平台的使用介绍
- 摄影测量(一):概述
- Markdown中的二级标题去掉默认的下划线
- 一个VC编写的虚拟桌面软件
- qs计算机圣安排名,圣安德鲁斯大学世界排名及专业排名汇总(QS世界大学排名版)...
- 车金融|金融产品规则引擎的前世今生(下篇)
- 谷歌身份验证器 java demo实现 及使用中问题分析
- 2022钉钉发布会|云钉低代码新模式、新能力、新机遇
- 解决WINDOWS邮箱无法收取QQ邮件
- python 百度云不限速_百度云不限速插件内置十几种网盘搜索!