1 个不稳定发布
0.2.0-alpha.1 | 2024 年 5 月 21 日 |
---|
#2184 in 网页编程
在 2 个 crates 中使用 (通过 spacegate-shell)
230KB
4K SLoC
预览版本,将不会保证 API 的稳定性!请勿在生产环境中使用!
一个以库为先、轻量级、高性能、云原生支持的 API 网关🪐
SpaceGate("Spacegates 是悬挂在太空中的星际之门,或在行星轨道上") 来自 "星际之门"。
💖 核心功能
- 小巧:基于 rust,可执行文件仅占用 6MB。
- 云原生:实现了 Kubernetes Gateway API 规范。
- 易于扩展:只需两个函数即可用 rust 构建自己的插件。
- 易于扩展:只需两个函数即可用 rust 构建自己的插件。
- 高性能
- 低资源消耗
使用方法
在 k8s 中使用 spacegate
为 kubernetes 安装
kubectl apply -f https://github.com/ideal-world/spacegate/releases/download/0.2.0-alpha.1/spacegate-0.2.0-alpha.1.yaml
打开 spacegate 管理员网页,享受吧!
将 spacegate 作为可执行二进制文件使用
构建和安装
在自己的 Linux 机器上构建和安装。
安装 spacegate
sh resource/install/install.sh
安装 spacegate-admin 管理工具(可选)
这个官方管理工具将提供一个网页界面来编辑网关的配置。
sh resource/install/install-admin.sh
配置您的网关
如果安装了 spacegate-admin 管理工具,请访问 localhost:9991。
firefox localhost:9991
或访问配置文件夹
ls /etc/spacegate
编辑配置后,使用 systemctl 重新加载配置。
sudo systemctl reload spacegate
安装插件
检查插件文件夹
ls /lib/spacegate/plugins
只需将 .so
文件放在插件文件夹下并配置它。
将 spacegate 作为 rust 库使用
您可以使用 spacegate-kernel
或 spacegate-shell
。前者相对较低级,而后者集成了插件和配置系统。
使用 spacegate-shell
spacegate-shell = { git="https://github.com/ideal-world/spacegate", branch="dev" }
通过配置更改监听器启动
async fn main() {
let listener = todo!("create a listener!");
spacegate_shell::startup(listener).await;
}
或直接使用内置监听器
// file config
spacegate_shell::startup_file("/etc/spacegate").await;
// k8s resource
spacegate_shell::startup_k8s(Some("spacegate-namespace")).await;
// fetch from redis
spacegate_shell::startup_redis("redis://my-redis").await;
使用 spacegate-kernel
spacegate-kernel = { git="https://github.com/ideal-world/spacegate", branch="dev" }
创建监听器和网关服务
let cancel = CancellationToken::default();
// create a gateway service
let gateway = gateway::Gateway::builder("test_gateway")
.http_routers([(
"test_gateway".to_string(),
HttpRoute::builder()
.rule(
HttpRouteRule::builder()
.match_item(HttpPathMatchRewrite::prefix("/baidu"))
.backend(HttpBackend::builder().schema("https").host("www.baidu.com").port(443).build())
.build(),
)
.build(),
)])
.build();
let addr = SocketAddr::from_str("[::]:9002")?;
// create a listener
let listener = SgListen::new(
addr,
gateway.as_service(),
cancel.child_token(),
);
// start listen
listener.listen().await?;
在 rust 中创建自己的插件
您只需实现一个 Plugin
特性。
use spacegate_plugin::{SgResponse, SgRequest, Inner, BoxError, PluginConfig, Plugin};
pub struct ServerHeaderPlugin {
header_value: String,
}
impl Plugin for ServerHeaderPlugin {
// an unique code for this plugin
const CODE: &'static str = "server-header";
// this will be called when request passthrough this plugin
async fn call(&self, req: SgRequest, inner: Inner) -> Result<SgResponse, BoxError> {
// pre-request process
// call inner to pass this request into inner layers
let mut resp = inner.call(req).await;
// post-request process
resp.headers_mut().insert("server", self.header_value.parse()?);
// return the result
Ok(resp)
}
// create a plugin instance from config
fn create(plugin_config: PluginConfig) -> Result<Self, BoxError> {
let Some(header_value) = plugin_config.spec.get("header_value") else {
return Err("missing header_value".into())
};
Ok(Self {
header_value: header_value.as_str().unwrap_or("spacegate").to_string(),
})
}
}
将插件作为静态库使用。
在您的应用程序程序中。
// register the plugin into global plugin repository
spacegate_plugin::PluginRepository::global().register::<ServerHeaderPlugin>()
将插件作为动态链接库使用。
使用宏 dynamic_lib
use spacegate_plugin::dynamic_lib;
dynamic_lib! { ServerHeaderPlugin }
并将 crate 类型设置为 dylib
[lib]
crate-type = ["dylib"]
获取库文件后,将其加载到应用程序程序中。
例如
spacegate_plugin::PluginRepository::global().register_dylib("/lib/spacegate/plugins/mylib.so")
为什么创建这个项目
目前有很多 API 网关产品,但它们大多以独立服务的形式存在。自定义能力相对较弱,使用和部署的成本相对较高。
本项目基于 Rust
语言,并使用 hyper
作为基础网络库。目标是:提供一个以库优先、轻量级、高性能、云原生支持的 API 网关。
📦 组件
项目结构
🔖 版本发布
二进制版本命名方法:{crate}-{arch}{OS}{abi}-{version} 在此下载
操作系统 | 架构 | abi | 备注 |
---|---|---|---|
linux | x86_64,aarch64 | gnu,musl | 如需静态链接,请使用 musl |
依赖
~12–38MB
~569K SLoC