Introdução à Arquitetura de Microsserviços em Java
O desenvolvimento moderno de software está cada vez mais se afastando de soluções monolíticas em favor da arquitetura de microsserviços. Java, devido à sua maturidade, enorme comunidade e frameworks poderosos (Spring Boot, Micronaut, Quarkus), é uma das melhores linguagens para construir microsserviços. Neste artigo, vamos analisar a arquitetura de microsserviços em Java, desde os fundamentos teóricos até a implementação prática com exemplos de código.
Microsserviços são uma abordagem onde a aplicação é construída como um conjunto de serviços pequenos e implantados de forma independente. Cada serviço implementa uma função de negócio, possui seu próprio armazenamento de dados e se comunica com outros serviços através de protocolos leves (geralmente HTTP/REST ou mensagens).
Princípios-chave da Arquitetura de Microsserviços
1. Responsabilidade Única (Single Responsibility)
Cada microsserviço é responsável por exatamente uma capacidade de negócio. Por exemplo, o serviço de pedidos não deve saber sobre precificação — para isso, existe um serviço separado.
2. Implantação Independente
Você deve ser capaz de atualizar um serviço sem parar toda a aplicação. Isso é alcançado através de versionamento de API e conteinerização.
3. Gerenciamento Descentralizado de Dados
Cada serviço possui seu próprio banco de dados. Isso evita acoplamentos rígidos entre módulos e permite escolher o SGBD mais adequado para cada tarefa (por exemplo, PostgreSQL para pedidos e MongoDB para catálogo de produtos).
4. Resiliência a Falhas
A falha de um serviço não deve causar a queda de todo o sistema. Use os padrões Circuit Breaker, Retry e Bulkhead.
Implementação Prática: Stack de Tecnologias Java
Para criar microsserviços em Java, usaremos uma stack popular:
- Spring Boot 3.x — base para criação rápida de serviços REST
- Spring Cloud — para descoberta de serviços (Eureka), configuração (Config Server) e gateways de API (Gateway)
- Docker — conteinerização de cada serviço
- RabbitMQ / Kafka — para comunicação assíncrona
- PostgreSQL / MongoDB — bancos de dados à escolha
Exemplo: Microsserviço Simples com Spring Boot
Vamos criar um microsserviço básico para gerenciamento de usuários:
// UserServiceApplication.javapackage com.example.userservice;
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication@EnableDiscoveryClientpublic class UserServiceApplication { public static void main(String[] args) { SpringApplication.run(UserServiceApplication.class, args); }}
// UserController.java@RestController@RequestMapping("/api/users")public class UserController {
@Autowired private UserService userService;
@GetMapping("/{id}") public ResponseEntity<User> getUser(@PathVariable Long id) { return userService.findById(id) .map(ResponseEntity::ok) .orElse(ResponseEntity.notFound().build()); }
@PostMapping public ResponseEntity<User> createUser(@RequestBody User user) { User saved = userService.save(user); return ResponseEntity.status(HttpStatus.CREATED).body(saved); }}
// UserService.java@Servicepublic class UserService { @Autowired private UserRepository repository;
public Optional<User> findById(Long id) { return repository.findById(id); }
public User save(User user) { return repository.save(user); }}Comunicação entre Serviços: REST e Mensagens Assíncronas
Microsserviços se comunicam de duas maneiras principais: