Em algum momento pode acontecer da nossa aplicação ter a necessidade de consumir ou se integrar com um serviço externo.
Pensando nisso surgiu um projeto chamado Feign.
O que é Feign?
O Feign é um projeto que está dentro do Spring Cloud ele é
utilizado para integração e consumo de serviços rest.
Ele torna o consumo de clients de serviço da web mais fácil. Foi
inspirado no Retrofit e JAX-RS-2.0.
Uma grande facilidade do uso do Feign é que não precisamos
escrever nenhum código para chamar o serviço, a não ser uma
definição de interface.
@FeignClient é a notação que torna o consumo do serviço
extremamente simples.
Eu vou mostrar um exemplo simples consumindo a api
viacep.com.br/ws/{cep}/json/
A api devolve um json na seguinte estrutura;
- Vamos adicionar duas dependências ao nosso pom.xml
spring-cloud-starter-openfeign
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
spring-cloud-dependencies
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
- Configurações do Projeto
Precisamos anotar @EnableFeignClients na classe principal do
projeto, para habilitar o Feign, no caso aqui a classe
Application.
Com essa anotação habilitamos uma busca pela interface client
que devem ser consumida.
@SpringBootApplication
@EnableFeignClients
public class ConsumoApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumoApplication.class, args);
}
}
- Criaremos a classe que vai retornar nosso objeto
public class Endereco {
private String cep;
private String logradouro;
private String complemento;
private String bairro;
private String localidade;
private String uf;
private String ibge;
private String gia;
private String ddd;
private String siafi;
}
- Criaremos uma interface onde o @FeignClient irá fazer a chamada do serviço.
Os parâmetros url e name são obrigatórios;
onde url: é a base do serviço que vai ser consumido
e name: o nome do cliente
Precisamos dizer qual o Endepoint o buscarEnderecoPorCep vai
utilizar;
@FeignClient(url= "https://viacep.com.br/ws/" , name = "viacep")
public interface CepService {
@GetMapping("{cep}/json")
Endereco buscaEnderecoPorCep(@PathVariable("cep") String cep);
}
- Agora é só criar a rota que usaremos para consumir o serviço;
@RestController
public class CepRestService {
@Autowired
private CepService cepService;
@GetMapping("/{cep}")
public ResponseEntity<Endereco> getCep(@PathVariable String cep) {
Endereco endereco = cepService.buscaEnderecoPorCep(cep);
return endereco != null ? ResponseEntity.ok().body(endereco) : ResponseEntity.notFound().build();
}
}
Pronto, agora sua aplicação está consumindo um serviço externo
com poucas linhas e com o mesmo resultado que teríamos com
RestTemplate.
Link da aplicação modelo no git Exemplo
Top comments (6)
Parabéns, Daiene 👏👏👏! Conteúdo massa! :)
Agregou bastante.
Olá, achei bem interessante esse projeto. Contudo, quando adicionei esse service no meu projeto ocorreu o seguinte erro:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'configurationPropertiesBeans' defined in class path resource [org/springframework/cloud/autoconfigure/ConfigurationPropertiesRebinderAutoConfiguration.class]
É necessário algum arquivo @Configuration?
Tive o mesmo problema que você amigo.
Estava usando a versão 2.4.3 do Spring, aí dei uma gogleada e li relatos de incompatibilidade a partir da 2.4.0
Achei estranho, mas aí troque a versão para a mesma usado no exemplo e ao fazer o rebuild rodou certinho.
Oi, vc adicionou as duas anotações necessárias para a configuração ? @EnableFeignClients na class main e @FeignClient no service do endpoint ?
se tiver o repo no git eu posso olhar pra vc
Daiene. Parabéns por compartilhar conhecimento.
O conteúdo me deu uma baita luz aqui.
eu que agradeço por ler meus conteúdos.