Expand description
§插件
§基本准则
- 插件是网关实现业务逻辑的核心组件,应提供良好的设计,且不应该频繁变更定义。
- 插件与网关之间通过可序列化的数据通信。
- 插件模块仅提供插件定义、加载、及执行,不应提供插件注册、卸载等管理功能,这些功能交给网关自身实现。
§插件分类
§全局插件
全局插件对整个网关的所有请求生效(不含控制台请求,因为控制台是独立的)。
全局插件分两个阶段执行:
- 请求阶段:在请求到达API处理端点前执行,可对请求改写、安全验证、限流、缓存等。
- 响应阶段:在API处理完成,响应客户端前执行,可修改响应、记录日志等。该阶段的插件可通过参数控制当前一个插件中断时,是否仍然执行。
各阶段的插件按配置的顺序依次执行,可被中断。
中断处理:
- 请求阶段中断:转发到特殊的API端点,执行响应,此时,后置阶段的插件仍会执行
- 响应阶段中断:返回错误响应。由于日志拦截是在最后一步执行,所以,返回错误响应后,日志仍然能被记录。
§路由插件
对特定路由生效。
路由插件和全局插件实现方式相同,仅执行时机不同。
§使用方式
// 示例插件
use plugin::plugin_version;
pub struct DemoPlugin;
impl DemoPlugin {
pub fn new() -> Self {
Self {}
}
}
#[async_trait]
impl Plugin for DemoPlugin {
fn name(&self) -> &'static str {
"demo"
}
fn info(&self) -> PluginInfo {
PluginInfo {
version: plugin_version!(),
default_config: Default::default(),
description: "Demo Plugin".to_string(),
}
}
// 实现插件逻辑
async fn execute(&self, context: &HttpContext, config: &Value) -> Result<(), PluginError> {
println!("run demo plugin, context: {:?}", context);
Ok(())
}
}
// 导出插件
export!(DemoPlugin);Re-exports§
pub use aiway_protocol as protocol;pub use serde_json;
Macros§
Structs§
- Network
Plugin - 从指定的URL加载插件
- Plugin
Info - 插件信息
- Plugin
Manager - Version
- SemVer version as defined by https://semver.org.