RestTemplate: Abordagem Síncrona e Tradicional
RestTemplate é uma ferramenta antiga, baseada em I/O bloqueante, projetada parra facilitar chamadas HTTP em aplicações convencionais. Ela oferece um modelo de template para execução de operações como GET, POST, PUT e DELETE, com suporte a múltiplos formatos de dados (JSON, XML, etc.). É ideal para sistemas simples que não exigem alto desempenho ou escalabilidade.
- Bloqueante: Cada requisição bloqueia a thread até receber a resposta — ineficiente em carga alta.
- API direta: Uso de objetos como
HttpEntityeHttpHeaderspara configuração, mas menos fluido em expressividade. - Configuração centralizada: Pode ser facilmente injetado via
@Beanem contextos de aplicação.
Exemplo de uso com RestTemplate:
@Configuration
public class HttpClientConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@RestController
public class DataController {
@Autowired
private RestTemplate client;
@PostMapping("/send")
public String sendData(@RequestBody UserData data) {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth("abc123");
HttpEntity<userdata> request = new HttpEntity<>(data, headers);
return client.postForObject(
"http://api.example.com/endpoint",
request,
String.class
);
}
}
</userdata>
WebClient: Cliente Assíncrono e Reativo
WebClient foi introduzido com o Spring 5 como parte da nova abordagem reativa, baseada no projeto Reactor. Ele opera de forma não bloqueante e é totalmente compatível com modelos assíncronos, tornando-o ideal para microserviços escaláveis e aplicações com alta concorrência.
- Assíncrono e não bloqueante: Permite processar milhares de requisições simultâneas com poucos recursos.
- API fluída: Utiliza composição funcional com métodos encadeados, melhorando legibilidade e manutenibilidade.
- Integração com Reactor: Suporta operações como
timeout,retry,flatMap, e fluxos de dados contínuos. - Suporte a streaming: Ideal para transferência de grandes volumes de dados ou conexões longas.
Exemplo de uso com WebClient:
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
return WebClient.builder()
.build();
}
}
@RestController
public class AsyncController {
@Autowired
private WebClient client;
@PostMapping("/async-call")
public Mono<String> callExternalService(@RequestBody UserData data) {
return client.post()
.uri("http://api.example.com/endpoint")
.bodyValue(data)
.retrieve()
.bodyToMono(String.class)
.timeout(Duration.ofSeconds(10))
.retryWhen(Retry.backoff(3, Duration.ofMillis(500)))
.doOnError(err -> log.error("Erro na chamada externa", err));
}
}
Como escolher?
- Use
RestTemplatese:- Seu sistema é monolítico ou baseado em threads síncronas.
- Não há necessidade de alto desempenho ou escalabilidade.
- Está mantendo código legacy e não deseja mudanças estruturais.
- Use
WebClientse:- Desenvolve microserviços modernos com requisitos de alta concorrência.
- Quer aproveitar o modelo reativo e reduzir consumo de memória e threads.
- Está construindo aplicações com fluxos de dados, eventos ou backpressure.
Com o avanço do Spring WebFlux e a adoção crescente de arquiteturas reativas, WebClient está se tornando o padrão recomendado para novos projetos. Embora RestTemplate ainda seja funcional, seu uso é considerado obsoleto em faver de soluções mais eficientes e escaláveis.