插件
插件是网关实现功能扩展的核心组件。插件目前仅支持使用Rust开发,并导出为.so格式的动态库给网关使用。
插件分类
按照插件的执行范围,可以分为全局插件和路由插件。
全局插件
全局插件对整个网关的所有请求生效(不含控制台请求,因为控制台是独立的)。
执行阶段:
- 请求阶段:在请求到达API处理端点前执行,可对请求改写、安全验证、限流、缓存等。
- 响应阶段:在API处理完成,响应客户端前执行,可修改响应、记录日志等。
路由插件
对特定路由生效。
路由插件和全局插件实现方式相同,仅执行时机不同。
执行阶段:
- 请求阶段:在全局插件执行后,到达API处理端点前执行。
- 响应阶段:在API处理完成,全局插件执行前执行。
注意:全局插件的优先级高于路由插件。
错误处理
插件执行时可能发生错误,当某个插件返回Err时,插件执行流程会中断,整个请求将失败,网关将返回502错误码。
使用方式
use aiway_plugin::protocol::gateway::HttpContext;
use aiway_plugin::serde_json::Value;
use aiway_plugin::{Plugin, PluginError, PluginInfo, Version, async_trait, export, 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<Value, PluginError> {
Ok(Default::default())
}
}
export!(DemoPlugin);
插件仓库
https://github.com/xgpxg/aiway-plugins