计算机软件-术语-什么叫中间件
目的
辨析基础概念,正确理解技术本质
背景
1、技术圈概念浩繁,且大家对相同的概念往往理解不一,导致沟通不畅。如之前工作中,同事说微服务也是一种中间件,我说它是框架,使用它可能需要用到中间件,然后就被各种嘲讽。虽然事后证明我说的是对的,但被嘲讽期间的自我怀疑,也反映出自己对中间件这个概念的理解并不到位
技术圈争吵是一种有益现象,这使得理越辩越明,让个人快速成长(跟层次太低的人争吵除外)。期间的个人情绪,都是很次要的事情
2、最近在学习LangChain,它的重要组件之一就是中间件,但和传统软件领域的中间件概念又似乎不同,需要辨析清楚
内容
中间件的官方定义
-
1、GB/T 33847-2017 《信息技术 中间件术语》中,对中间件的定义原文:位于系统软件之上,用于支持分布式应用软件,连接不同软件实体的支撑软件
-
2、该定义相对抽象,官方给出了具体的示例:

中间件到底在什么中间?
这是产生疑惑的根源,中间件的“件”字,可以理解为组件(一个软件应用、一个代码模块等)。但“中间”二字是必须依靠“两边”来理解的,所以必须厘清:
1、左右两边是什么组件
2、是什么标准,区分某个组件是中间件而不是左右两边的组件。
先直接说答案:
1、左右两边是什么组件
左、中、右,一定是相同层级的组件(如都是应用级或者都是模块级),具体左右两边是什么,要具体问题具体分析,但总结来讲,不外以下四点:
| 中间件所处位置 | 左右两边 |
|---|---|
| 层级之间 | 如左边是应用层,右边是基础设施层 |
| 流程之间 | 如左边是用户请求,右边是业务处理逻辑 |
| 系统之间 | 如左边是A业务系统,右边是B业务系统 |
| 时间之间 | 如左边是智能体调用前的时刻,右边是智能体执行调用的时刻 |
示例
| 类型 | 介于什么之间 | 做什么 |
|---|---|---|
| Web中间件 | HTTP请求 ↔ 业务逻辑 | 鉴权、日志、解析 |
| 消息中间件 | 生产者 ↔ 消费者 | 解耦、缓冲、路由 |
| 数据库中间件 | 应用 ↔ 数据库 | 分库分表、读写分离 |
| RPC框架 | 调用方 ↔ 服务提供方 | 服务发现、负载均衡 |
| 事务中间件 | 多个数据库/服务之间 | 分布式事务协调 |
| API网关 | 客户端 ↔ 微服务集群 | 路由、限流、聚合 |
2、是什么标准,区分某个组件是中间件而不是左右两边的组件
- 中间件位于两个组件中间,因此作为起始和结束端点的组件不是中间件
因此浏览器不是中间件,它往往是作为起始点。数据库不是中间件,它往往是结束点。
如果将Redis作为缓存,它是缓存中间件;如果将Redis作为MQ,它是消息中间件;如果将Redis当作数据库,它就变成了结束点,不再是中间件(因为位置不在中间)
- 中间件是管道工,是软件胶水,本身不生产和处理业务,没有也行,但有了会让业务运转得更好
因此业务应用不是中间件,它承载和处理业务,对业务而言必不可少。
但将业务应用托管起来的Web服务器如Tomcat、Apache、Nginx是中间件,它们左侧连接来自浏览器的用户请求,右侧连接业务应用,本身不生产和处理业务。即使没有Web服务器,业务应用也能通过原生编码的方式实现Web服务器的功能(如编码实现HttpServer、SocketServer)。但有了Web服务器后,性能、稳定性、安全性、可维护性等各方面都有所优化
- 基础设施不是中间件
操作系统、文件系统、网络、数据库、大模型服务,这些都是基础设施,他们不是中间件
但为方便使用基础设施,而加的封装层,是中间件。如数据库中间件是对数据库的封装,AI网关是对大模型服务的封装,他们都是中间件
中间件的作用/特征
1、对左边——提供抽象,隐藏右边复杂性
| 中间件类型 | 对左边隐藏了什么 |
|---|---|
| Web中间件 | 隐藏了请求解析、认证、日志等横切逻辑,左边只管业务 |
| 消息中间件 | 隐藏了网络通信、负载均衡、消息持久化,生产者只管发消息 |
| 数据库中间件 | 隐藏了分库分表、读写分离,应用只管写SQL |
| LangChain中间件 | 隐藏了Token统计、重试逻辑、流式处理,编排逻辑只管调用 |
2、对右边——提供标准接口,解耦左边变化
| 中间件类型 | 对右边隐藏了什么 |
|---|---|
| Web中间件 | 后端应用不关心请求来自Web端还是移动端 |
| 消息中间件 | 消费者不关心生产者是Java还是Python |
| 数据库中间件 | 数据库不关心是哪个应用在查询,也不关心分片策略 |
| LangChain中间件 | LLM API不关心是哪个Agent在调用,也不关心调用频率 |
3、自身——不包含业务逻辑,只处理横切关注点
| 组件类型 | 包含业务逻辑? | 例子 |
|---|---|---|
| 左边组件 | ✅ 包含业务逻辑 | Controller里计算订单金额、Agent里决策调用哪个工具 |
| 中间件 | ❌ 不包含业务逻辑 | 日志记录、认证鉴权、限流、协议转换、消息路由 |
| 右边组件 | ✅ 包含业务逻辑 | 数据库存储数据、LLM生成内容 |
LangChain里的中间件
- LangChain里的中间件,落点在横切关注点上,类似Spring框架中的AOP,或钩子函数,是编码模块级的
- LangChain里的中间件,处于流程之间,位于智能体调用前后、模型调用前后、工具调用前后等,用来处理日志记录、上下文压缩、隐私安全围栏、服务降级等非核心业务逻辑
- 没有这些中间件,LangChain中,也可以通过原生编码的方式,实现这些功能,只是可能不够优雅、安全、稳定、高效、易维护
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)