Spring 为多台主机处理多个RestTemplate实例

Spring 为多台主机处理多个RestTemplate实例,spring,spring-mvc,basic-authentication,resttemplate,apache-httpcomponents,Spring,Spring Mvc,Basic Authentication,Resttemplate,Apache Httpcomponents,我正在构建一个web服务,它代理并对HTTP请求进行一些轻微的操作。我正在处理发送到多个相同类型主机的请求,但直到运行时我才知道这些请求(我使用一个提供主机IP的web服务)。与我交互的每个主机都有不同的凭据(基本身份验证、从非本地数据库获取、凭据定期更改)。我今天处理事情的方式很幼稚。对于每个请求,我都在构建一个新的RestTemplate,如下所示: public static RestOperations getRestOperations(int timeout, String user

我正在构建一个web服务,它代理并对HTTP请求进行一些轻微的操作。我正在处理发送到多个相同类型主机的请求,但直到运行时我才知道这些请求(我使用一个提供主机IP的web服务)。与我交互的每个主机都有不同的凭据(基本身份验证、从非本地数据库获取、凭据定期更改)。我今天处理事情的方式很幼稚。对于每个请求,我都在构建一个新的RestTemplate,如下所示:

public static RestOperations getRestOperations(int timeout, String username, String password)
{
    RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(timeout).setConnectTimeout(timeout).setSocketTimeout(timeout).build();
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    credsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
    CloseableHttpClient httpclient = HttpClients.custom()
        .setDefaultCredentialsProvider(credsProvider)
        .setDefaultRequestConfig(requestConfig)
        .build();
    ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(
        httpclient);
    return new RestTemplate(requestFactory);
}
因此,每个控制器方法总是从以下内容开始:

UsernamePassword userPass = credentialService.getCredentials(request.getRemoteHost())
RestOperations restOps = getRestOperations(userPass.getUser(), userPass.getPass(), TIMEOUT_IN_MILLIS);
在我看来,由于我正在为每个请求构造一个新的RestTemplate,所以以前在服务器和主机之间建立的任何连接都不会被重用


是这样吗?如果是这样,那么我似乎需要某种RestTemplateFactory,它可以基于主机IP地址缓存RestTemplate实例,以便可以重用连接。但是,如果我这样做,那么我需要一些机制来确保凭据没有更改,并在凭据更改时检查和更新凭据。有更好的解决方案吗?

您不应该为每个请求创建一个新的RestTemplate,因为这样做可能会很昂贵。您可以实现某种“会话”功能,每个会话保留一个RestTemplate。我认为这种方法可能有问题,也就是说,一个用户很可能在一个会话中与多个主机交互。我想我可以在每个会话上都有一个映射,在每个会话中每个主机都有一个RestTemplate。