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

时间:2016-03-15 18:38:39

标签: spring spring-mvc basic-authentication resttemplate apache-httpcomponents

我正在构建一个代理并对HTTP请求进行一些轻微操作的Web服务。我正在处理发送到同一类型的多个主机的请求,但直到运行时我才知道这些主机(我使用提供主机IP的Web服务)。我与之交互的每个主机具有不同的凭据(Basic-Auth,从非本地数据库获取,凭据定期更改)。我今天处理事情的方式非常天真。对于每个请求,我正在构建一个新的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);
}

因此每个Controller方法始终以:

开头
UsernamePassword userPass = credentialService.getCredentials(request.getRemoteHost())
RestOperations restOps = getRestOperations(userPass.getUser(), userPass.getPass(), TIMEOUT_IN_MILLIS);

在我看来,因为我正在为每个请求构建一个新的RestTemplate,所以我的服务器和主机之间的任何先前连接都没有被重用。

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

0 个答案:

没有答案