Introdução
Neste tutorial, você aprenderá a criar microserviços utilizando o framework Micronaut, que se destaca por sua eficiência e leveza em aplicações Java. Vamos passar pelo ciclo de desenvolvimento completo, desde a configuração inicial do projeto até a implementação de testes automatizados. Micronaut é altamente otimizado para construção de microserviços, utilizando injeção de dependências a compile-time, o que reduz consideravelmente o tempo de inicialização e o consumo de memória. Este guia é voltado para desenvolvedores que querem explorar práticas modernas no desenvolvimento de software e integrar ferramentas populares de maneira fluida.
Etapas
Configuração do Ambiente de Desenvolvimento
Certifique-se de ter o JDK (Java Development Kit) e o SDK do Micronaut instalados em sua máquina. Verifique as versões instaladas com os comandos `java -version` e `mn –version`. Se o Micronaut não estiver instalado, você pode instalar usando o SDKMAN! ou outros métodos disponíveis na documentação oficial do Micronaut.
commands# Verificar versões instaladas
java -version
mn --versionCriação do Projeto Micronaut
Use o comando do Micronaut para gerar um novo projeto com as dependências necessárias. Defina o nome do projeto como `micronaut-demo`. Adicione a dependência ‘micronaut-http-client’ para permitir chamadas HTTP internas e ‘micronaut-data-hibernate-jpa’ para integração com bancos de dados.
commandsmn create-app micronaut-demo --features http-client,data-jpa,h2
Configuração do Banco de Dados H2
Modifique o arquivo `src/main/resources/application.yml` para configurar as propriedades do banco de dados H2 e setar o modo de console web.
application.ymlmicronaut: application: name: micronaut-demo datasource: default: driverClassName: org.h2.Driver url: jdbc:h2:mem:default;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE username: sa password: dialect: H2 hikari: maximum-pool-size: 5
Criação da Entidade `Produto`
Implemente a classe modelo `Produto` que representará os produtos na aplicação usando anotações JPA para mapear a classe à tabela do banco de dados.
Produto.javapackage com.example.micronautdemo.model; import io.micronaut.data.annotationid; import io.micronaut.data.model.primaryKey; import javax.persistence.*; @Entity @Table(name = "produtos") public class Produto { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(nullable = false) private String nome; @Column(nullable = false) private Double preco; // Getters e Setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public Double getPreco() { return preco; } public void setPreco(Double preco) { this.preco = preco; } }
Criação do Repositório `ProdutoRepository`
Implemente a interface `ProdutoRepository`, que estende `CrudRepository` do Micronaut Data, permitindo acesso à camada de persistência.
ProdutoRepository.javapackage com.example.micronautdemo.repository; import com.example.micronautdemo.model.Produto; import io.micronaut.data.annotation.Repository; import io.micronaut.data.repository.CrudRepository; @Repository public interface ProdutoRepository extends CrudRepository<Produto, Long> { // Métodos personalizados podem ser definidos aqui }
Implementação do Serviço `ProdutoService`
Crie a classe `ProdutoService`, que contém a lógica de negócios e utiliza o `ProdutoRepository` para interagir com o banco de dados.
ProdutoService.javapackage com.example.micronautdemo.service; import com.example.micronautdemo.model.Produto; import com.example.micronautdemo.repository.ProdutoRepository; import jakarta.inject.Singleton; import java.util.List; @Singleton public class ProdutoService { private final ProdutoRepository produtoRepository; public ProdutoService(ProdutoRepository produtoRepository) { this.produtoRepository = produtoRepository; } public List<Produto> findAll() { return produtoRepository.findAll(); } public Optional<Produto> findById(Long id) { return produtoRepository.findById(id); } public Produto save(Produto produto) { return produtoRepository.save(produto); } public void deleteById(Long id) { produtoRepository.deleteById(id); } }
Implementação do Controlador `ProdutoController`
Crie a classe `ProdutoController` para expor os endpoints da API, permitindo operações CRUD.
ProdutoController.javapackage com.example.micronautdemo.controller; import com.example.micronautdemo.model.Produto; import com.example.micronautdemo.service.ProdutoService; import io.micronaut.http.annotation.*; import java.util.List; @Controller("/produtos") public class ProdutoController { private final ProdutoService produtoService; public ProdutoController(ProdutoService produtoService) { this.produtoService = produtoService; } @GetMapping public List<Produto> getAllProdutos() { return produtoService.findAll(); } @GetMapping("/{id}") public Optional<Produto> getProdutoById(@PathVariable Long id) { return produtoService.findById(id); } @PostMapping public Produto createProduto(@Body Produto produto) { return produtoService.save(produto); } @DeleteMapping("/{id}") public void deleteProduto(@PathVariable Long id) { produtoService.deleteById(id); } }
Implementação de Testes Unitários
Crie a classe de testes `ProdutoServiceTest` para validar a lógica de negócios e operações CRUD da aplicação utilizando Micronaut Test.
ProdutoServiceTest.javapackage com.example.micronautdemo.service; import com.example.micronautdemo.model.Produto; import com.example.micronautdemo.repository.ProdutoRepository; import io.micronaut.test.extensions.junit5.annotation.MicronautTest; import jakarta.inject.Inject; import org.junit.jupiter.api.Test; import static org.mockito.Mockito.*; import static org.junit.jupiter.api.Assertions.*; import java.util.Collections; @MicronautTest public class ProdutoServiceTest { @Inject private ProdutoService produtoService; @Inject private ProdutoRepository produtoRepository; @Test public void testFindAll() { when(produtoRepository.findAll()).thenReturn(Collections.singletonList(new Produto())); List<Produto> produtos = produtoService.findAll(); assertEquals(1, produtos.size()); } // Testes adicionais para os métodos findById, save e deleteById }
Executando a Aplicação e Testes
Use o Gradle para compilar e executar a aplicação. Em seguida, utilize ferramentas como Postman ou cURL para testar os endpoints da API.
commands# Compilar e executar a aplicação
./gradlew run
# Executar os testes unitários
./gradlew testcurl_examples# Listar todos os produtos
curl -X GET http://localhost:8080/produtos
# Criar um novo produto
curl -X POST -H "Content-Type: application/json" -d '{"nome":"Novo Produto", "preco":99.99}' http://localhost:8080/produtos
Conclusão
Neste tutorial, você aprendeu a desenvolver microserviços eficientes utilizando Micronaut, cobrindo todo o processo, desde a configuração do ambiente até a implementação de testes unitários. Através desse guia, você obteve experiência em práticas modernas que promovem a escalabilidade e a performance das suas aplicações Java. Com o Micronaut como seu aliado, você pode explorar ainda mais a criação de microserviços e expandir suas habilidades no desenvolvimento de software.