java - Spring RestTemplate 配置策略从单个 API 调用多个 rest 服务

标签 java spring rest spring-boot resttemplate

我有一个场景,其中有一个聚合端点可以调用多个 RESTful 下游系统,并返回所有这些系统的综合响应。

我目前正在使用配置为单例 bean 的 rest 模板,并将其注入(inject)相应的服务以进行 rest 调用。 RestTemplate 使用默认的 CloseableHttpClient 作为 HttpClient,一旦请求成功,它将关闭连接。

这会是一个好方法吗?或者如果每个调用其 RESTful 服务的服务配置剩余模板会更好吗?

最佳答案

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

关于java - Spring RestTemplate 配置策略从单个 API 调用多个 rest 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49142876/

相关文章:

spring - 如何在 SpringBootTest 中的 @DataJpaTest 中导入配置类?

java - Spring 3.1中如何使用通配符加载xml资源文件

java - 使用 JSON 请求并产生不同的输出

REST - 404 未找到

java - 将零与字符串连接起来

java - 在 Java 中检测 mime 类型,结果错误

java - 如何从文件(.yml)中读取字符串结果,从而通读多个文件?

java - JDialog标题的字体大小

spring - JDBCTemplate setQueryTimeout 特定于每个查询,即查询级别

java - Spring REST API 并防止更改自动生成的属性?