Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Acesso a uma api utilizando o Feign

Olá, qual seria um exemplo básico da utilização do feign para acesso a outra api, somente utilizando o feign ...

exemplo:

@FeignClient (name = "nomedaapiparaacessar", url = "http://localhost:8081//meuendpoint ", decode404 = true)
public interface Client {

    @GetMapping("/endpointdeacesso/{dado}")
    PaymentHistory buscaPor(@PathVariable String dado);
}

seria basicamente isso um modelo da interface ? ou teria algum recurso a mais

2 respostas

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.

solução!

Um detalhe complementar: no caso do Feign, há integração com o ecossistema do Spring Cloud e da Netflix OSS.

Então, se você já tiver o Ribbon e o Eureka, basta dizer o nome do serviço. O Feign busca do Ribbon que busca do Eureka uma URL de uma instância disponível para o servio.

Portanto, no exemplo anterior, não seria necessário definir a URL:

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;

@FeignClient(name="pedidos-service")
interface PedidoRestClient {

  @PutMapping("/pedidos/{pedidoId}/pago")
  void avisaQueFoiPago(@PathVariable("pedidoId") Long pedidoId);

}