Bem-vindo ao meu blog

Compartilhando conhecimento sobre tecnologia, programação e mais!

Feign: Uma maneira elegante de criar clientes HTTP em Java

Publicado em: 13 de March de 2019 | Categorias: Java
Feign: Uma maneira elegante de criar clientes HTTP em Java

Geralmente, quando queremos consumir dados a partir de um WebService, precisamos de um cliente http que seja capaz de fazer a requisição para nós. O problema, é que a maioria das vezes é muito complicado e trabalhoso fazermos isso, sem falar que o código que escrevemos para cada requisição pode se tornar repetitivo. O Feign foi criado justamente com o objetivo de reduzir a complexidade para consumir esses serviços.

Feign é um projeto que foi inspirado em Retrofit, JAXRS-2.0 e WebSocket. Ele utiliza de anotações plugáveis que podem ser anotações Feign, JAX-RS, entre outras.

Para facilitar nossa vida, o Spring incorporou o Feign em sua stack de cloud, simplificando ainda mais a configuração e integração com nossa aplicação. Dessa forma, podemos reaproveitar as anotações que utilizamos para criar WebServices, como GetMapping, PathVariable, etc.

Para utilizarmos o Feign em nossos projetos, podemos adicionar o starter do Spring.

    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    

Agora, vamos habilita-lo na aplicação. Graças a magia por trás do Spring, podemos fazer isso com apenas uma linha de código.

    
    @EnableFeignClients //habilita o Feign na aplicação
    @SpringBootApplication
    public class TutorialFeignApplication {

       public static void main(String[] args) {
          SpringApplication.run(TutorialFeignApplication.class, args);
       }

    }
    

Feito isso, vamos criar um método que será executado ao inicializar a aplicação, este método deve ser capaz de buscar em um WS informações do endereço com base em um CEP.

    
    @Component
    public class Initializer implements CommandLineRunner {

        @Override
        public void run(String... args) throws Exception {

        }
    }
    

O WS retorna informações de um usuário a partir do seu email, sendo assim, vamos criar uma classe para representar este usuário.

    
    public class Usuario {

        private String nome;
        private String sobrenome;
        private String email;
        private Integer idade;
        private String telefone;

        //getters

        @Override
        public String toString() {
            return "Usuario{" +
                    "nome='" + nome + '\'' +
                    ", sobrenome='" + sobrenome + '\'' +
                    ", email='" + email + '\'' +
                    ", idade=" + idade +
                    ", telefone='" + telefone + '\'' +
                    '}';
        }
    }
    

Agora vamos criar nosso cliente http. Com Feign, podemos fazer isso de forma declarativa, assim não precisamos de nenhuma implementação, o Feign se responsabilizará de fazer isso pra gente.

    
    @FeignClient(url = "http://localhost:8085/usuario/", name = "usuario")
    public interface UsuarioClient {

        @GetMapping("email/{email}")
        Usuario buscaPeloEmail(@PathVariable("email") String email);
    }
    

Perceba que foi usado a anotação FeignClient em nossa interface, através dela, dizemos qual é a url da nossa API. Nas versões mais recentes do Feign, precisamos passar além da url, um nome para nosso cliente. O método responsável por buscar o usuário pelo email pode ser declarado utilizando anotações já conhecidas do Spring.

Agora basta chamarmos nosso cliente e ver oque acontece.

    
    @Component
    public class Initializer implements CommandLineRunner {

        private final UsuarioClient usuarioClient;

        public Initializer(UsuarioClient usuarioClient) {
            this.usuarioClient = usuarioClient;
        }

        @Override
        public void run(String... args) {
            Usuario usuario = this.usuarioClient.buscaPeloEmail("felix_gilioli@hotmail.com");
            System.out.println(usuario);
        }
    }
    

Resumo

Neste artigo, mostrei como criar um cliente HTTP utilizando Feign, que torna mais fácil nossas requisições as API’s. Para quem deseja se aprofundar e conhecer mais sobre ele, sugiro também dar uma pesquisada sobre uma outra biblioteca chamada Hystrix, que nos permite trabalhar com tolerância a falhas e possuí uma ótima integração com Feign.