架构-软件架构
Wiki: An architecture pattern is a general,reusable solution to a commonly occurring problem in software architecture within a given context.
Pipe-Filter
Pipe-Filter模式, 即管道过滤器. 经典的架构模式. 这种模式类似于工业生产流水线. 把过程进行拆分, 每个环节处理完成后通过传送带传送到下一个环节的设备. 如果某个环节出问题了, 最后的产物就会有问题.
适用场景
在Web框架设计中, 例如Koa的洋葱模型本质上就是参照Pipe-Filter模式设计的. 在软件研发领域, Web系统可能是最常见的一类系统了. 以一个网络请求为例:

其中任意环节出现问题都会导致最后的请求失败.
在实际的系统中, 则并不会把这些功能都整合到一个系统中, 一般都会拆分成多个系统. 每个系统都只负责其中一个或几个功能模块, 例如上图中的安全校验.
Filter+组合模式
23中设计模式中有一种经典的设计模式叫做组合模式. Pipe-Filter遇到组合模式时, 多个Filter可以组成一个新的Filter保持一致. 组合出来的Filter与第一个Filter保持一致, 返回的数据与最有一个Filter保持一致, 就可以将多个简单的Filter组合成一个更复杂的Filter.
Serverless / FaaS
Serverless架构即指无服务架构, 可一件显著降低企业中的中长尾应用的成本(中长尾应用: 每天大部分时间都没有流量或者有很少流量的应用). 要实现这样的无服务架构, FaaS是一个非常核心的组件. FaaS是Function as a Service的简称, FaaS其中有一个核心组件叫Fn Actuator, 负责Fn函数的加载, 调度, 执行.
微内核架构系统
微内核架构(Microkernel Architecture), 也被称为插件化架构(Plugin-in Architecture), 是一种面向功能进行拆分的可扩展架构. 例如VS Code,Eclipse这一类的IDE软件, UNIX操作系统等, 都是参照微内核架构进行设计实现的.
微内核架构的两个核心组件
微内核包含两类核心组件: 核心系统(Core System)和插件模块(Plugin-in modules). 核心系统负责与具体功能无关的通用功能, 例如应用生命周期的管理, 插件模块的管理(包含插件模块的注册, 载入, 卸载等等); 插件模块负责实现具体的功能, 例如一个web框架可能会拆分成: 路由模块, 安全模块, HTTP编解码模块等等, 每个模块都通过插件实现, 每一个插件都只做一件事情.
微内核基本架构如下:

其中核心系统功能尽量保持文档, 不要应为插件模块的扩展而不断修改, 插件模块可以根据功能需求进行不断的扩展.
核心系统设计的关键点
插件管理
- 插件的安装
- 插件的启用
- 插件的通行
- 插件的禁用
- 插件的卸载
应用管理
不论是开发一个客户端的APP软件, 还是一个服务端的Web系统, 在启动的使用, 都会有一个主进程. 一般来说, 主进程设计比较轻量. 早起的浏览器都是单进程的, 一个插件崩溃会导致整个浏览器的崩溃. 现在的浏览器已经改变了这种设计. 比如Chrome就会将进程拆分为Browser Process, Render Process, GPU Process, Network Process, Plugin Process五类进程.
核心系统在实现应用管理模块功能的时候, 其实就是主要实现下面两种功能:
- 应用本身的生命周期管理
- 插件生命周期的管理
插件模块设计的关键点
插件的名称, 描述, 版本管理都需要指定规范.
插件的灵活性
插件应该是灵活可插拔的, 插件中的可配置属性需要暴露到外接的使用环境, 实现业务定制.
插件职责单一性
模块拆分不合理会导致系统复杂度上升. 每个插件应该保持职责的单一性.
微内核架构应用实例
- VS Code: 核心是编辑器, 其他功能都是通过一个个插件来扩展的.
- 规则引擎: 执行引擎可以看做是微内核, 执行引擎通过解析, 执行配置规则, 来达到业务的灵活多变.
- Koa Web框架: 框架本身只提供最基础的能力, 其他都是通过中间件来扩展的, 中间件既是一个插件, 也是一个Filter, 可以说是微内核架构与管道架构的完美结合.