一、什么是中间件
中间件(Middleware)是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是一组中间件集成在一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必须要有一个通信中间件,即中间件=平台+通信,这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支撑软件和实用软件区分开来。
中间件处于操作系统软件与用户的应用软件的中间。
消息队列
中间件= 平台 + 通信
中间件都要遵从底层协议或自定义的协议:TCP/IP协议、UDP协议进行通讯
就比如说:
MySQL也是中间件:
你的应用程序不管是用什么语言写的(java、PHP、Go、C++)都可以使用TCP/IP协议与MySQL进行通讯,而MySQL通过与磁盘通讯,把数据写进磁盘进行持久化。
另外像:nginx、redis、MQ都是中间件
二、为什么需要使用消息中间件
具体地说,中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担。中间件带给应用系统的,不只是开发的简便、开发周期的缩短,也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。
三、中间件特点
为解决分布异构问题,人们提出了中间件(middleware)的概念。中间件是位于平台(硬件和操作系统)和应用之间的通用服务,如下图所示,这些服务具有标准的程序接口和协议。针对不同的操作系统和硬件平台,它们可以有符合接口和协议规范的多种实现。
也许很难给中间件一个严格的定义,但中间件应具有如下的一些特点:
(1)满足大量应用的需要
(2)运行于多种硬件和OS平台
(3)支持分布计算,提供跨网络、硬件和OS平台的透明性的应用或服务的交互
(4)支持标准的协议
(5)支持标准的接口
对于应用软件开发,中间件远比操作系统和网络服务更为重要,中间件提供的程序接口定义了一个相对稳定的高层应用环境,不管底层的计算机硬件和系统软件怎样更新换代,只要将中间件升级更新,并保持中间件对外的接口定义不变,应用软件几乎不需任何修改,从而保护了企业在应用软件开发和维护中的重大投资。
只有当程序达到不小的规模,体量时,才建议使用单体架构和中间件;
访问量不大,本来是很小的应用用到这些复杂的技术,反而是一种拖累
四、中间件分类
分布式消息中间件
1、ActiveMQ:传统的消息队列,使用Java语言编写。基于JMS(Java Message Service),采用多线程并发,资源消耗比较大。支持P2P和发布订阅两种模式,如果使用java语言开发项目,可以考虑使用activeMQ。
2、RabbitMQ:基于AMQP协议实现,支持多种场景,社区活跃量大,。高性能,高可用,支持海量数据。
rabbitmq在金融场景中经常使用,具有较高的严谨性,数据丢失的可能性更小,同时具备更高的实时性;
使用的人更多,滴滴、美团用的都是RabbitMQ;而且RabbitMQ和spring是一个公司的,所以在springboot中有很好的支持,比较完善
3、kafka:基于二进制传输,更接近底层,是这几款性能最高的,不支持事务但是支持持久化和分发机制。
kafka优势主要体现在吞吐量上,虽然可以通过策略实现数据不丢失,但从严谨性角度来讲,大不如rabbitmq;而且由于kafka保证每条消息最少送达一次,有较小的概率会出现数据重复发送的情况;
4、RocketMQ:是阿里巴巴研发的一款纯Java开发的分布式、高性能、高可靠、高实时的国产消息中间件,已托管给apache基金管理
AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计,底层依然是TCP/IP通信协议,是因为TCP/IP协议这些协议无法满足我们的需要,所以在TCP/IP协议之上又加一层,构建出一套协议
负载均衡中间件
Nginx:是一个高性能的HTTP和反向代理web服务器
LVS负载均衡:Linux Virtual Server,即Linux虚拟服务器;LVS主要用于多服务器的负载均衡。它工作在传输层,可以实现高性能,高可用的服务器集群技术。
keepAlive:不指某个中间件,是一种心跳监测的技术,维持高可用
CDN:表示加速,提升网站的访问速度,显示速度; 采用流媒体服务器集群技术,克服单机系统输出带宽及并发能力不足的缺点,可极大提升系统支持的并发流数目,减少或避免单点失效带来的不良影响。
缓存中间件
Memcache:代码级别,把数据缓存写在内存里,会占用jvm的内存,在小项目里面可以使用;
redis:远程字典服务,支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Memcache和redis也都是遵从TCP/IP协议
数据库中间件
Mycat:是一个彻底开源的,面向企业应用开发的 “大数据库集群” ,可以替代 Mysql 的加强版数据库,一个可以视为 “Mysql” 集群的企业级数据库
ShadingJDBC :定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
适用于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使用 JDBC;已加入apache基金管理
主要用来做分库分表
中间件技术一般应用在分布式系统中,分布式系统首要面临的问题就是沟通、通信的问题,这时候中间件技术就很值得我们去研究学习了