Rust 在不同端口上运行多个actix应用程序

Rust 在不同端口上运行多个actix应用程序,rust,rust-actix,actix-web,Rust,Rust Actix,Actix Web,我正在尝试运行两个应用程序(一个用于管理端口3006,另一个用于服务端口8080上的数据)。 他们共享数据库池、缓存 对于actix 1.0,我有这样的工作方式(我不知道这是否是最好的方式): let server=server::build() //第一个应用程序 .bind(“,”0.0.0.0:3006“,移动| |{ HttpService::build().finish({ App::new() .wrap(actix_记录器::新建( “WMTS%a%r%s%b%{Referer}i

我正在尝试运行两个应用程序(一个用于管理端口3006,另一个用于服务端口8080上的数据)。
他们共享数据库池、缓存

对于actix 1.0,我有这样的工作方式(我不知道这是否是最好的方式):

let server=server::build()
//第一个应用程序
.bind(“,”0.0.0.0:3006“,移动| |{
HttpService::build().finish({
App::new()
.wrap(actix_记录器::新建(
“WMTS%a%r%s%b%{Referer}i%{User Agent}i%T”,
))
.data(pool.clone())
.data(cache.clone())
.服务(
web::scope(“/utils”)
.路线(
“一个”,
web::get().to(api::one),
)
.route(“两个”,web::get().to(api::两个))
)
.服务(
web::范围(“/data”)
.route(“get_data”,web::get().to(api::get_data)),
)
})
})
.unwrap()
//第二个应用程序
.bind(“,”0.0.0.0:8080“,移动| |{
HttpService::build().finish(
App::new()
.wrap(actix_记录器::新建(
“API%a%r%s%b%{Referer}i%{User Agent}i%T”,
))
.data(pool.clone())
.data(cache.clone())
.service(web::resource(“/graphql”).route(web::post().to(api::graphql)))
.service(web::resource(“/health”).route(web::get().to(api::health)))
.service(web::resource(“/metrics”).route(web::get().to(api::metrics)),
)
})
.unwrap();
server.run()?;

但是如何使它与actix 2.0一起工作呢?

actix web
自己的API而言,
1.0
2.0
之间确实没有太大变化。这是一件好事,因为您仍然可以使用熟悉的API来配置路由、应用程序数据、记录器等

改变的一件事是,
actixweb
已移动到async/await。您的应用程序也需要适应它:

//# actix-rt = "1.0"
//# actix-web = "2.0"
//# futures = "0.3"
use actix_web::{web, App, HttpServer, Responder};
use futures::future;

async fn utils_one() -> impl Responder {
    "Utils one reached\n"
}

async fn health() -> impl Responder {
    "All good\n"
}

#[actix_rt::main]
async fn main() -> std::io::Result<()> {
    let s1 = HttpServer::new(move || {
            App::new().service(web::scope("/utils").route("/one", web::get().to(utils_one)))
        })
        .bind("0.0.0.0:3006")?
        .run();
    let s2 = HttpServer::new(move || {
            App::new().service(web::resource("/health").route(web::get().to(health)))
        })
        .bind("0.0.0.0:8080")?
        .run();
    future::try_join(s1, s2).await?;

    Ok(())
}

令人惊叹的!非常感谢。我对新的async await版本还不太熟悉。您知道如何在将来更改
HttpServer
的错误类型吗?我想把它映射到
反正::Error
,因为我还需要加入另一个不会返回
std::io::Error
$ curl http://127.0.0.1:3006/utils/one
Utils one reached
$ curl http://127.0.0.1:8080/health
All good