Tengo un escenario en el que hay un punto final agregado para llamar a múltiples sistemas posteriores que son RESTful y devuelve la respuesta consolidada de todos estos sistemas.

Actualmente estoy usando una plantilla de descanso que está configurada como un bean singleton y la inyecta en los servicios correspondientes para hacer la llamada de descanso. RestTemplate está utilizando el CloseableHttpClient predeterminado como HttpClient, que cerrará las conexiones una vez que la solicitud sea exitosa.

¿Sería un buen enfoque o sería mejor si la plantilla de descanso se configura por servicio que llama a su servicio RESTful?

3
Imran Mohammed 7 mar. 2018 a las 04:50

3 respuestas

La mejor respuesta

RestTemplate es seguro para subprocesos. Podría usar un administrador de conexión de agrupación:

  @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);
  }

Y también es importante, es posible que deba cambiar la configuración predeterminada de RestTemplate en función de las pruebas de observación / carga, RestTemplate no necesita utilizar todo el conjunto para evitar que un host lo piratee.

Puede leer más en mi blog Solución de problemas Spring's RestTemplate Tiempo de espera de solicitudes

3
ootero 7 mar. 2018 a las 03:15

De Spring Docs

RestTemplate

RestTemplate es la clase Spring central para el acceso HTTP del lado del cliente. Conceptualmente, es muy similar a JdbcTemplate, JmsTemplate y las otras plantillas que se encuentran en Spring Framework y otros proyectos de cartera. Esto significa, por ejemplo, que RestTemplate es seguro para subprocesos una vez construido, y que puede usar devoluciones de llamada para personalizar sus operaciones.

Por lo tanto, puede crear su RestTemplate es seguro para compartir con múltiples hilos invocando una llamada REST simultáneamente.

También debe considerar el costo de crear y destruir una instancia. Si cada hilo o cada llamada de descanso crea un RestTemplate dedicado, obstaculizará el rendimiento de sus aplicaciones.

Ref: https://spring.io/blog/ 2009/03/27 / rest-in-spring-3-resttemplate

1
Amit Phaltankar 7 mar. 2018 a las 02:30

Sería mejor si está inyectando los servicios en la plantilla de descanso si tienen algo en común. Puede inyectar servicios con un comportamiento común en una plantilla de descanso. De esta manera, podrá implementar un código valioso en una clase principal. Solo porque todos son un servicio, inyectarlos en una sola plantilla de descanso podría no ser adecuado desde el punto de vista del diseño.

-1
mark42inbound 7 mar. 2018 a las 03:09