中间件(Middleware)是介于操作系统与应用程序之间的一层软件
它为分布式应用程序提供了统一的通信、数据交换、服务调用、消息传递等能力。
它的作用就像“胶水”,连接各个系统组件。
文章目录
- 消息队列
- 缓存中间件
- 数据库中间件
- 服务注册与发现
- Web 中间件
- RPC 中间件
消息队列
Message Queue Middleware
消息队列是 现代分布式系统中的关键组件,用来解耦、削峰、异步处理和提高系统可扩展性。
消息队列是一种异步通信机制:发送方(Producer)把消息放到队列里,接收方(Consumer)从队列中取消息。中间的“队列”就是中间件的作用。
功能:
- 解耦:它让两个系统模块不必同时在线,发送者发送完就走,消费者有空再处理。
- 削峰填谷:在高并发场景下,队列能缓冲瞬间大量请求,防止系统崩溃。
- 异步处理
- 广播/订阅:一个消息可以被多个消费者订阅,比如用户注册成功后,分别发送欢迎邮件、创建用户初始配置等。
中间件 | 特点 | 应用场景 |
---|---|---|
RabbitMQ | 基于 Erlang,支持 AMQP 协议,功能丰富,支持事务、插件机制强 | 金融、电商、任务调度 |
Kafka | 高吞吐量、分布式、持久化强、偏向日志收集/流处理 | 日志收集、用户行为追踪、监控 |
RocketMQ | 阿里开源,Java 编写,事务消息支持好,性能优秀 | 国内互联网、电商场景多见 |
ActiveMQ | Java 实现,老牌 MQ,支持多协议 | 轻量级系统、企业系统 |
Redis Stream | Redis 5.0 引入,轻量级流处理方案 | 简单任务队列、轻量异步处理 |
缓存中间件
缓存中间件是 高性能系统架构中不可或缺的一环,主要用于提高访问速度、减轻数据库压力、提升系统吞吐量。
缓存中间件是一个用于快速访问热点数据的中间层系统,通常存储在内存中。相较于数据库的磁盘访问,缓存是读写速度非常快的内存访问。
典型的缓存数据如:用户会话信息、验证码、热点新闻、商品信息等。
功能:
- 加速读请求:比如一个商品详情页面,每次都查数据库会慢;缓存可以毫秒级响应。
- 降低数据库压力:热门数据可以从缓存中直接获取,极大减少数据库访问量。
- 数据预加载:可以在系统启动或访问前,提前将数据加载进缓存。
- 分布式共享数据:缓存可以部署为集群,多个服务共享缓存数据。
中间件 | 特点 | 应用场景 |
---|---|---|
Redis | 单线程、支持多种数据结构、持久化、高可用集群、Lua脚本 | 分布式缓存、排行榜、计数器、会话存储 |
Memcached | 简单、纯内存、支持 key-value、无持久化 | 临时缓存、对象缓存 |
Ehcache | 嵌入式缓存、Java 集成方便 | 单机应用、JVM 内部缓存 |
Guava Cache | Google 的本地缓存库,轻量级 | 本地缓存、小规模系统 |
常见术语:
缓存穿透:不存在
缓存击穿:刚好过期
缓存雪崩:大量同时过期
Redis 的典型使用场景:
登录状态 Session 管理,商品详情缓存,秒杀库存控制,排行榜,延迟任务
数据库中间件
数据库中间件:解决数据库在大规模系统中遇到的性能瓶颈、扩展性问题以及高可用等需求。
功能:
- 分库分表(水平拆分)【数据库分片】:将大表根据特定规则(如 id 取模)拆分为多个小表或分到不同数据库节点上。
- 读写分离(主从架构):写操作走主库,读操作走从库,提高并发能力。
- 数据库路由
- SQL解析与重写: 自动拼接分页、聚合等操作
- 事务协调(跨库事务): 支持 分布式事务协议(如 XA、TCC、SAGA),保证事务一致性。
中间件 | 特点 | 适用场景 |
---|---|---|
ShardingSphere | Apache 顶级项目,功能最强,支持分布式事务、弹性扩容、SQL重写 | 复杂系统,数据库中间层统一解决方案 |
MyCat | 国内常用,基于 Cobar,配置文件驱动,易部署 | 中小型系统、轻量分库分表 |
TDDL(淘宝) | 阿里早期内部使用,支撑双十一高并发场景 | 电商平台、分布式大数据系统 |
Vitess | YouTube 开源,支持海量分库分表和水平扩展 | 高可用、大规模数据库服务 |
OceanBase | 蚂蚁集团自研,融合关系型数据库与分布式能力 | 金融级数据库、强一致需求场景 |
好处:
- 横向扩展能力强:突破单库容量限制
- 容灾能力增强:支持主从切换、高可用架构
- 透明接入:应用层无需修改大量代码
- 灵活路由:根据配置灵活选择数据节点
服务注册与发现
Service Registry & Discovery
服务注册与发现 主要用于解决“服务实例动态变化”带来的访问问题
在微服务架构下,一个系统通常由多个小服务组成,服务实例可能频繁上线、下线、扩容或重启,因此不能像单体应用那样写死 IP 和端口。
于是,我们需要一个“服务注册中心”来动态记录每个服务的地址信息。其它服务通过“服务发现”找到它们要调用的服务。
流程:
服务提供者(Service A)启动 -> 向注册中心注册自己的信息服务消费者(Service B) -> 从注册中心拉取/订阅服务列表 -> 根据负载均衡策略选择一个实例调用
中间件 | 特点 | 适用场景 |
---|---|---|
Eureka | Netflix 开源,经典 Java 生态,适合 Spring Cloud,支持自我保护机制 | 中小型微服务架构 |
Nacos | 阿里巴巴开源,支持服务注册/发现 + 配置中心,易集成 Dubbo/Spring Cloud | 国内主流项目 |
Consul | HashiCorp 开源,支持健康检查、KV存储、DNS 发现、跨语言支持好 | 跨语言服务体系 |
Zookeeper | 强一致性,CAP 中偏 CP,Apache 项目,广泛用于 Dubbo、Kafka | 需要严格一致性的系统 |
Etcd | CoreOS 开源,Kubernetes 的底层组件,支持高并发、强一致 | Kubernetes 原生注册系统 |
Web 中间件
Web 中间件 要用于连接前端请求和后端服务,提供多种通用功能。
类别 | 代表产品 | 功能 |
---|---|---|
反向代理 | Nginx、Apache HTTPD | 负载均衡、SSL 终止、静态资源、请求转发 |
API 网关 | Kong、APISIX、Zuul、Spring Cloud Gateway | 路由、认证、限流、服务聚合、跨域处理 |
Web 框架中间件 | Express.js 中间件、Django Middleware、Flask Middleware | 权限、日志、跨域、参数处理 |
服务网格数据面 | Envoy、Linkerd | 服务之间通信控制,透明代理 |
静态资源中间件 | CDN、Nginx、Varnish | 缓存、就近访问、内容分发 |
应用服务器 | Tomcat、Jetty | HTTP 服务、Servlet 容器、JSP 解析 |
网络通信框架 | Netty | 高性能网络通信、异步事件驱动 |
RPC 中间件
Remote Procedure Call,远程过程调用
是一种通过网络请求调用远程服务器上的函数或方法的技术,它隐藏了底层的网络通信细节,让开发者像调用本地方法一样调用远程方法【Feign】。
简化了分布式系统的构建。
名称 | 特点 | 使用场景 |
---|---|---|
gRPC | 基于 Google 的 Protocol Buffers(Protobuf),支持高效的二进制序列化,内建支持负载均衡、认证、追踪等 | 高性能、高并发的微服务架构 |
Dubbo | Apache 提供,支持多种协议和序列化方式,具有服务治理和负载均衡功能 | 大规模分布式系统,企业级服务框架 |
Thrift | 由 Facebook 开发,支持多种编程语言,灵活的跨语言调用,支持多种协议和传输层 | 跨语言应用,性能要求高的场景 |
Hessian | 轻量级、快速的二进制协议,适合大规模分布式系统 | 高效的分布式服务调用 |
RMI | Java 提供的 RPC 机制,适用于 Java 环境中远程方法调用 | Java 环境内的服务调用 |
Zookeeper | 分布式协调服务,常用于服务注册、配置管理等,支持高可用性 | 服务发现、配置管理 |
Consul | 提供服务发现、健康检查和键值存储,适用于微服务架构 | 微服务架构中的服务注册和发现 |
Restful API | 基于 HTTP 协议的简单、易用的远程调用机制 | 简单的 Web 服务和 RESTful 接口 |