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