#axum #service #pattern #framework #web-framework #fig #strangler

axum-strangler

适用于 Axum 网络框架的 Strangler 图形模式实用程序包

10 个不稳定版本 (3 个破坏性更改)

0.4.0 2022 年 12 月 12 日
0.4.0-rc.52022 年 12 月 5 日
0.4.0-rc.32022 年 11 月 27 日
0.3.1 2022 年 11 月 4 日
0.1.0 2022 年 7 月 18 日

#3 in #fig

Download history 5/week @ 2024-03-28 4/week @ 2024-04-04

每月 175 次下载

MIT/Apache

45KB
796

Axum Strangler

Axum 包的实用程序包,允许您轻松使用 Strangler 图形模式,而无需使用某种类型的网关。

包的目标

为了支持以下用例:您想用 Rust 重写服务,但不能一次迁移所有服务的成本。使用 Strangler,您可以将 Rust 化的服务放在要迁移的服务前面,并且默认情况下,几乎所有东西都应该仍然工作。在迁移过程中,您将逐步添加更多逻辑/路由到 Rust 服务,并且那些路由将不会由您正在迁移的服务处理。

示例

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
    // We want to forward requests we don't handle ourselves to localhost:3333
    let strangler_svc = axum_strangler::Strangler::new(
        axum::http::uri::Authority::from_static("127.0.0.1:3333"),
    );

    // Add it as a fallback so everything that isn't covered by routes, get forwarded to the strangled service.
    let router = axum::Router::new()
        .route("/hello",  get(|| async { "Hello, World!" }))
        .fallback_service(strangler_svc);

    axum::Server::bind(&"127.0.0.1:0".parse()?)
        .serve(router.into_make_service())
        .await?;
    Ok(())
}

功能标志

嵌套路由器

如果您在另一个路由器内部使用 axum 路由器 nested,则路由转发将不会按预期工作,因为要转发的路径仅是嵌套路由器中定义的路径部分,而不是整个路径(因此,如果您在 /api 上嵌套路由器,则所有请求都会转发,而没有 /api,只转发它后面的内容)。

要修复此问题,您可以启用功能标志 nested-routers,这将允许它检索 OriginalUri 以正确转发。

https

允许转发到仅接受 HTTPS 流量的其他服务器

let strangler_svc = axum_strangler::Strangler::builder(
    axum::http::uri::Authority::from_static("127.0.0.1:3333"),
).with_http_scheme(axum_strangler::HttpScheme::HTTPS).build();

websocket

允许 Strangler 服务也处理 WebSocket,将请求者的每条消息转发到被 Strangler 服务,反之亦然。

TLS

为了通过 TLS 与 WebSocket 一起工作 (wss://),您需要启用其他功能。您可以选择使用哪个 tokio-tungstenite 依赖项用于 TLS,以下三个功能都映射到该对应的依赖项,但所有三个都启用了 wss:// 协议

  • websocket-native-tls
  • websocket-rustls-tls-native-roots
  • websocket-rustls-tls-webpki-roots

tracing-opentelemetry-text-map-propagation

使Strangler传播跟踪信息到被限制者。这可能有助于收集关于正在发生什么的详细信息。此功能仅在当前跟踪span中存在活动的opentelemetry上下文,并且您已安装opentelemetry::sdk::propagation::TraceContextPropagator作为opentelemetry::global::set_text_map_propagator时才有效。

贡献

除非您明确声明,否则您提交的任何贡献,按照Apache-2.0许可证定义,都应作为上述双重许可,不附加任何额外条款或条件。

依赖关系

~7–20MB
~301K SLoC