Olá, Luciano!
É basicamente isso mesmo.
O estilo de código do Feign é declarativo, em que dizemos o que queremos que acontece. Não é um estilo programático, em que diríamos o passo a passo que precisa ser feito.
Esse estilo declarativo é análogo ao do Spring Data. No Spring Data, criamos uma interface (p. ex. UserRepository
) e declaramos um método (p. ex. Optional<User> findByName(String name)
. O Spring Data fica responsável por gerar o código que faz uma query no BD internamente.
A mesma coisa acontece com o Feign: declaramos o que queremos, não precisamos dizer o passo a passo como acontece quando usarmos o Spring RestTemplate.
Vou dar um exemplo mais prático, extraído da apostila do curso Microservices com Spring Cloud da Caelum (empresa do grupo Alura).
Imagine que estamos fazendo um aplicativo de entrega de comida.
Há um serviço de Pagamentos e um serviço de Pedidos.
O serviço de Pagamentos precisa avisar ao de Pedidos quando foi confirmado o pagamento de um pedido.
Se o id do pedido for 12
, por exemplo, teríamos que chamar a API do serviço de pedidos da seguinte maneira:
PUT /pedidos/12/pago
Como faríamos isso com o Feign?
Seria algo semelhante a esse:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
@FeignClient(url="${pedidos.service.url}", name="pedidos-service")
interface PedidoRestClient {
@PutMapping("/pedidos/{pedidoId}/pago")
void avisaQueFoiPago(@PathVariable("pedidoId") Long pedidoId);
}
Perceba que o @PutMapping
é exatamente o mesmo que colocaríamos num Controller lá no serviço que fornece a API.
Dessa maneira, parece que estamos redeclarando o que o API do servidor faz, só que no lado do Cliente. Esse é o estilo declarativo do Feign.