一 、认识RabbitMq
rabbitmq 是一个开源的消息代理和队列服务器,通过普通的协议(Amqp 协议)来完成不同应用之间的数据共享,rabbitMq 是通过 erlang 语言来开发的基于 amqp 协议。
各大互联网公司为什么选择RabbitMq?
**
- 比如滴滴、美团、携程、去哪儿
- 开源,性能好,稳定性保证
- 提供了消息的可靠性投递(confirm),返回模式
- 与 spring amqp 完美整合,提供丰富的api
- 集群模式丰富(HA模式、镜像队列模型)
- 保证数据不丢失的情况下,保证很好的性能
二、RabbitMq 高性能是如何做到的
- 使用的是 erlang 语言(通常使用在交换机上),erlang 的语言的高性能与原生socket 的延迟效果。
- 消息入队的延时消息的消费响应很快
三、什么AMQP协议
- 是一个二进制协议
amqp 是一个应用层协议的规范(定义了很多规范),可以有很多不同的消息中间件产品(需要遵循该规范)
- server: 是消息队列节点
- virtual host: 虚拟主机
- exchange: 交换机(消息投递到交换机上)
- message queue: 被消费者监听消息
交换机和队列是有一个绑定的关系
四、AMQP的核心概念
- server : 又称为broker,接受客户端连接,实现amqp实体服务
- connection: 连接,应用程序与broker建立网络连接
- channel: 网络通道,几乎所有的操作都是在 channel 中进行的,是进行消息对象的通道,客户端可以建立多个通道,每一个 channnel 表示一个会话任务。
- Message: 服务器和应用程序之间传递数据的载体,有 properties(消息属性,用来修饰消息,比如消息的优先级,延时投递)和 Body (消息体)
- virtual host(虚拟主机):是一个逻辑概念,最上层的消息路由,一个虚拟主机中可以包含多个 exchange 和 queue 但是一个虚拟主机中不能有名称相同的 exchange 和 queue
- exchange (交换机): 消息直接投递到交换机上,然后交换机根据消息的路由 key 来路由到对应绑定的队列上。
- binding (绑定): 绑定 exchange 与 queue 的虚拟连接, binding 中可以包含route_key
- route_key(路由key):它的作用是在交换机上通过 route_key 来把消息路由到那个队列上。
- queue 队列(队列): 用来保存消息的载体,有消费者监听,然后消费消息。
五、RabbitMq 的整体架构模型
六、RabbitMq的消息是如何流转的?
七、RabbitMq 的安装和使用
1. 安装Erlang
#第一步
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
yum -y install epel-release
sudo yum install erlang
#检验安装是否成功
yum info erlang
2. 安装RabbitMq
下载地址: https://www.rabbitmq.com/install-rpm.html#downloads
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.0/rabbitmq-server-3.8.0-1.el7.noarch.rpm
安装RabbitMq
yum -y install socat
rpm -ivh rabbitmq-server-3.8.0-1.el7.noarch.rpm
3. 开机启动
chkconfig rabbitmq-server on
systemctl start rabbitmq-server
#检查
rabbitmqctl status
安装管理端界面
rabbitmq-plugins enable rabbitmq_management
修改用户及密码
vi /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.0/ebin/rabbit.app
将:{loopback_users, [<<”guest”>>]}, 改为:{loopback_users, []}, 原因:rabbitmq从3.3.0开始禁止使用guest/guest权限通过 除localhost外的访问
检查端口: lsof -i:5672
# 若没有lsof 请安装
yum install lsof
lsof -i:5672
通过 ps -ef | grep rabbitmq
通过 http://192.168.222.128:15672/ 访问
卸载文档:https://www.cnblogs.com/kingsonfu/p/11023967.html
八、RabbitMq 常用命令
1.起停止RabbitMq服务命令
#启动服务
rabbitmqctl start_app(启动rabbitmq节点 保证需要erlang虚拟机节点起来才能执行)
#停止服务 rabbitmqctl stop_app(停止rabbtimq节点,但是不会停止erlang节点)
rabbitmqctl stop(都 会停止)
#查看服务状态 rabbtimqctl status
2.用户操作命令
查看用户列表
#查看用户列表
rabbitmqctl list_users
添加用户
#添加用户
rabbitmqctl add_user liuscoding liuscoding
设置rabbitmq用户的角色
#设置rabbitmq用户的角色
rabbitmqctl set_user_tags liuscoding administrator
为用户设置权限
**
# 为用户设置权限
# rabbitmqctl set_permissions -p <虚拟机> <用户名> ".*" ".*" ".*"
rabbitmqctl set_permissions -p / liuscoding ".*" ".*" ".*"
列出用户权限
**
#列出用户权限:
rabbitmqctl list_user_permissions liuscoding
清除用户权限
**
# 清除用户权限
rabbitmqctl clear_permissions -p <虚拟机> <用户名>
删除用户
删除用户 rabbitmqctl delete_user guest
修改密码
#修改密码
rabbitmqctl change_password 用户名 新密码
九、RabbitMq 交换机详解
作用: 接受生产者的消息,然后根据路由键把消息投递到跟交换机绑定的对应的队列上。
交换机属性
- Name: 交换机名称
- Type: 交换机类型,Direct、topic、fanout、headers
- Durablity:是否需要持久化
- autodelete: 假如没有队列绑定到该交换机,那么交换机会自动删除。
- internal: 当前交换机交换机是否用户 RabbitMq 内部使用不常用,默认为false
- Argurements: 扩展参数,用户扩展AMQP定制化协议。
交换机类型
直连交换机(Direct exchange)
所有发送的 Direct exchange 的消息都会被投递到与 Routekey名称(与队列名称)相同的queue上
direct 模式下,可以使用 RabbitMq 自定exchange —-> default exchange 所以不需要交换机和任何队列绑定,消息将会投递到route_key名称和队列名称相同的队列上。
主题交换机 TopicExchange
就是在队列上绑到 top 交换机上的路由key 可以是通过通配符来匹配的通配符的规则是
比如:log.#: 可以是匹配一个单词 也可以匹配多个单词 比如 log.# 可以匹配log.a log.a.b
log. : 可以匹配一个单词,比如log. ,可以匹配log.a 但是不可以匹配log.a.b。
扇形交换机(fanout exchange)
就是消息通过丛交换机到队列上不会通过路由key 所以该模式的速度是最快的 只要和交换机绑定的那么消息就会被分发到与之绑定的队列上。
队列、绑定主机、消息
绑定: exchange 与 之间的连接关系(通过路由规则)
队列: 用来存储消息的实体
队列的属性: durablility 是否被持久化
AutoDelete: 表示最后一个监听被移除那么该队列就会删除。
消息: 用来生产者 和 消费者之间传递数据的
消息属性: 包括 消息体Body 和 属性 properties
常用属性: delivery mode,headers,content_type(消息类型) content_encoding(消息编码),priporty(消息优先级)
correntlation_id( 最终消息唯一的ID)、reply_to(消息失败重回队列),expiretion(消息的过期时 间),message_id(消息id);timestamp,type,user_id ,app_id,cluster_id等