10 Mayıs 2018 Perşembe

SpringBoot RestTemplateBuilder Sınıfı

Giriş
Açıklaması şöyle
To call an external API we need to create a RestTemplate instance. Let’s start with that. Spring Boot >= 1.4 no longer automatically defines a RestTemplate but instead defines a RestTemplateBuilder allowing us more control over the RestTemplate that gets created. We can inject the RestTemplateBuilder as an argument in our @Bean method to create a RestTemplate:
Örnek
Şöyle yaparız
public RestTemplate createDefaultRestTemplate(RestTemplateBuilder restTemplateBuilder) {
  return restTemplateBuilder.build();
}
Metrics
Açıklaması şöyle. Yani RestTemplateBuilder kullanılarak yaratılan RestTemplate sınıfları aynı zamanda metricsleri de gösterir.
The instrumentation of any RestTemplate created using the auto-configured RestTemplateBuilder is enabled.
Adres şöyle
http://localhost:8080/acutator/metrics
Örnek - http.client.requests
Şöyle yaparız
http://localhost:8080/acutator/metrics/http.client.requests { "name": "http.client.requests", "description": "Timer of RestTemplate operation", "baseUnit": "milliseconds", "measurements": [ { "statistic": "COUNT", "value": 4.0 }, { "statistic": "TOTAL_TIME", "value": 3.141592 }, { "statistic": "MAX", "value": 42.000000 } ], "availableTags": [ { "tag": "method", "values": [ "POST", "GET" ] }, { "tag": "application", "values": [ "my-application" ] }, { "tag": "uri", "values": [ "/some/api/with/templates/{templateId}" ] }, { "tag": "outcome", "values": [ "SUCCESS" ] }, { "tag": "client.name", "values": [ "nunya.business", "also-nunya.business" ] }, { "tag": "status", "values": [ "200" ] } ] }

Bağlantı Sayısı
Bu kod ile şöyle bir problem ortaya çıkabiliyor. Yani bir adrese aynı anda sadece 5 bağlantıya izin veriyor. Eğer böyle bir problem istemiyorsak RestTemplateBuilder yerine RestTemplate sınıfının HttpComponentsClientHttpRequestFactory alan constructor metodu kullanılabilir.
It seems nice and clean but it hides a default PoolingHttpClientConnectionManager with the defaultMaxPerRoute set to 5.

What does this default max per route means? It means that only 5 simultaneous HTTP connections to the same host will be possible.
In my situation, the backend takes 500ms to answer, so 5 simultaneous connections means a hard limit to 10 RPS!

setConnectTimeout metodu
Örnek
Şöyle yaparız
@Configuration
public class WebConfig {
  @Bean
  public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder
      .setConnectTimeout(Duration.ofMillis(3000))
      .setReadTimeout(Duration.ofMillis(3000))
      .build();
  }
}

setReadTimeout metodu
Örnek
Şöyle yaparız.
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) 
{
  return restTemplateBuilder
    .setConnectTimeout(...)
    .setReadTimeout(...)
    .build();
}
Örnek
Şöyle yaparız
@Configuration
public class RestConfig {

  @Bean
  public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder){
    return restTemplateBuilder
      .setConnectTimeout(Duration.ofSeconds(3))
      .setReadTimeout(Duration.ofSeconds(3))
      .build();
  }
}

Hiç yorum yok:

Yorum Gönder