MQ 是中高级别Java程序员,必须要掌握的一门技术。
- 什么是MQ?
Message Quete 消息队列,是指消息传输中存储消息的容器。多用于分布式系统。
发送方:生产者,接收放:消费者
MQ的优势 劣势
优势
- 应用解耦 :系统耦合性越高,容错性、可维护性就很低。(降低服务与服务之间的远程调用)
- 异步提速 :服务与服务之间交流会消耗大量的时间,使用消息中间件,不用担心对方有没有直接收到消息,会节省很多的时间。。
- 削峰填谷 :将大量的直接的访问,打在MQ中,不直接打在服务上。然后服务慢慢的从MQ中拉取处理。牺牲时间换稳定性 。例如:高并发情况,用户操作数据库,数据库容易挂,只需将操作的消息,存储到MQ中,让其他服务获取MQ消息,慢慢处理。顺时压力转移到MQ上。
劣势
- 一致性问题 :消息由A、B 、C依次处理,A、B成功,C失败,消息就不一致了。
- 系统可用性降低 :引入MQ,就需要保证MQ正常启动。
- 系统复杂度提高 :引入MQ,需要保证消息正常被获取。
使用MQ的场景
- 生产者不需要从消费者获取反馈。(如果需要A调用B -> B做完 ->A获取B做完后 继续做下面的事情。就不适合使用MQ)
- 容许短暂的不一致性
- MQ 优势确实大,但需确保有实力能做好MQ
常见的MQ
Eriang是 为高并发设计的语言 ,他不是Golang!
RabbitMQ的简介:
AMQP,06年发布,Advanced Meaagse Quruing Ptorocol 即高级队列协议,是一个网络协议,属应用层,为面向消息的中间件设计。基于此协议的客户端与消息中间件产品进行通信,不受客户端中间件产品不同的限制,不同语言均可开发。
可以把AMQP 理解成HTTP 协议
AMQP 协议中 定义了一些角色
Publisher:消息生产者
Excange:交换机:分发消息
Routes:路由
Queue:消息存储的容器
Consumer:消息消费者
RabbitMQ 基础架构图
RabbitMQ 基本概念
Broker:接收、分发消息的应用。核心
Virtual Host:虚拟机:逻辑分区,可理解为 Mysql的数据库。
Connection:生产者、消费者、Broker 之间的TCP连接。
Channel:信道:减少TCP的Connection的开销作用。
Exchange:交换机:消息到达 Broker的第一站。常见类型有 direct、topic、fanout
Queue:队列:消息在这等待消费者取走。
Binding:交换机与队列绑定的过程。Binding信息保存于exchange中的查询表中,用与message的分发依据。
RabbitMQ 的7种工作模式
简单模式
work queues
Publich/Subscribe发布订阅模式
路由模式
Topics主题模式
RPC远程调用模式 (不算MQ)
官网:https://www.rabbitmq.com/ 下载地址:https://www.rabbitmq.com/download.html Java 官方文档:https://www.rabbitmq.com/tutorials/tutorial-one-java.html
JMS :Java Message Server,是Jave SE 面向消息中间件的API接口
ActiveMQ 遵循JMS规范,但是RabbitMQ 没有遵循。
Rabbit MQ Linux 安装 端口 5672 WEB 15672
(安装前,需要安装erlang环境,RabbitMQ,安装前,会让你去下载erlang环境,然后安装rabbitMQ)
不同版本的Rabbit MQ 必须使用对应范围的erlang环境:这点很重要,如果你是新手,不信这点,你还会再回来,看这句话的。
Rabbit 官方教程:http://erlang.org/download/otp_win64_23.2.exe
RabbitMQ的配置:https://www.rabbitmq.com/configure.html#config-items
安全组,防火墙 开放 5672、15672
1、环境确认
代码语言:javascript复制这里,我不扯淡,翻以前的资料确实坑,CentOS8 不支持一些erlang的版本,但是老版本RabbitMQ 又依赖于它。不如我们干脆,干最新的版本
首先 先去找你想要的RabbitMQ ,我们需要满足2个 centOS8 能安装rabbitMQ、又要满足与centOS8 能安装erlang,所以RabbitMQ 越新越好。
这里我使用的RabbitMQ 是3.8.9
Erlang版本是 从GitHub上弄下来的,你可以看下面自己弄。
2、安装前操作 (新机器,跳过)
代码语言:javascript复制如果有老版本 直接干掉 这里有问题,可以去百度卸载 即可。
先暂停服务
service rabbitmq-server stop
卸载RabbitMQ
yum -y remove rabbitmq-server.noarch
卸载erlang
yum -y remove erlang-*
yum remove erlang.x86_64
删不干净,但不影响使用,具体可以百度。但不保证 能删干净。
3、安装
代码语言:javascript复制一、安装erlang
# 添加仓库
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
Detected operating system as centos/8.
# 安装erlang
centOS 7 安装 请使用 yum install erlang
dnf install erlang
#查看当前erlang的版本
yum list | grep erlang
找到合适的RabbitMQ的版本下载下来
然后直接
rpm -ivh 你下载的mq.rpm文件
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
centOS7 缺失socat的话,那就
yum install socat
安装完成后,就可以启动了,RabbitMQ 安装后,就是内置的服务,可以直接service启动
代码语言:javascript复制启动命令
service rabbitmq-server start
service rabbitmq-server stop
service rabbitmq-server restart
不同版本显示不一样,最终还是需要以 lsof -i:5672 被占用为准
(这里有个巨大的BUG,启动提示你成功,一定要看 lsof -i:5672 看下端口是否被占用,不占用,一定要去看下 erl -v 看下版本,再去看下 https://www.rabbitmq.com/which-erlang.html 看下rabbitMQ 与 erlang 的版本是否兼容,不兼容,你累死,也找不到原因
这是看当前相关软件版本的命令
代码语言:javascript复制查看erlang的版本
yum list | grep erlang
查看rabbitMQ的版本
yum list | grep rabbitmq-server
然后去开启RabbitMQ的管理界面
代码语言:javascript复制高版本,可能用不到了, 请跳到 常用命令
# 开启管理界面
rabbitmq-plugins enable rabbitmq_management
# 修改默认配置信息
vim /usr/lib/rabbitmq/lib/rabbitmq_server-版本/ebin/rabbit.app
# 比如修改密码、配置等等,例如:loopback_users 中的 <<"guest">>,只保留guest
常用命令
代码语言:javascript复制# 添加开机启动RabbitMQ服务
chkconfig rabbitmq-server on
# 启动服务
service rabbitmq-server start
# 开启web端ui
占用端口15672 请务必 开启云服务器的 安全组与防火墙放行
rabbitmq-plugins enable rabbitmq_management
# 停止服务
service rabbitmq-server stop
# 查看当前所有用户
rabbitmqctl list_users
# 由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户
rabbitmqctl delete_user guest
# 必须先启动才能执行
# 添加新用户
rabbitmqctl add_user 用户名 密码
# 设置权限
,并开启远程访问
rabbitmqctl set_user_tags 用户名 administrator
rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"
开放防火墙的端口(安全组 我默认你开放了)
代码语言:javascript复制开放端口(开放后需要要重启防火墙才生效)
firewall-cmd --zone=public --add-port=端口号/tcp --permanent
重启防火墙
firewall-cmd --reload
访问吧 http://192.168.3.10:15672/ IP 你自己替换下
说明
权限角色说明:
1、 超级管理员(administrator)
可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
2、 监控者(monitoring)
可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
3、 策略制定者(policymaker)
可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
4、 普通管理者(management)
仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
5、 其他
无法登陆管理控制台,通常就是普通的生产者和消费者。
Virtual Hosts
每个Virtual Hosts相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。
特殊说明: 解决问题的光鲜,藏着磕Bug的痛苦。 万物皆入轮回,谁也躲不掉! 以上文章,均是我实际操作,写出来的笔记资料,不会出现全文盗用别人文章!烦请各位,请勿直接盗用!