On this page
Spring Cloud Overview
Spring Cloud provides tools for building common patterns in distributed systems — configuration management, service discovery, circuit breakers, API gateways, and distributed tracing.
Core Components
| Component | Purpose |
|---|---|
| Spring Cloud Config | Centralized configuration |
| Spring Cloud Netflix Eureka | Service registry & discovery |
| Spring Cloud Gateway | API gateway |
| Spring Cloud OpenFeign | Declarative REST client |
| Spring Cloud Circuit Breaker | Fault tolerance (Resilience4j) |
| Spring Cloud Sleuth / Micrometer Tracing | Distributed tracing |
Microservice Architecture
┌─────────────┐
│ Gateway │
└──────┬──────┘
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Order Svc │ │ User Svc │ │ Product Svc │
└──────┬──────┘ └──────┬──────┘ └─────────────┘
│ │
└───────┬───────┘
▼
┌─────────────┐
│ Eureka │
│ (Registry) │
└─────────────┘
BOM Setup
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2023.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
OpenFeign — Service-to-Service Calls
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/api/users/{id}")
UserDto getUser(@PathVariable Long id);
}
@Service
public class OrderService {
private final UserClient userClient;
public OrderDto createOrder(CreateOrderRequest request) {
UserDto user = userClient.getUser(request.getUserId());
// create order with user info
}
}
Enable Feign:
@SpringBootApplication
@EnableFeignClients
public class OrderApplication { }
Circuit Breaker with Resilience4j
@Service
public class PaymentService {
@CircuitBreaker(name = "payment", fallbackMethod = "paymentFallback")
public PaymentResult processPayment(PaymentRequest request) {
return paymentClient.charge(request);
}
public PaymentResult paymentFallback(PaymentRequest request, Exception ex) {
return PaymentResult.pending("Payment service unavailable");
}
}
resilience4j:
circuitbreaker:
instances:
payment:
slidingWindowSize: 10
failureRateThreshold: 50
waitDurationInOpenState: 10s
Best Practices
- Use Spring Cloud BOM for consistent versions
- Externalize all config via Spring Cloud Config
- Implement circuit breakers for all remote calls
- Use API Gateway as single entry point
- Add distributed tracing for debugging microservices