Oi! Meu nome é Viacheslav Aksenov e sou um desenvolvedor back-end especializado no desenvolvimento de sistemas back-end complexos em Java e Kotlin. Além disso, tenho muitos pequenos projetos de estimação, que você pode encontrar no meu GitHub:
O que é um microsserviço?
Um microsserviço é um serviço pequeno e independente projetado para executar uma tarefa específica ou um conjunto de tarefas em um aplicativo maior. Cada microsserviço é desenvolvido e implantado independentemente dos outros microsserviços no sistema e se comunica com outros microsserviços por meio de APIs.
Os microsserviços também oferecem vários outros benefícios, incluindo escalabilidade aprimorada, melhor tolerância a falhas e maior agilidade. Ao dividir um aplicativo em serviços menores e mais independentes, os desenvolvedores podem facilmente aumentar ou diminuir componentes individuais conforme necessário e podem responder rapidamente às mudanças nas necessidades do usuário ou nas condições do mercado.
No entanto, os microsserviços também apresentam alguns desafios, como a necessidade de gerenciamento de API robusto, descoberta de serviço e rastreamento distribuído. Projetar e implementar microsserviços adequadamente requer planejamento e coordenação cuidadosos em toda a equipe de desenvolvimento, bem como um profundo entendimento dos requisitos e restrições exclusivos do sistema que está sendo desenvolvido.
Quando os clientes HTTP são necessários para microsserviços?
Para responder a esta pergunta, precisamos responder à pergunta “Qual é a responsabilidade deste serviço atual?”
Muitas vezes, na lógica de negócios de serviços, há situações em que precisamos obter resposta de uma API de terceiros. Ou ainda, temos vários microsserviços em cadeia para lidar com nosso processo de negócios. Nessas situações, temos que implementar o cliente HTTP em nosso microsserviço.
Em uma arquitetura de microsserviços, um cliente HTTP é um componente de software que se comunica com outros microsserviços pelo protocolo HTTP. O cliente HTTP é responsável por fazer solicitações a outros microsserviços e receber respostas de volta.
Quando um microsserviço precisa se comunicar com outro microsserviço, ele normalmente envia uma solicitação HTTP para o endpoint apropriado do outro microsserviço. A solicitação HTTP pode incluir uma carga útil de dados, como um objeto JSON ou documento XML, que o microsserviço receptor pode usar para executar sua tarefa.
Como implementar o cliente HTTP em um microsserviço Spring Boot?
Existem várias maneiras que você pode escolher para implementar o cliente HTTP no serviço Spring Boot. Antes de tudo, você precisa escolher - será um cliente síncrono ou assíncrono?
Por exemplo, se você tiver arquitetura síncrona, poderá escolher uma das soluções fornecidas pelo Spring Boot.
No Spring Boot, um cliente HTTP síncrono é um componente usado para fazer solicitações HTTP para outros serviços ou terminais e bloqueia o encadeamento atual até que a resposta seja recebida. O Spring Boot fornece várias opções para implementar clientes HTTP síncronos, incluindo as classes RestTemplate
e WebClient
.
O RestTemplate
é uma escolha popular para implementar clientes HTTP síncronos no Spring Boot. Ele fornece uma API simples e intuitiva para fazer solicitações HTTP e lidar com respostas e oferece suporte a uma ampla variedade de métodos HTTP, tipos de solicitação e resposta e conversores de mensagens. Para usar RestTemplate
, você precisa configurá-lo como um bean no contexto de seu aplicativo e usá-lo para fazer solicitações HTTP chamando seus vários métodos.
Há um exemplo de uso de RestTemplate para solicitação HTTP POST:
public RegisterResponse registerUser(UserDto userDto) { HttpEntity<UserDto> requestEntity = new HttpEntity<>(user, headers); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, requestEntity, RegisterResponse.class); if (responseEntity.getStatusCode() == HttpStatus.OK) { RegisterResponse response = responseEntity.getBody(); // handle the response } else { // handle the error } }
Outra opção para implementar clientes HTTP síncronos no Spring Boot é usar a classe WebClient
. WebClient
é um cliente HTTP reativo que fornece uma API sem bloqueio para fazer solicitações HTTP e manipular respostas e é adequado para aplicativos que exigem altos níveis de simultaneidade ou escalabilidade. Para usar WebClient
, você precisa configurá-lo como um bean no contexto do aplicativo e usá-lo para fazer solicitações HTTP chamando seus vários métodos.
public RegisterResponse registerUser(UserDto userDto) { Mono<String> responseMono = webClient.post() .uri(endpointPath) .contentType(MediaType.APPLICATION_JSON) .body(Mono.just(user), UserDto.class) .retrieve() .bodyToMono(RegisterResponse.class); responseMono.subscribe(response -> { // handle the response }, error -> { // handle the error }); }
É importante observar que o uso de clientes HTTP síncronos pode bloquear o encadeamento atual, o que pode ter um impacto negativo no desempenho geral e na escalabilidade de seu aplicativo. Como tal, é recomendável usar clientes HTTP assíncronos, como WebClient
com programação reativa, quando possível para melhorar a capacidade de resposta do aplicativo e a utilização de recursos.
Existem vários contras ao usar RestTemplate e WebClient:
- você precisa escrever muita lógica clichê para lidar com cenários positivos e negativos
- você precisa configurar cada cliente manualmente
- métodos para requisições HTTP GET/POST regulares têm semântica complexa e você precisa se lembrar disso
Como torná-lo mais simples?
Resposta curta - você pode usar a biblioteca Feign. O que é?
Feign é uma biblioteca Java que permite aos desenvolvedores criar clientes HTTP facilmente, especificamente projetado para construir microsserviços RESTful. Ele fornece uma maneira declarativa de definir APIs HTTP que podem ser chamadas de seu código como se fossem chamadas de métodos locais, facilitando o trabalho com APIs e o consumo de recursos em diferentes microsserviços.
Com o Feign, você pode criar facilmente interfaces que definem os métodos HTTP, parâmetros de solicitação e tipos de resposta para seus endpoints RESTful. Em seguida, Feign cuida do resto, incluindo a serialização e desserialização de solicitações e respostas, codificação de URL, tratamento de erros e gerenciamento de conexão.
Aqui está um exemplo de uma solicitação POST para registro de usuário usando Feign:
// Client describes as interface with configuration: @FeignClient(name = "exampleRegisterClient") public interface RegisterClient { @PostMapping("/register") RegisterResponse registerUser(@RequestBody UserDto user); } // Bean creation in Spring configuration: @Bean public RegisterClient registerUserApi() { return Feign.builder().target(RegisterClient.class, "//localhost:9090/api); }
Feign fornece uma maneira simples e declarativa de interagir com APIs HTTP, permitindo que os desenvolvedores se concentrem na lógica de negócios de seus microsserviços, em vez dos detalhes de fazer solicitações HTTP.
Conclusão.
Concluindo, o Spring Boot fornece várias opções para implementar clientes HTTP em microsserviços, incluindo RestTemplate, WebClient e Feign. RestTemplate é um cliente simples e amplamente utilizado que fornece comunicação HTTP síncrona. O WebClient é uma alternativa mais moderna e reativa que fornece comunicação HTTP sem bloqueio com uma API de estilo funcional. Feign é um cliente declarativo e type-safe que gera código baseado em definições de API, fornecendo uma interface fácil de usar para microsserviços RESTful.
Ao escolher qual cliente HTTP usar, é importante considerar os requisitos do seu microsserviço, como desempenho, escalabilidade e facilidade de uso. RestTemplate é uma boa escolha para casos de uso simples que requerem comunicação síncrona. O WebClient é uma boa opção para casos de uso reativos e sem bloqueio que exigem alto desempenho e escalabilidade. Feign é uma boa escolha para casos de uso declarativos e de tipo seguro que exigem uma API simplificada e uma experiência de desenvolvedor aprimorada.
Independentemente de qual cliente HTTP você escolher, é importante escrever testes de integração para garantir que seu microsserviço se comporte corretamente ao interagir com serviços externos. Ao testar seus clientes HTTP, você pode garantir que seu microsserviço se comporte conforme o esperado em diferentes cenários, como falhas de rede ou respostas inesperadas de serviços externos.
Você pode encontrar meus exemplos de implementação de diferentes maneiras de escrever clientes HTTP no meu GitHub: Foto de no