首页 > 解决方案 > 如何在 actix-web 服务器中共享 reqwest 客户端?

问题描述

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

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

根据文档,为了提高性能,我想重用 reqwest 的客户端,因为它拥有一个连接池。但是,我不能使用Arc共享客户端,因为文档也有以下声明:

您不必将 Client 包装在 Rc 或 Arc 中即可重用它,因为它已经在内部使用了 Arc。

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

标签: httpwebrustactix-webreqwest

解决方案


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

您不必将 Client 包装在 Rc 或 Arc 中即可重用它,因为它已经在内部使用了 Arc。

简直clone就是客户端。

请从源代码Client检查定义:

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

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

内部 type( ClientRef) 已Arc按照文档所述进行包装并Client具有Clone实现,因为除了 之外没有其他字段inner: Arc<_>,因此与自己包装相比,克隆客户端不会导致任何运行时开销Arc

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


推荐阅读