一 、认识RabbitMq

rabbitmq 是一个开源的消息代理和队列服务器,通过普通的协议(Amqp 协议)来完成不同应用之间的数据共享,rabbitMq 是通过 erlang 语言来开发的基于 amqp 协议。

各大互联网公司为什么选择RabbitMq?
**

  • 比如滴滴、美团、携程、去哪儿
    • 开源,性能好,稳定性保证
    • 提供了消息的可靠性投递(confirm),返回模式
    • 与 spring amqp 完美整合,提供丰富的api
    • 集群模式丰富(HA模式、镜像队列模型)
    • 保证数据不丢失的情况下,保证很好的性能

二、RabbitMq 高性能是如何做到的

  1. 使用的是 erlang 语言(通常使用在交换机上),erlang 的语言的高性能与原生socket 的延迟效果。
  2. 消息入队的延时消息的消费响应很快

三、什么AMQP协议

  1. 是一个二进制协议
  2. amqp 是一个应用层协议的规范(定义了很多规范),可以有很多不同的消息中间件产品(需要遵循该规范)

    • server: 是消息队列节点
    • virtual host: 虚拟主机
    • exchange: 交换机(消息投递到交换机上)
    • message queue: 被消费者监听消息

    交换机和队列是有一个绑定的关系

image.png

四、AMQP的核心概念

  1. server : 又称为broker,接受客户端连接,实现amqp实体服务
  2. connection: 连接,应用程序与broker建立网络连接
  3. channel: 网络通道,几乎所有的操作都是在 channel 中进行的,是进行消息对象的通道,客户端可以建立多个通道,每一个 channnel 表示一个会话任务。
  4. Message: 服务器和应用程序之间传递数据的载体,有 properties(消息属性,用来修饰消息,比如消息的优先级,延时投递)和 Body (消息体)
  5. virtual host(虚拟主机):是一个逻辑概念,最上层的消息路由,一个虚拟主机中可以包含多个 exchange 和 queue 但是一个虚拟主机中不能有名称相同的 exchange 和 queue
  6. exchange (交换机): 消息直接投递到交换机上,然后交换机根据消息的路由 key 来路由到对应绑定的队列上。
  7. binding (绑定): 绑定 exchange 与 queue 的虚拟连接, binding 中可以包含route_key
  8. route_key(路由key):它的作用是在交换机上通过 route_key 来把消息路由到那个队列上。
  9. queue 队列(队列): 用来保存消息的载体,有消费者监听,然后消费消息。

五、RabbitMq 的整体架构模型

image.png

六、RabbitMq的消息是如何流转的?

image.png

七、RabbitMq 的安装和使用

image.png

1. 安装Erlang

  1. #第一步
  2. yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
  3. wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
  4. rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
  5. yum -y install epel-release
  6. sudo yum install erlang
  7. #检验安装是否成功
  8. yum info erlang

image.png

2. 安装RabbitMq

下载地址: https://www.rabbitmq.com/install-rpm.html#downloads

  1. wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.0/rabbitmq-server-3.8.0-1.el7.noarch.rpm

安装RabbitMq

  1. yum -y install socat
  2. rpm -ivh rabbitmq-server-3.8.0-1.el7.noarch.rpm

3. 开机启动

  1. chkconfig rabbitmq-server on
  2. systemctl start rabbitmq-server
  3. #检查
  4. rabbitmqctl status

安装管理端界面

  1. rabbitmq-plugins enable rabbitmq_management

修改用户及密码

  1. 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

  1. # 若没有lsof 请安装
  2. yum install lsof
  3. lsof -i:5672

image.png

通过 ps -ef | grep rabbitmq
image.png

通过 http://192.168.222.128:15672/ 访问

image.png

卸载文档:https://www.cnblogs.com/kingsonfu/p/11023967.html

八、RabbitMq 常用命令

1.起停止RabbitMq服务命令

  1. #启动服务
  2. rabbitmqctl start_app(启动rabbitmq节点 保证需要erlang虚拟机节点起来才能执行)
  3. #停止服务 rabbitmqctl stop_app(停止rabbtimq节点,但是不会停止erlang节点)
  4. rabbitmqctl stop(都 会停止)
  5. #查看服务状态 rabbtimqctl status

2.用户操作命令

查看用户列表

  1. #查看用户列表
  2. rabbitmqctl list_users

image.png

添加用户

  1. #添加用户
  2. rabbitmqctl add_user liuscoding liuscoding

设置rabbitmq用户的角色

  1. #设置rabbitmq用户的角色
  2. rabbitmqctl set_user_tags liuscoding administrator

为用户设置权限

**

# 为用户设置权限
# rabbitmqctl set_permissions -p <虚拟机> <用户名> ".*" ".*" ".*"

rabbitmqctl set_permissions -p / liuscoding ".*" ".*" ".*"

列出用户权限

**

#列出用户权限:

rabbitmqctl list_user_permissions liuscoding

image.png

清除用户权限

**

# 清除用户权限 
rabbitmqctl clear_permissions -p <虚拟机> <用户名>

删除用户

删除用户 rabbitmqctl delete_user guest

修改密码

#修改密码 
rabbitmqctl change_password 用户名 新密码

九、RabbitMq 交换机详解

作用: 接受生产者的消息,然后根据路由键把消息投递到跟交换机绑定的对应的队列上。

image.png

交换机属性

  1. Name: 交换机名称
  2. Type: 交换机类型,Direct、topic、fanout、headers
  3. Durablity:是否需要持久化
  4. autodelete: 假如没有队列绑定到该交换机,那么交换机会自动删除。
  5. internal: 当前交换机交换机是否用户 RabbitMq 内部使用不常用,默认为false
  6. Argurements: 扩展参数,用户扩展AMQP定制化协议。

交换机类型

直连交换机(Direct exchange)

所有发送的 Direct exchange 的消息都会被投递到与 Routekey名称(与队列名称)相同的queue上

direct 模式下,可以使用 RabbitMq 自定exchange —-> default exchange 所以不需要交换机和任何队列绑定,消息将会投递到route_key名称和队列名称相同的队列上。

image.png

主题交换机 TopicExchange

就是在队列上绑到 top 交换机上的路由key 可以是通过通配符来匹配的通配符的规则是

比如:log.#: 可以是匹配一个单词 也可以匹配多个单词 比如 log.# 可以匹配log.a log.a.b
log. : 可以匹配一个单词,比如log. ,可以匹配log.a 但是不可以匹配log.a.b。

image.png

扇形交换机(fanout exchange)

就是消息通过丛交换机到队列上不会通过路由key 所以该模式的速度是最快的 只要和交换机绑定的那么消息就会被分发到与之绑定的队列上。
image.png

队列、绑定主机、消息

绑定: 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