Expand description
§插件
插件是网关实现功能扩展的核心组件。插件目前仅支持使用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> {
//println!("run demo plugin, context: {:?}", context);
//println!("config: {:?}", config);
Ok(Default::default())
}
}
// 导出插件
export!(DemoPlugin);§插件仓库
https://github.com/xgpxg/aiway-plugins
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.