一.消息中间件原理简介:
1.什么是消息队列?
消息队列,一般我们会简称它为MQ(Message Queue),先看队列Queue,这是一种先进先出的数据结构,一种只允许在一端进行插入,在另一端进行删除的线性表结构。运行插入的一端叫队尾(rear),允许删除的一端叫队头(font)。
消息队列可以简单理解为:把要传输的数据放在队列中。
其中:
生产者:把数据放到消息队列;
消费者:从消息队列里边取数据。
2.为什么要用消息队列?
- 解耦
如图所示,将系统A的userId写到消息队列中,这样系统A就不用经常改动了。
- 系统A只负责把数据写到队列中,谁想要或不想要这个数据(消息),系统A一点都不关心。
- 即便现在系统D不想要userId这个数据了,系统B又突然想要userId这个数据了,都跟系统A无关,系统A一点代码都不用改。
- 系统D拿userId不再经过系统A,而是从消息队列里边拿。系统D即便挂了或者请求超时,都跟系统A无关,只跟消息队列有关。
这样一来,系统A与系统B、C、D都解耦了。
- 异步方式,提高系统吞吐量
同步调用时:假设系统A运算出userId具体的值需要50ms,调用系统B的接口需要300ms,调用系统C的接口需要300ms,调用系统D的接口需要300ms。那么这次请求就需要50+300+300+300=950ms。
那么此时,为了提高用户体验和吞吐量,其实可以异步地调用系统B、C、D的接口:
系统A执行完了以后,将userId写到消息队列中,然后就直接返回了(至于其他的操作,则异步处理)。
本来整个请求需要用950ms(同步) 现在将调用其他系统接口异步化,只需要A运算50ms+消息发送50ms=100ms(异步)
- 削峰/限流
服务器,Redis,MySQL各自的承受能力都不一样,如果全部流量照单全收肯定有问题,因此将把请求放到队列里面,然后至于每秒消费多少请求,就看自己的服务器处理能力,这样可能会比正常时候慢一点,但是不至于服务器挂掉,等到流量高峰过去,就恢复正常了。
二.安装RabbitMQ:
1.安装erlang语言环境:
- 设置安装源:
vim /etc/yum.repos.d/rabbitmq-erlang.repo
- 输入如下erlang 22.X安装源(centos7上):
[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/22/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1
- 执行yum安装:
yum -y install erlang
2.安装RabbitMQ-Server
- 下载相应的Rabbit-Server版本:Rabbit-Server3.8.9
- 使用xftp将Rabbit-Server包上传到/usr/local目录下:
- 采用yum命令安装:
yum install rabbitmq-server-3.8.9-1.el7.noarch.rpm
3.启动/停止/重启/查看RabbitMQ命令:
service rabbitmq-server start
service rabbitmq-server stop
service rabbitmq-server restart
service rabbitmq-server status
4.配置用户信息,允许远程访问:
- 进入/etc/rabbitmq目录下:
cd /etc/rabbitmq
vim rabbitmq.config
并输入
5.开启web界面管理工具,并重启RabbitMQ:
- 启动rabbitmq的管理插件:
rabbitmq-plugins enable rabbitmq_management
- Rabbit重启命令:
service rabbitmq-server restart
6.修改防火墙配置文件,开放15672和5672端口:
- 网页访问mq管理系统需要的端口:15672
- Java程序连接mq时需要的端口:5672
7.后台管理命令:
rabbitmq-plugins enable rabbitmq_management // 启动插件
rabbitmq-plugins disable rabbitmq_management // 禁用插件
chown -R rabbitmq:rabbitmq /var/lib/rabbitmq // 授权
rabbitmqctl add_user admin admin // 后面两个参数为 用户 密码
rabbitmqctl set_user_tags admin administrator // 修改用户角色
rabbitmqctl set_permissions -p / admin '.*' '.*' '.*' // 添加权限
新建用户:rabbitmqctl add_user username passwd
删除用户:rabbitmqctl delete_user username
改密码: rabbimqctl change_password {username} {newpassword}
设置用户角色:rabbitmqctl set_user_tags {username} {tag ...}
查看用户:rabbitmqctl lsit_users
8.通过浏览器访问管理界面:http://ip:15672
账号和密码默认都是guest