1.什么是中间件
什么是中间件
中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必须要有一个通信中间件,即中间件+平台+通信,这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支撑软件和使用软件区分开来
为什么需要使用消息中间件
具体地说,中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担,中间件带给应用系统的,不只是开发的简便、开发周期的缩短,也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。
中间件特点
为解决分布异构问题,人们提出了中间件(middleware)的概念。中间件时位于平台(硬件和操作系统)和应用之间的通用服务,如下图所示,这些服务具有标准的程序接口和协议。针对不同的操作系统和硬件平台,它们可以有符合接口的协议规范的多种实现。
2. 中间件技术及架构的概述
3.消息中间件
什么是MQ
MQ
(Message Quene) : 翻译为消息队列
,通过典型的
生产者
和消费者
模型,生产者不断向消息队列中生产消息,消费者不断的从队列中获取消息。因为消息的生产和消费都是异步的,而且只关心消息的发送和接收,没有业务逻辑的侵入,轻松的实现系统间解耦。别名为
消息中间件
通过利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。
MQ有哪些
当今市面上有很多主流的消息中间件,如老牌的
ActiveMQ
、RabbitMQ
,炙手可热的Kafka
,阿里巴巴自主开发RocketMQ
等
不同MQ的特点
1.ActiveMQ
ActiveMQ是Apache出品,最流行的,能力强劲的开源消息总线。它是一个完全支持JMS规范的的消息中间件。丰富的API,多种集群架构模式让ActiveMQ在业界成为老牌的消息中间件,在中小型企业颇受欢迎!
2.Kafka
Kafka是LinkedIn开源的分布式发布-订阅消息系统,目前归属于Apache顶级项目。Kafka主要特点是基于Pull的模式来处理消息消费,追求高吞吐量,一开始的目的就是用于日志收集和传输。0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求,适合产生大量数据的互联网服务的数据收集业务。
3.RocketMQ
RocketMQ是阿里开源的消息中间件,它是纯Java开发,具有高吞吐量、高可用性、适合大规模分布式系统应用的特点。RocketMQ思路起源于Kafka,但并不是Kafka的一个Copy,它对消息的可靠传输及事务性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推送、日志流式处理、binglog分发等场景。
4.RabbitMQ
RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现。AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。AMQP协议更多用在企业系统内对数据一致性、稳定性和可靠性要求很高的场景,对性能和吞吐量的要求还在其次。
总结:
RabbitMQ比Kafka可靠,Kafka更适合IO高吞吐的处理,一般应用在大数据日志处理或对实时性(少量延迟),可靠性(少量丢数据)要求稍低的场景使用,比如ELK日志收集。
4.RabbitMQ引言
基于
AMQP
协议,erlang语言开发,是部署最广泛的开源消息中间件,是最受欢迎的开源消息中间件之一。
5.消息队列协议
什么是协议
所谓协议是指:
计算机底层操作系统和应用程序通讯时共同遵守的一组约定,只有遵循共同的约定和规范,系统和底层操作系统之间才能相互交流和一般的网络应用程序的不同它主要负责数据的接受和传递,所以性能比较高协议对数据格式和计算机之间交换数据都必须严格遵守规范
网络协议的3要素
语法:语法是用户数据与控制信息的结构与格式,以及数据出现的顺序
语义:语义是解释控制信息每个部分的意义,它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应
时序:时序是对事件发生顺序的详细说明 比如MQ发送一个信息,是以什么数据格式发送到队列中,然后每个部分的含义是什么,发送完毕以后的执行的动作,以及消费者消费消息的动作,消费完毕的相应结构和反馈是什么,然后按照对应的执行顺序进行处理。
如果你还是不理解:大家每天都在接触的 http请求协议:
语法:http规定了请求报文和响应报文的格式
语义:客户端主动发起请求称之为请求(这是一种定义,同时你发起的是 post/get请求)
时序:一个请求对应一个响应(一定先有请求在有响应,这个是时序) 而消息中间件采用的并不是
http协议,而常见的消息中间件协议有有:OpenWire、AMQP、MQTT、Kafka,OpenMessage协议
为什么消息中间件不直接使用 http协议
因为http请求报文头和响应报文头是比较复杂的,包含了Cookie,数据的加密解密,状态码,响应码等附加的功能,但是对于一个消息而言,我们并不需要这么复杂,也没有这个必要性,它其实就是负责数据传递,存储,分发就行,一定要追求的是高性能。尽量简洁,快速大部分情况下 http大部分都是短链接,在实际的交互过程中,一个请求到响应都很有可能会中断,中断以后就不会执行持久化,就会造成请求的丢失。这样就不利于消息中间件的业务场景,因为消息中间件可能是一个长期的获取信息的过程,出现问题和故障要对数据或消息执行持久化等,目的是为了保证消息和数据的高可靠和稳健的运行
AMQP协议
AMQP(advanced message queuing protocol)`在2003年时被提出,最早用于解决金融领不同平台之间的消息传递交互问题。顾名思义,AMQP是一种协议,更准确的说是一种binary wire-level protocol(链接协议)。这是其和JMS的本质差别,AMQP不从API层进行限定,而是直接定义网络交换的数据格式。这使得实现了AMQP的provider天然性就是跨平台的。以下是AMQP协议模型:
特性:
- 分布式事务支持
- 消息的持久化支持
- 高性能和高可靠的消息处理优势
MQTT协议
MQTT协议(Message Queueing Telemetry Transport)消息队列是IBM开发的及时通讯协议,物联网系统架构中的重要组成部分
特点:
- 轻量
- 结构简单
- 传输快,不支持事务
- 没有持久化设计
应用场景:
- 适用于计算能力有限
- 低带宽
- 网络不稳定的场景
支持者:
OpenMessage协议
是近几年由阿里、雅虎和滴滴出行、Stremalio等公司共同参与创立的分布式信息中间件、流处理等领域的应用开发标准
特点:
- 结构简单
- 解析速度快
- 支持事务和持久化设计
Kafka协议
Kafka协议是基于 TCP/IP的二进制协议。消息内部是 通过长度来分割,由一些基本数据类型组成
特点:
- 结构简单
- 解析速度快
- 无事务支持
- 有持久化设计
小结
协议:是在 tcp/ip协议基础之上构建的一种约定俗称的规范和机制、它的主要目的可以让客户端(应用程序
java,go)进行沟通和通讯。并且这种写一下规范必须具有持久性,高可用,高可靠的性能
6.RabbitMQ的安装
1、官网下载
RabbitMQ官网下载链接:https://www.rabbitmq.com/download.html
RabbitMQ是基于Erlang语言开发的,所以,下载RabbitMQ之前要先安装Erlang
RabbitMQ和Erlang有严格的版本匹配
版本对照:https://www.rabbitmq.com/which-erlang.html
Erlang官网下载链接:https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.2.7-2.el7.x86_64.rpm
2、xftp上传文件
3、安装erlong
3.1解压缩
rpm -Uvh erlang-22.0.7-1.el7.x86_64.rpm
3.2安装
yum install -y erlang
3.3查看版本
erl -v
4、安装RabbitMQ
4.1在RabiitMQ安装过程中需要依赖socat插件,首先安装该插件
yum install -y socat
4.2解压安装RabbitMQ的安装包
rpm -Uvh rabbitmq-server-3.7.18-1.el7.noarch.rpm
4.3 安装
yum install -y rabbitmq-server
5、更改配置文件
配置文件位置默认在
/usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example
复制配置文件到安装目录
cp /usr/share/doc/rabbitmq-server-3.7.18/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
查看配置文件位置
ls /etc/rabbitmq/rabbitmq.config
修改配置文件(参见下图:)
vim /etc/rabbitmq/rabbitmq.config
6、安装RabbitMQWeb管理页面及授权操作
打开RabbitMQWeb管理页面插件
rabbitmq-plugins enable rabbitmq_management
7、启动rabbitmq服务
# 启动rabbitmq
systemctl start rabbitmq-server
# 查看rabbitmq状态
systemctl status rabbitmq-server
8、浏览器登录RabbitMQ(*************:15672)服务器ip+端口号
Tips:阿里云服务器要手动开发15672端口号安全组
9、默认账号密码
username: guest
password: guest
10、RabbitMQ的其他指令介绍
#重启rabbitmq服务
systemctl restart rabbitmq-server
#关闭rabbitmq服务
systemctl stop rabbitmq-server
# 设置rabbitmq服务开机自启动
systemctl enable rabbitmq-server
#登录服务器,设置新账户和密码
rabbitmqctl add_user student student
设置权限
rabbitmqctl set_user_tags student administrator
#重启服务
systemctl restart rabbitmq-server
7.RabbitMQ管理命令行
RabbitMQ管理命令
# 1.服务启动相关
systemctl start|restart|stop|status rabbitmq-server
# 2.管理命令行 用来在不使用web管理界面情况下命令操作RabbitMQ
rabbitmqctl help 可以查看更多命令
# 3.插件管理命令行
rabbitmq-plugins enable|list|disable
查看当前用户及权限
rabbitmqctl list_users;
插件管理命令行
rabbitmq-plugins
列出rabbitmq的所有插件
rabbitmq-plugins list
8.web管理页面介绍
主页概览
- connections:无论生产者还是消费者,都需要与RabbitMQ建立连接后才可以完成消息的生产和消费,在这里可以查看连接情况
- channels:通道,建立连接后,会形成通道,消息的投递获取依赖通道。 Exchanges:交换机,用来实现消息的路由
- Queues:队列,即消息队列,消息存放在队列中,等待消费,消费后被移除队列。
添加用户
上面的Tags选项,其实是指定用户的角色,可选的有以下几个:
- 超级管理员(administrator) 可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
- 监控者(monitoring) 可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
- 策略制定者(policymaker) 可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。
- 普通管理者(management) 仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
- 其他 无法登陆管理控制台,通常就是普通的生产者和消费者。