Annotation-based configuration
@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}"}
)
)
public interface ProductClient {
@GetMapping("/api/v1/products/{id}")
ProductDto getProduct(@PathVariable("id") String id);
}
Property-based configuration
middleware:
client:
defaultMaxConcurrent: 25
registry-endpoint: "http://registry.local"
product:
enabled: true
connection:
timeout: 20000
maxConnections: 30
maxConcurrentCalls: 80
circuit:
enabled: true
failureRateThreshold: 40
minimumNumberOfCalls: 8
slidingWindowSize: 16
waitDurationInOpenStateMs: 8000