Spring RestTemplate 配置策略从单个 API 调用多个休息服务
Spring RestTemplate configuration strategies to call multiple rest services from a single API
我有一个场景,其中有一个聚合端点可以调用多个下游系统 RESTful 并返回所有这些系统的综合响应。
我目前正在使用配置为单例bean 的rest 模板并将其注入相应的服务以进行rest 调用。 RestTemplate 使用默认的 CloseableHttpClient 作为 HttpClient,一旦请求成功就会关闭连接。
这会是一个好方法吗?或者如果根据调用其 RESTful 服务的服务配置剩余模板会更好吗?
来自 Spring 文档
RestTemplate
The RestTemplate is the central Spring class for client-side HTTP
access. Conceptually, it is very similar to the JdbcTemplate,
JmsTemplate, and the various other templates found in the Spring
Framework and other portfolio projects. This means, for instance, that
the RestTemplate is thread-safe once constructed, and that you can use
callbacks to customize its operations.
因此,您可以创建 RestTemplate
安全地与同时调用 REST 调用的多个线程共享。
您还应该考虑创建和销毁实例的成本。如果每个线程或每个 rest 调用都创建一个专用的 RestTemplate
,它将影响您的应用程序性能。
参考:https://spring.io/blog/2009/03/27/rest-in-spring-3-resttemplate
如果您在其余模板中注入服务,如果它们有一些共同点,那会更好。您可以在一个休息模板中注入具有一些常见行为的服务。这样你就可以在父 class 中实现一些可重用的代码。仅仅因为它们都是一个服务,从设计的角度来看,将它们注入到一个单独的 rest 模板中可能是不合适的。
RestTemplate
是线程安全的。您可以使用池连接管理器:
@Bean
public PoolingHttpClientConnectionManager poolingHttpClientConnectionManager() {
PoolingHttpClientConnectionManager result = new PoolingHttpClientConnectionManager();
result.setMaxTotal(20); // FIXME Consider making this value configurable
return result;
}
@Bean
public RequestConfig requestConfig() {
RequestConfig result = RequestConfig.custom()
// FIXME Consider making these values configurable
.setConnectionRequestTimeout(2000)
.setConnectTimeout(2000)
.setSocketTimeout(2000)
.build();
return result;
}
@Bean
public CloseableHttpClient httpClient(PoolingHttpClientConnectionManager poolingHttpClientConnectionManager, RequestConfig requestConfig) {
CloseableHttpClient result = HttpClientBuilder
.create()
.setConnectionManager(poolingHttpClientConnectionManager)
.setDefaultRequestConfig(requestConfig)
.build();
return result;
}
@Bean
public RestTemplate restTemplate(HttpClient httpClient) {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
return new RestTemplate(requestFactory);
}
同样重要的是,您可能需要根据观察/负载测试更改 RestTemplate
的默认设置,RestTemplate
没有必要使用整个池来防止主机劫持它.
你可以在我的博客上阅读更多内容Troubleshooting Spring's RestTemplate Requests Timeout
我有一个场景,其中有一个聚合端点可以调用多个下游系统 RESTful 并返回所有这些系统的综合响应。
我目前正在使用配置为单例bean 的rest 模板并将其注入相应的服务以进行rest 调用。 RestTemplate 使用默认的 CloseableHttpClient 作为 HttpClient,一旦请求成功就会关闭连接。
这会是一个好方法吗?或者如果根据调用其 RESTful 服务的服务配置剩余模板会更好吗?
来自 Spring 文档
RestTemplate
The RestTemplate is the central Spring class for client-side HTTP access. Conceptually, it is very similar to the JdbcTemplate, JmsTemplate, and the various other templates found in the Spring Framework and other portfolio projects. This means, for instance, that the RestTemplate is thread-safe once constructed, and that you can use callbacks to customize its operations.
因此,您可以创建 RestTemplate
安全地与同时调用 REST 调用的多个线程共享。
您还应该考虑创建和销毁实例的成本。如果每个线程或每个 rest 调用都创建一个专用的 RestTemplate
,它将影响您的应用程序性能。
参考:https://spring.io/blog/2009/03/27/rest-in-spring-3-resttemplate
如果您在其余模板中注入服务,如果它们有一些共同点,那会更好。您可以在一个休息模板中注入具有一些常见行为的服务。这样你就可以在父 class 中实现一些可重用的代码。仅仅因为它们都是一个服务,从设计的角度来看,将它们注入到一个单独的 rest 模板中可能是不合适的。
RestTemplate
是线程安全的。您可以使用池连接管理器:
@Bean
public PoolingHttpClientConnectionManager poolingHttpClientConnectionManager() {
PoolingHttpClientConnectionManager result = new PoolingHttpClientConnectionManager();
result.setMaxTotal(20); // FIXME Consider making this value configurable
return result;
}
@Bean
public RequestConfig requestConfig() {
RequestConfig result = RequestConfig.custom()
// FIXME Consider making these values configurable
.setConnectionRequestTimeout(2000)
.setConnectTimeout(2000)
.setSocketTimeout(2000)
.build();
return result;
}
@Bean
public CloseableHttpClient httpClient(PoolingHttpClientConnectionManager poolingHttpClientConnectionManager, RequestConfig requestConfig) {
CloseableHttpClient result = HttpClientBuilder
.create()
.setConnectionManager(poolingHttpClientConnectionManager)
.setDefaultRequestConfig(requestConfig)
.build();
return result;
}
@Bean
public RestTemplate restTemplate(HttpClient httpClient) {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
return new RestTemplate(requestFactory);
}
同样重要的是,您可能需要根据观察/负载测试更改 RestTemplate
的默认设置,RestTemplate
没有必要使用整个池来防止主机劫持它.
你可以在我的博客上阅读更多内容Troubleshooting Spring's RestTemplate Requests Timeout