介绍
中间件 = 介于「应用程序」和「底层系统/硬件/其他服务」之间的一层通用软件
它本身不直接给用户提供业务功能,只负责搭桥、通用能力封装,解决不同程序、不同机器、不同语言之间通信、数据传输、资源调度的麻烦。
一句话理解
中间件是 独立服务,不面向终端用户,专门为 业务应用 提供通用底层支撑能力。
类比
电脑上的显卡驱动、声卡驱动就是最简单的中间件:游戏(上层应用)不用直接跟显卡硬件打交道,靠驱动中转。
作用
解耦
业务代码不用写复杂底层逻辑,不用关心数据库、网络、操作系统细节;换数据库/服务器不用大面积改业务代码。标准化通信
Java、Python、Go写的服务能互相调用,跨机房、跨服务器传输数据。提供通用基础能力
消息队列、缓存、分布式事务、远程调用、文件存储、网关等重复功能统一实现,不用每个项目重复造轮子。屏蔽底层差异
不管是Windows、Linux,MySQL、Oracle,本地服务还是云服务,中间件统一接口。
常见分类
1. 消息中间件(消息队列)
负责异步收发消息,削峰填谷、系统解耦
- RabbitMQ、Kafka、RocketMQ、ActiveMQ
场景:下单后异步发短信、日志收集、订单延时取消
2. 缓存中间件
高速内存存储,加速读写,减轻数据库压力
- Redis、Memcached
3. 远程调用中间件(RPC)
不同服务之间快速调用,替代HTTP,高性能
- Dubbo、gRPC、Spring Cloud Feign
4. 数据库中间件
分库分表、读写分离,统一管理多数据库
- MyCat、Sharding-JDBC
5. API网关中间件
统一入口,路由、鉴权、限流、日志
- Nginx、Gateway、Zuul
6. 事务中间件(分布式事务)
保证跨多服务、多数据库的数据一致性
- Seata
7. 应用服务器中间件(传统中间件)
早年Java Web容器,运行Web项目
- Tomcat、Jetty、JBoss、WebLogic
例子
电商下单流程:
前端页面 → 网关(Nginx) → 业务服务(SpringBoot) →
- 查商品库存:Redis缓存中间件
- 扣减订单:MySQL + Sharding-JDBC分库中间件
- 发通知、物流:Kafka消息中间件
- 微服务互相调用:Dubbo RPC中间件
网关、缓存、MQ、RPC全都是中间件,业务代码只写“下单逻辑”,网络、存储、通信全部交给中间件处理。
容易混淆概念
- 操作系统:最底层,管理硬件;中间件跑在OS之上
- 中间件:基础通用支撑软件,无业务逻辑
- 业务系统/应用:面向用户的功能(商城、OA、ERP),跑在中间件之上