Middleware contract example
The core modules work together around annotation-driven contracts. A declarative client can
define connection, resilience, and security behavior through the api annotations,
while the app module handles runtime wiring.
@MiddlewareContract example
@MiddlewareContract(
name = "product",
connection = @MiddlewareContractConnection(
timeout = "${middleware.client.product.connection.timeout:30000}",
maxConnections = "${middleware.client.product.connection.max-connections:50}",
maxConcurrentCalls = "${middleware.client.product.connection.max-concurrent-calls:200}",
maxRetries = "${middleware.client.product.connection.max-retries:3}",
retryBackoffMillis = "${middleware.client.product.connection.retry-backoff-millis:1000}"
),
circuitBreaker = @MiddlewareCircuitBreaker(
enabled = "${middleware.client.product.circuit-breaker.enabled:true}",
failureRateThreshold = "${middleware.client.product.circuit-breaker.failure-rate-threshold:50}",
waitDurationInOpenStateMs = "${middleware.client.product.circuit-breaker.wait-duration-in-open-state-ms:10000}",
slidingWindowSize = "${middleware.client.product.circuit-breaker.sliding-window-size:20}",
minimumNumberOfCalls = "${middleware.client.product.circuit-breaker.minimum-number-of-calls:10}",
permittedNumberOfCallsInHalfOpenState = "${middleware.client.product.circuit-breaker.permitted-number-of-calls-in-half-open-state:3}",
statusShouldOpenBreaker = {"${middleware.client.product.circuit-breaker.status-should-open-breaker:5xx}"},
statusShouldIgnoreBreaker = {"${middleware.client.product.circuit-breaker.status-should-ignore-breaker:4xx}"}
),
security = "${middleware.client.product.security.type:API_KEY}"
)
public interface ProductApiClient {
@GetMapping("/api/v1/products/{id}")
ProductDto getProduct(@PathVariable("id") UUID id);
}