我们通过Soul网关插件的执行流程可以发现,soul网关的设计特别像微内核架构中的规则引擎,今天我们就来看看微内核架构,以及Soul里面使用它的影子;
什么是微内核架构?
微内核架构,也被称为插件化架构,是一种面向功能进行拆分的课拓展性架构,在soul网关里面,我们通过实现不同的插件,实现对流量的各种控制。
基本架构
微内核架构包含两类组件:核心系统和插件模块。
- 核心系统:负责和具体业务无关的通用功能,例如模块加载,模块间通信等;对标到soul里面,像selector的选择和rule的匹配就是流量的通用功能;
- 插件模块:负责实现具体的业务逻辑;对应的就是soul-plugin目录下的各种插件的实现;
设计关键点
-
插件管理
核心系统需要知道哪些插件可用,如何加载这些插件,什么时候加载插件。在soul网关里面,我们通过soul-admin项目构建了一个admin的控制台,用来管理各种插件和插件的配置信息;
-
插件连接
插件连接指插件如何连接到核心系统。通常来说,核心系统必须制定插件和核心系统的连接规范,然后插件按照规范实现,核心系统按照规范加载即可。
在soul网关里面,网关在启动的时候就会加载所有插件,用户可以通过配置插件的skip属性来启动和关闭插件功能,并且所有的插件都是绑定在一个插件链上,通过执行这个插件链,流量依次经过这些插件的处理;/** * Delegate to the next {@code WebFilter} in the chain. * * @param exchange the current server exchange * @return {@code Mono<Void>} to indicate when request handling is complete */ @Override public Mono<Void> execute(final ServerWebExchange exchange) { return Mono.defer(() -> { if (this.index < plugins.size()) { SoulPlugin plugin = plugins.get(this.index++); Boolean skip = plugin.skip(exchange); // 通过skip判断是否启动了插件,是否要执行这个插件 if (skip) { return this.execute(exchange); } return plugin.execute(exchange, this); } return Mono.empty(); }); }
-
插件通信
插件通信指插件间的通信。虽然设计的时候插件间是完全解耦的,但实际业务运行过程中,必然会出现某个业务流程需要多个插件协作,这就要求插件进行通信。由于插件之间没有直接联系,通信必须通过核心系统,因此核心系统需要提供插件通信机制。类似于计算机总线的一样。
规则架构引擎解析
特点
- 可拓展性
- 易理解
- 高效率
- 开发人员将业务功能分解提炼为多个规则,将规则保存在规则库中;
- 业务人员根据业务需要,通过规则排列组合,配置成业务流程,保存在业务库中;
- 通过实现各个插件实现对应的业务处理;
- 规则引擎执行业务流程实现业务功能;
- 进入soul网关的流量都会经过SoulWebHandler的处理,并且流向各个选择器和规则,然后再经过不同的插件进行处理;