如何优雅地关闭 warp 服务器?

Dun*_*ger 5 signals shutdown rust warp rust-tokio

我正在用 Rust 编写一个带有扭曲的服务。当服务收到 SIGTERM 信号时,我希望它正常关闭,并可能执行一些日志记录或其他工作。

我尝试了很多例子,但没有任何效果。最有希望的似乎来自这个问题,但我似乎无法让它工作,甚至无法编译。我怀疑自从回答这个问题以来事情已经发生了变化。

# Cargo.toml
[dependencies]
tokio = {version = "1", features = ["full"]}
warp = "0.3"
futures = "0.3"
Run Code Online (Sandbox Code Playgroud)
//! main.rs
use warp::Filter;
use futures;

fn main() {
    let (tx, rx) = tokio::sync::oneshot::channel();
    tokio::run(futures::future::lazy(move || {
        let routes = warp::any().map(|| "Hello, World!");
        let (_, server) = warp::serve(routes)
            .bind_with_graceful_shutdown(([127, 0, 0, 1], 3030), rx);
        warp::spawn(server);
    }));

    println!("Exiting!");
}
Run Code Online (Sandbox Code Playgroud)
//! main.rs
use warp::Filter;
use futures;

fn main() {
    let (tx, rx) = tokio::sync::oneshot::channel();
    tokio::run(futures::future::lazy(move || {
        let routes = warp::any().map(|| "Hello, World!");
        let (_, server) = warp::serve(routes)
            .bind_with_graceful_shutdown(([127, 0, 0, 1], 3030), rx);
        warp::spawn(server);
    }));

    println!("Exiting!");
}
Run Code Online (Sandbox Code Playgroud)

任何建议或更好的更新代码将不胜感激。

S.R*_*S.R 0

这是有效的示例代码。我受到bind_with_graceful_shutdown包装文档的启发

use tokio::sync::oneshot;
use warp::Filter;

#[tokio::main]
async fn main() {
    let routes = warp::any().map(|| "Hello, World!");

    let (tx, rx) = oneshot::channel();

    let (_addr, server) =
        warp::serve(routes).bind_with_graceful_shutdown(([127, 0, 0, 1], 3030), async {
            rx.await.ok();
        });

    // Spawn the server into a runtime
    tokio::task::spawn(server);

    // Later, start the shutdown...
    let _ = tx.send(());
}
Run Code Online (Sandbox Code Playgroud)