如何在 actix-web 服务器中共享 reqwest 客户端?

How to share reqwest clients in actix-web server?

我正在使用 actix-web 构建 Web 服务器,其中一种方法使用 reqwest 向外部发出 HTTP 请求 API:

#[get("/foo")]
async fn foo() -> impl Responder {
  let resp = reqwest::get("https://externalapi.com/bar").await?; # GET request inside server
  ...
}

为了提高性能,我想重用reqwest的客户端,因为它持有一个连接池,根据the doc。 但是,我无法使用Arc来共享客户端,因为文档中也有如下声明:

You do not have to wrap the Client in an Rc or Arc to reuse it, because it already uses an Arc internally.

如何在函数调用之间共享客户端? 或者,我应该使用不同的库在 Web 服务器中创建 HTTP 请求吗?

实际上documentation中的建议是解决方案:

You do not have to wrap the Client in an Rc or Arc to reuse it, because it already uses an Arc internally.

只是clone客户。

请检查 source 中的 Client 定义:

#[derive(Clone)]
pub struct Client {
    inner: Arc<ClientRef>,
}

您可以将Client视为参考持有人

内部类型 (ClientRef) 已经用 Arc 包装,如文档所述, ClientClone 实现,因为除了 [= 没有其他字段18=],与自己用 Arc 包装客户端相比,克隆客户端不会造成任何运行时开销。

此外 Client 实现了 Send 这意味着可以跨线程发送客户端的克隆,因为 Client 上没有明确的可变操作,因此不需要 Mutex在这里。 (我说明确是因为可能存在内部可变性)