#api-gateway #gateway #proxy #websocket #api #kubernates #kubernetes

spacegate-config

一个以库为先、轻量级、高性能、云原生支持的 API 网关

1 个不稳定发布

0.2.0-alpha.12024 年 5 月 21 日

#2184 in 网页编程


2 个 crates 中使用 (通过 spacegate-shell)

MIT/Apache

230KB
4K SLoC

预览版本,将不会保证 API 的稳定性!请勿在生产环境中使用!


一个以库为先、轻量级、高性能、云原生支持的 API 网关🪐


Build Status License

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

manage tool

配置您的网关

如果安装了 spacegate-admin 管理工具,请访问 localhost:9991。

firefox localhost:9991

或访问配置文件夹

ls /etc/spacegate

编辑配置后,使用 systemctl 重新加载配置。

sudo systemctl reload spacegate

安装插件

检查插件文件夹

ls /lib/spacegate/plugins

只需将 .so 文件放在插件文件夹下并配置它。

将 spacegate 作为 rust 库使用

您可以使用 spacegate-kernelspacegate-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 网关

📦 组件

类型 描述
spacegate-kernel Crate Docs rust-lib 创建网关服务的内核功能
spacegate-ext-redis Crate Docs rust-lib Redis 功能扩展
spacegate-ext-axum Crate Docs rust-lib Axum 服务器功能扩展
spacegate-shell Crate Docs rust-lib 包括插件系统、配置监听器和易于使用的程序入口的集成集合。
spacegate-plugin Crate Docs rust-lib spacegate-shell 的插件系统实现
spacegate-model Crate Docs rust-lib spacegate 项目中的常用数据结构。
spacegate-config Crate Docs rust-lib 配置监听器接口和实现。
spacegate bin 基于 spacegate-shell 的开箱即用的可执行文件。
spacegate-admin bin Spacegate 管理应用后端服务。
spacegate-admin-client NPM Version js-lib spacegate-admin 的 JavaScript/TypeScript sdk。
spacegate-admin-fe web Spacegate 管理前端。

项目结构

Crates

🔖 版本发布

二进制版本命名方法:{crate}-{arch}{OS}{abi}-{version} 在此下载

操作系统 架构 abi 备注
linux x86_64aarch64 gnu,musl 如需静态链接,请使用 musl

依赖

~12–38MB
~569K SLoC