文章目录
学习一门中间件技术之前当然要对其进行了解,心中要有相关疑问,带着问题去学习一门技术,才能把握其重点。从一个问题的引入,慢慢向深层次靠拢。
比如:看到消息中间件这个词,应该想到的是消息中间件是什么?
然后就去了解消息中间件;之后可能又会有疑问,为什么要引入消息中间件呢?心中无疑问时,或许你已经了解的差不多了
带着疑问去学习,更能把握技术主干。
一、消息中间件的相关问题
1、消息中间件是什么?
消息中间件是利用高效可靠的消息传递机制进行异步的数据传输,并基于数据通信进行分布式系统的集成。通过提供消息队列模型和消息传递机制,可以在分布式环境下扩展进程间的通信。
看到官方提供的术语,可能难以理解;可以通过概念中的异步分析,了解消息中间件。有异步当然就有同步这个概念。
消息中间件负责消息的传递、存储、分发,数据的存储和分发要遵循某种规范(为了不同语言可以进行交互)
1.1、同步详解
平常我们在做项目时,为了完成业务需求,我们可能需要不同系统间调用接口。
用户发起请求给系统A,系统A接到请求直接调用系统B,系统B返回结果后,系统A才能返回结果给用户,这种模式就是同步调用。
从这你就可以看出,同步调用时,系统之间相互依赖;用户发起请求,相关的系统都要跟着运行,如果一个系统出现了问题,那么整个就over了。
1.2、异步详解
想必都了解异步是什么意思,发送方和接收方谁也不知道谁;比如发送方只管我发消息了,也不管有没有接收。相对来说就是相互透明的。(在软件开发中,透明是看不到的意思)
从这张图我可以看出,生产者不断发送消息到消息队列;消费者不断从队列获取消息,所以生产者只关心消息的发送,消费者只关心获取消息;轻松实现系统间解耦。
通过异步可以轻松理解消息中间件的实现机制。
简单了说消息中间件是一个独立部署的系统,可以实现系统之间的异步调用。
2、为什么要使用消息中间件?
2.1、消息中间件的优点
异步提升性能、降低耦合度、流量削峰
2.2、异步提升性能分析
可以看出不使用消息中间件一共耗时20ms,这样的串行执行处于一种阻塞状态,意思是某个系统没有执行完是不会返回结果的。
如果引入消息中间件之后呢?
一共耗时100ms,异步执行处于非阻塞状态,即便某个系统需要执行很久,不过不会影响其他系统的执行。
2.3、降低耦合度分析
可以看出如果不使用消息中间件,一旦B系统出现了问题,那么层层结果返回,用户收到的就是一个异常,然后就需要等着系统修复
使用了消息中间件之后,A系统发送消息到消息中间件之后就会直接返回结果;B系统被工程师修复好之后,重新获取消息执行未执行的操作就行了。系统之间相互分离,耦合度大大降低。
2.4、流量削峰
如上图,如果系统B最高以4000QPS的速度查询数据库,当系统A中的QPS超过一万时,此时超过了系统A的最大限值,此时请求全部打到了系统B,此时B是最高以4000QPS的速度查询数据库,所以数据库就会崩溃。
如果使用了消息中间件,系统A的全部请求会累积到消息中间件中,然后系统B根据自己的需求每次从消息中间件中读取多少请求。
使用消息中间件可以屏蔽不同语言的差异性(简单了说就是语言之间可以相互通讯,使用消息中间件屏蔽了具体的实现细节)
3、协议精讲
消息中间件一般负责数据的传递、存储、分发三个部分;
然后问题来了,假设两个系统A系统和B系统,采用了不同的语言进行实现;那么怎么进行消息传递呢?所以说消息中间件需要遵循某种协议。
另外这个协议一般来说是比较简单的协议,比如AMQP、Kalfka等
注:不适用http协议,这个协议比较复杂,包含了状态码、响应码、数据加密解密等
4、消息中间件技术选型
1、ActiveMQ:老牌的Apache产品,完全支持JMS规范(JMS定义了Java API层面的标准)
2、Kafka:大数据领域的产品,基于TCP/IP二进制协议,速度非常快,但不支持事务,消息可能丢失、重复、错误。
3、RocketMQ:阿里巴巴出品,性能很高,但事务方面没有开源。
4、RabbitMQ:使用Erlang语言开发的消息队列系统,基于AMQP协议实现,AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内,对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
作为稳定、流行、开源等综合性最强的RabbitMQ当然要受到鄙人的关注了
二、RabbitMQ安装
我用的是阿里云服务器(我绝对不是打广告的哈😀)
远程连接工具用的是Xshell,还有文件传输工具Xftp
2.1、Erlang的下载安装
1.下载Erlang的JDK(因为RabbitMQ是使用erlang语言编写的)
wget https://packages.erlang-solutions.com/erlang-solutions-2.0-1.noarch.rpm
2、解压Erlang压缩包
rpm -Uvh erlang-solution-2.0.1.noarch.rpm
3、安装Erlang
yum install -y erlang
4、查Erlang是否安装成功
erl -v
2.2、RabbitMQ的下载安装
1、安装RabbitMQ依赖的插件socat
yum install -y socat
2、下载RabbitMQ
查看系统版本
lsb_release -a
去官网下载查询版本
https://www.rabbitmq.com/download.html
右键RHEL/Centos 8.x --》复制连接地址
下载RabbitMQ
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.14/rabbitmq-server-3.8.14-1.el8.noarch.rpm
3、安装RabbitMQ
解压RabbitMQ压缩包
安装RabbitMQ
yum install rabbitmq-server -y
2.3、查看RabbitMQ是否安装成功
1、启动服务
systemctl start rabbitmq-server
2、查看rabbitmq的状态
systemctl status rabbitmq-server
出现这个就说明安装成功了。
三、安装RabbitMQ的web客户端
1、安装
1.1、输入
rabbitmq-plugins enable rabbitmq_management
1.2、重启服务
systemctl restart rabbitmq-server
1.3、浏览器访问http://你的ip地址:15672
注意云服务器一定要在安全组中开放15672端口
1.3.1、如果是本地服务器
username:guest
password:guest
1.3.2、如果是远程服务器需要进行授权
1.3.2.1、新增用户
rabbitmqctl add_user root root
1.3.2.2、设置用户权限
rabbitmqctl set_user_tags root administrator
下面的权限是借鉴的网友
management
用户可以通过AMQP做的任何事外加:
列出自己可以通过AMQP登入的virtual hosts
查看自己的virtual hosts中的queues, exchanges 和 bindings
查看和关闭自己的channels 和 connections
查看有关自己的virtual hosts的“全局”的统计信息,包含其他用户在这些virtual hosts中的活动。
policymaker
management可以做的任何事外加:
查看、创建和删除自己的virtual hosts所属的policies和parameters
monitoring
management可以做的任何事外加:
列出所有virtual hosts,包括他们不能登录的virtual hosts
查看其他用户的connections和channels
查看节点级别的数据如clustering和memory使用情况
查看真正的关于所有virtual hosts的全局的统计信息
administrator
policymaker和monitoring可以做的任何事外加:
创建和删除virtual hosts
查看、创建和删除users
查看创建和删除permissions
关闭其他用户的connection
1.3.3、输入username:root,password:root登录控制台
2、权限指令总结
1、rabbitmqctl add_user 账号 密码 添加用户
2、rabbitmqctl set_user_tags 账号 权限 赋予权限
3、rabbitmqctl change_password Username Newpassword 修改密码
4、rabbitmqctl delete_user Username 删除用户
5、rabbitmqctl list_user 查看所有用户
6、rabbitmqctl set_permissions -p / Username “.* " ". " ". *” 设置用户为administrator角色
四、Docker安装RabbitMQ
1、Docker的安装
1、更新yum包
yum update
2、安装软件包yum-util(提供yum-config-manager功能),还有device-mapper的依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
3、设置docker仓库为阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
4、安装docker
yum install docker-ce -y
5、查看docker 版本
docker -v
6、配置加速镜像
vim /etc/docker/daemon.json
修改为如下内容
{
“registry-mirrors”: [“https://registry.docker-cn.com”]
}
systemctl restart docker.service
重启docker即可
sudo systemctl restart docker
本地Centos7安装docker步骤:https://blog.csdn.net/Kevinnsm/article/details/111409921
2、Docker安装RabbitMQ
下载rabbitmq
docker pull rabbitmq
启动rabbitmq
docker run -d --hostname my-rabbit --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq
–hostname:指定容器主机名称
–name:指定容器名称
-p :端口映射(docker内部端口和外网端口)
查看镜像ID
docker ps
安装rabbitmq客户端
docker exec -it 镜像ID /bin/bash //进入容器内部
rabbitmq-plugins enable rabbitmq_management