Spring Boot Microservices

A arquitetura de microservices (ou microsserviços) tornou-se um dos paradigmas mais utilizados na engenharia de software moderna, principalmente em sistemas distribuídos e de larga escala.
Ela propõe a divisão de uma aplicação monolítica em múltiplos serviços independentes, autônomos e escaláveis, que se comunicam entre si por meio de APIs bem definidas (geralmente REST ou mensageria).
O Spring Boot, em conjunto com o Spring Cloud, forma o ecossistema Java mais completo e maduro para implementação de microservices. Ele abstrai boa parte da complexidade envolvida em tópicos como descoberta de serviços, configuração centralizada, tolerância a falhas, comunicação assíncrona e observabilidade.
Um microservice é uma unidade de negócio isolada, executada de forma independente, responsável por um conjunto coeso de funcionalidades.
Cada serviço deve:
| Aspecto | Monólito | Microservices |
|---|---|---|
| Implantação | Única aplicação | Múltiplas aplicações |
| Escalabilidade | Global (todo o sistema) | Individual por serviço |
| Comunicação | Interna (métodos) | API / Mensageria |
| Isolamento de falhas | Baixo | Alto |
| Tempo de build/deploy | Longo | Curto (por serviço) |
| Complexidade de infraestrutura | Baixa | Alta |
O Spring Boot simplifica a criação de aplicações Java baseadas em Spring, eliminando a necessidade de configurações extensas.
Já o Spring Cloud adiciona o suporte completo à infraestrutura de microsserviços distribuídos.
| Módulo | Função |
|---|---|
| Spring Cloud Config | Configuração centralizada (Config Server e Client) |
| Spring Cloud Netflix Eureka | Registro e descoberta de serviços |
| Spring Cloud Gateway | API Gateway e roteamento |
| Spring Cloud OpenFeign | Comunicação HTTP declarativa entre serviços |
| Spring Cloud Sleuth & Zipkin | Rastreamento distribuído |
| Spring Cloud Circuit Breaker / Resilience4j | Resiliência e tolerância a falhas |
| Spring Cloud Bus | Propagação de eventos entre serviços (mensageria) |
Um ecossistema típico baseado em Spring Boot + Spring Cloud pode conter:
TEXT├── config-server│ └── src/main/java/... (central de configuração)├── discovery-server (Eureka)│ └── src/main/java/... (registro de serviços)├── api-gateway│ └── src/main/java/... (roteamento de APIs)├── user-service│ └── src/main/java/... (serviço de usuários)├── order-service│ └── src/main/java/... (serviço de pedidos)└── common-libs└── src/main/java/... (DTOs, exceptions, utils)
Cada serviço é um projeto Spring Boot isolado, versionado e implantado de forma independente.
Gerando o projeto user-service.
JAVA@Entity@Table(name = "tb_users")public class User {@Id@GeneratedValue(strategy = GenerationType.UUID)private UUID id;private String name;private String email;}
JAVApublic interface UserRepository extends JpaRepository<User, UUID> {Optional<User> findByEmail(String email);}@Servicepublic class UserService {@Autowiredprivate UserRepository repository;public User save(User user) {return repository.save(user);}public List<User> findAll() {return repository.findAll();}}
JAVA@RestController@RequestMapping("/users")public class UserController {private final UserService service;public UserController(UserService service) {this.service = service;}@GetMappingpublic ResponseEntity<List<User>> getAll() {return ResponseEntity.ok(service.findAll());}@PostMappingpublic ResponseEntity<User> save(@RequestBody User user) {return ResponseEntity.status(HttpStatus.CREATED).body(service.save(user));}}
JAVA@FeignClient(name = "order-service")public interface OrderClient {@GetMapping("/orders/user/{userId}")List<OrderResponse> getOrdersByUser(@PathVariable UUID userId);}
E no application.yml:
YAMLspring:application:name: user-serviceeureka:client:service-url:defaultZone: <http://localhost:8761/eureka/>
Com isso, o user-service pode consultar dinamicamente o order-service registrado no Eureka Server.
O Spring Cloud oferece integração com o Resilience4j para aplicar padrões como Circuit Breaker, Retry e Rate Limiter.
JAVA@CircuitBreaker(name = "orderServiceCB", fallbackMethod = "fallbackOrders")public List<OrderResponse> getOrders(UUID userId) {return orderClient.getOrdersByUser(userId);}public List<OrderResponse> fallbackOrders(UUID userId, Throwable ex) {return List.of();}
Fornece métricas prontas:
TEXT/actuator/health/actuator/metrics/actuator/prometheus
Permitem rastrear uma requisição entre múltiplos microservices, gerando trace IDs e span IDs que ajudam a entender gargalos e latência.
YAMLspring:zipkin:base-url: <http://localhost:9411>sleuth:sampler:probability: 1.0
Para reduzir acoplamento e garantir resiliência, muitos sistemas Spring Cloud utilizam mensageria.
JAVA@Componentpublic class UserProducer {private final RabbitTemplate template;public UserProducer(RabbitTemplate template) {this.template = template;}public void sendUserCreatedEvent(User user) {template.convertAndSend("user.exchange", "user.created", user);}}
No application.yml:
YAMLspring:rabbitmq:host: localhostusername: guestpassword: guest
| Padrão | Descrição |
|---|---|
| API Gateway | Centraliza o tráfego e roteamento entre clientes e serviços |
| Service Registry (Eureka) | Registro e descoberta dinâmica de serviços |
| Config Server | Configurações centralizadas e versionadas |
| Circuit Breaker | Evita falhas em cascata |
| Bulkhead | Isola recursos para evitar colapsos globais |
| Saga / Outbox | Coordena consistência entre múltiplos bancos de dados |
| Event-Driven Architecture | Usa eventos assíncronos para comunicação entre domínios |
Em ambientes modernos, os microservices são containerizados com Docker e orquestrados por Kubernetes.
DOCKERFROM openjdk:21-jdk-slimWORKDIR /appCOPY target/user-service.jar app.jarENTRYPOINT ["java","-jar","app.jar"]
YAMLapiVersion: apps/v1kind: Deploymentmetadata:name: user-servicespec:replicas: 2selector:matchLabels:app: user-servicetemplate:metadata:labels:app: user-servicespec:containers:- name: user-serviceimage: rafael/user-service:1.0.0ports:- containerPort: 8080
Desenvolver microservices com Spring Boot e Spring Cloud oferece flexibilidade, escalabilidade e robustez, mas também demanda maturidade arquitetural, automação, e boas práticas de design.
Ao adotar esses padrões — como configuração centralizada, service discovery, gateway, resiliência e observabilidade — é possível construir um ecossistema Java moderno, de alta disponibilidade e preparado para a nuvem.
Dica: comece pequeno. Migre funcionalidades de um monólito gradualmente, valide comunicação, monitore desempenho e evolua o ecossistema aos poucos.
O que achou deste artigo?
Gostou do conteúdo?
Se este conteúdo te ajudou de alguma forma, considere fazer uma doação. Seu apoio me ajuda a continuar criando conteúdo de qualidade!