Spring RestTemplate 配置策略从单个 API 调用多个休息服务
Posted
技术标签:
【中文标题】Spring RestTemplate 配置策略从单个 API 调用多个休息服务【英文标题】:Spring RestTemplate configuration strategies to call multiple rest services from a single API 【发布时间】:2018-08-15 00:31:15 【问题描述】:我有一个场景,其中有一个聚合端点来调用多个下游系统,这些系统是 RESTful 并返回来自所有这些系统的整合响应。
我目前正在使用一个配置为单例 bean 的 rest 模板,并将其注入到相应的服务中以进行 rest 调用。 RestTemplate 使用默认的 CloseableHttpClient 作为 HttpClient,一旦请求成功,它将关闭连接。
如果为调用其 RESTful 服务的每个服务配置 REST 模板,这会是一个好方法还是会更好?
【问题讨论】:
【参考方案1】: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阅读更多内容
【讨论】:
【参考方案2】:如果您在其余模板中注入服务,如果它们有共同点,那就更好了。您可以在一个休息模板中注入具有一些常见行为的服务。这样,您就可以在父类中实现一些可重复使用的代码。仅仅因为它们都是服务,从设计的角度来看,将它们注入到一个单独的 rest 模板中可能不合适。
【讨论】:
【参考方案3】:来自 Spring 文档
休息模板
RestTemplate 是客户端 HTTP 的中心 Spring 类 使用权。从概念上讲,它与 JdbcTemplate 非常相似, JmsTemplate,以及 Spring 中的各种其他模板 框架和其他组合项目。例如,这意味着 RestTemplate 构建后是线程安全的,您可以使用 回调来自定义其操作。
因此,您可以创建自己的 RestTemplate
以安全地与同时调用 REST 调用的多个线程共享。
您还应该考虑创建和销毁实例的成本。如果每个线程或每个 rest 调用都创建一个专用的 RestTemplate
,则会影响您的应用性能。
参考:https://spring.io/blog/2009/03/27/rest-in-spring-3-resttemplate
【讨论】:
以上是关于Spring RestTemplate 配置策略从单个 API 调用多个休息服务的主要内容,如果未能解决你的问题,请参考以下文章
Spring 负载均衡器、RestTemplate 和微服务问题
Spring Cloud Commons教程Spring RestTemplate作为负载平衡器客户端
由于未绑定的 RestTemplate,Spring-Boot RestClientTest 无法正确自动配置 MockRestServiceServer