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的RestTemplate连接池相关配置

Spring Cloud Commons教程Spring RestTemplate作为负载平衡器客户端

由于未绑定的 RestTemplate,Spring-Boot RestClientTest 无法正确自动配置 MockRestServiceServer

spring的RestTemplate连接池相关配置

spring的RestTemplate连接池相关配置