aiway-plugin 0.1.0

The aiway plugin lib
Documentation

插件

基本准则

  • 插件是网关实现业务逻辑的核心组件,应提供良好的设计,且不应该频繁变更定义。
  • 插件与网关之间通过可序列化的数据通信。
  • 插件模块仅提供插件定义、加载、及执行,不应提供插件注册、卸载等管理功能,这些功能交给网关自身实现。

插件分类

全局插件

全局插件对整个网关的所有请求生效(不含控制台请求,因为控制台是独立的)。

全局插件分两个阶段执行:

  • 请求阶段:在请求到达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);