{"id":3826,"date":"2025-12-24T10:00:53","date_gmt":"2025-12-24T15:00:53","guid":{"rendered":"https:\/\/www.mymiller.name\/wordpress\/?p=3826"},"modified":"2025-12-24T10:00:53","modified_gmt":"2025-12-24T15:00:53","slug":"resilient-gateways-implementing-circuit-breakers-for-spring-data-rest-services-with-spring-cloud-gateway","status":"publish","type":"post","link":"https:\/\/www.mymiller.name\/wordpress\/spring-gateway\/resilient-gateways-implementing-circuit-breakers-for-spring-data-rest-services-with-spring-cloud-gateway\/","title":{"rendered":"Resilient Gateways: Implementing Circuit Breakers for Spring Data REST Services with Spring Cloud Gateway"},"content":{"rendered":"\n<div class=\"wp-block-jetpack-markdown\"><p>In a microservice architecture, services inevitably encounter transient failures \u2013 network hiccups, temporary overload, or slow responses from dependencies. Without proper handling, these failures can cascade, leading to a degraded user experience and even system-wide outages. This is where the <strong>circuit breaker<\/strong> pattern comes into play, providing a mechanism to prevent cascading failures and allow failing services time to recover.<\/p>\n<p>Spring Cloud Gateway, your intelligent traffic cop for microservices, seamlessly integrates with circuit breaker implementations like Resilience4j to provide robust protection for your backend services, including those exposed via Spring Data REST.<\/p>\n<p>This article will guide you through the process of integrating a circuit breaker into your Spring Cloud Gateway to safeguard your Spring Data REST service.<\/p>\n<p><strong>Scenario:<\/strong><\/p>\n<p>Imagine you have a Spring Data REST service named <code>product-service<\/code> that exposes product information. Your Spring Cloud Gateway acts as the entry point for client applications. You want to implement a circuit breaker in the gateway to handle potential failures in <code>product-service<\/code>.<\/p>\n<p><strong>Prerequisites:<\/strong><\/p>\n<ul>\n<li>\n<p>A running Spring Cloud Gateway application.<\/p>\n<\/li>\n<li>\n<p>A running Spring Data REST service (<code>product-service<\/code>).<\/p>\n<\/li>\n<li>\n<p>You\u2019ve added the necessary dependencies for Spring Cloud Gateway and a circuit breaker implementation (like Resilience4j) to your Gateway\u2019s <code>pom.xml<\/code> or <code>build.gradle<\/code>:<\/p>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.cloud&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-cloud-starter-gateway&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n\n&lt;dependency&gt;\n    &lt;groupId&gt;io.github.resilience4j&lt;\/groupId&gt;\n    &lt;artifactId&gt;resilience4j-spring-boot3&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n\n&lt;dependency&gt;\n    &lt;groupId&gt;io.github.resilience4j&lt;\/groupId&gt;\n    &lt;artifactId&gt;resilience4j-timelimiter&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n<\/code><\/pre>\n<pre><code class=\"language-gradle\">\/\/ Spring Cloud Gateway\nimplementation 'org.springframework.cloud:spring-cloud-starter-gateway'\n\n\/\/ Resilience4j Circuit Breaker\nimplementation 'io.github.resilience4j:resilience4j-spring-boot3'\n\n\/\/ (Optional) Resilience4j TimeLimiter if you want to enforce timeouts\nimplementation 'io.github.resilience4j:resilience4j-timelimiter'\n<\/code><\/pre>\n<\/li>\n<\/ul>\n<p><strong>Configuration in Spring Cloud Gateway<\/strong><\/p>\n<p>You can configure the circuit breaker using Spring Cloud Gateway\u2019s route predicates and filters in your <code>application.yml<\/code> or <code>application.properties<\/code>.<\/p>\n<p><strong>Using <code>CircuitBreaker<\/code> GatewayFilter Factory:<\/strong><\/p>\n<p>This is the most direct way to apply a circuit breaker to a specific route.<\/p>\n<pre><code class=\"language-yaml\">spring:\n  cloud:\n    gateway:\n      routes:\n        - id: product-service-route\n          uri: lb:\/\/product-service # Assuming you are using a service discovery like Eureka\n          predicates:\n            - Path=\/products\/**\n          filters:\n            - CircuitBreaker=productServiceCircuitBreaker,fallbackUri=forward:\/fallback\/products\n<\/code><\/pre>\n<p><strong>Explanation:<\/strong><\/p>\n<ul>\n<li><code>id: product-service-route<\/code>: A unique identifier for this route.<\/li>\n<li><code>uri: lb:\/\/product-service<\/code>: The URI of your Spring Data REST service. <code>lb:\/\/<\/code> indicates load balancing via service discovery (if configured). Replace with the direct URL if not using service discovery.<\/li>\n<li><code>predicates: - Path=\/products\/**<\/code>: This route will handle requests to paths starting with <code>\/products\/<\/code>.<\/li>\n<li><code>filters: - CircuitBreaker=productServiceCircuitBreaker,fallbackUri=forward:\/fallback\/products<\/code>: This applies the <code>CircuitBreaker<\/code> GatewayFilter Factory.\n<ul>\n<li><code>productServiceCircuitBreaker<\/code>: The name of the circuit breaker instance. You can configure its properties (failure rate, slow call rate, etc.) in your <code>application.yml<\/code>.<\/li>\n<li><code>fallbackUri=forward:\/fallback\/products<\/code>: Specifies a fallback URI to forward requests to when the circuit is open. This is crucial for providing a graceful degradation of service.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><strong>Defining Fallback Behavior:<\/strong><\/p>\n<p>You need to create a controller in your Spring Cloud Gateway application to handle the fallback requests.<\/p>\n<pre><code class=\"language-java\">import org.springframework.http.HttpStatus;\nimport org.springframework.http.ResponseEntity;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport java.util.Collections;\nimport java.util.Map;\n\n@RestController\n@RequestMapping(&quot;\/fallback&quot;)\npublic class ProductFallbackController {\n\n    @GetMapping(&quot;\/products&quot;)\n    public ResponseEntity&lt;Map&lt;String, String&gt;&gt; productServiceFallback() {\n        return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)\n                .body(Collections.singletonMap(&quot;message&quot;, &quot;Product service is currently unavailable. Please try again later.&quot;));\n    }\n\n    @GetMapping(&quot;\/products\/{id}&quot;)\n    public ResponseEntity&lt;Map&lt;String, String&gt;&gt; productByIdServiceFallback(String id) {\n        return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)\n                .body(Collections.singletonMap(&quot;message&quot;, &quot;Product service is currently unavailable for product ID: &quot; + id + &quot;. Please try again later.&quot;));\n    }\n}\n<\/code><\/pre>\n<p>This controller provides fallback responses for requests to <code>\/fallback\/products<\/code> and <code>\/fallback\/products\/{id}<\/code> when the <code>product-service<\/code> circuit is open. You can customize these responses to provide cached data, static messages, or redirect users.<\/p>\n<p><strong>Customizing Circuit Breaker Configuration:<\/strong><\/p>\n<p>You can configure the properties of your circuit breaker instance (<code>productServiceCircuitBreaker<\/code> in our example) in your <code>application.yml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">resilience4j:\n  circuitbreaker:\n    instances:\n      productServiceCircuitBreaker:\n        registerHealthIndicator: true\n        slidingWindowSize: 10\n        failureRateThreshold: 50\n        slowCallRateThreshold: 100\n        slowCallDurationThreshold: 2s\n        waitDurationInOpenState: 5s\n        permittedNumberOfCallsInHalfOpenState: 3\n        automaticTransitionFromOpenToHalfOpenEnabled: true\n<\/code><\/pre>\n<p><strong>Explanation of Configuration Properties:<\/strong><\/p>\n<ul>\n<li><code>registerHealthIndicator<\/code>: Exposes the circuit breaker state as a Spring Boot health indicator.<\/li>\n<li><code>slidingWindowSize<\/code>: The number of calls to consider in the sliding window for calculating failure rates.<\/li>\n<li><code>failureRateThreshold<\/code>: The percentage of failed calls that will open the circuit.<\/li>\n<li><code>slowCallRateThreshold<\/code>: The percentage of slow calls that will open the circuit.<\/li>\n<li><code>slowCallDurationThreshold<\/code>: The duration a call must exceed to be considered slow.<\/li>\n<li><code>waitDurationInOpenState<\/code>: The time the circuit will remain open before transitioning to the half-open state.<\/li>\n<li><code>permittedNumberOfCallsInHalfOpenState<\/code>: The number of requests allowed in the half-open state to test the service\u2019s recovery.<\/li>\n<li><code>automaticTransitionFromOpenToHalfOpenEnabled<\/code>: Automatically transitions from open to half-open after <code>waitDurationInOpenState<\/code>.<\/li>\n<\/ul>\n<p><strong>Using <code>ReactiveResilience4JCircuitBreakerFilterFactory<\/code> (More Granular Control):<\/strong><\/p>\n<p>For more fine-grained control, you can define your circuit breaker configuration as a bean and reference it in your route definition using the <code>ReactiveResilience4JCircuitBreakerFilterFactory<\/code>.<\/p>\n<pre><code class=\"language-java\">import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;\nimport io.github.resilience4j.timelimiter.TimeLimiterConfig;\nimport org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory;\nimport org.springframework.cloud.gateway.filter.factory.SpringCloudCircuitBreakerFilterFactory;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\nimport java.time.Duration;\n\n@Configuration\npublic class CircuitBreakerConfig {\n\n    @Bean\n    public ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory() {\n        ReactiveResilience4JCircuitBreakerFactory factory = new ReactiveResilience4JCircuitBreakerFactory();\n        CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom()\n                .failureRateThreshold(50)\n                .slowCallRateThreshold(80)\n                .slowCallDurationThreshold(Duration.ofSeconds(3))\n                .waitDurationInOpenState(Duration.ofSeconds(10))\n                .permittedNumberOfCallsInHalfOpenState(5)\n                .build();\n\n        TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()\n                .timeoutDuration(Duration.ofSeconds(5))\n                .build();\n\n        factory.configureDefault(id -&gt; new SpringCloudCircuitBreakerFilterFactory.Config(id)\n                .setCircuitBreakerConfig(circuitBreakerConfig)\n                .setTimeLimiterConfig(timeLimiterConfig)); \/\/ Optional: Add TimeLimiter\n        return factory;\n    }\n}\n<\/code><\/pre>\n<p>Then, in your <code>application.yml<\/code>:<\/p>\n<pre><code class=\"language-yaml\">spring:\n  cloud:\n    gateway:\n      routes:\n        - id: product-service-route\n          uri: lb:\/\/product-service\n          predicates:\n            - Path=\/products\/**\n          filters:\n            - name: ReactiveResilience4JCircuitBreaker\n              args:\n                name: productServiceCircuitBreaker\n                fallbackUri: forward:\/fallback\/products\n<\/code><\/pre>\n<p><strong>Monitoring Circuit Breaker State:<\/strong><\/p>\n<p>Resilience4j provides metrics that can be exposed via Spring Boot Actuator. Ensure you have the Actuator dependency:<\/p>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-boot-starter-actuator&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n<\/code><\/pre>\n<pre><code class=\"language-gradle\">implementation 'org.springframework.boot:spring-boot-starter-actuator'\n<\/code><\/pre>\n<p>You can then access the circuit breaker metrics (e.g., state, failure rate, buffered calls) via the <code>\/actuator\/metrics\/resilience4j.circuitbreaker.state<\/code> and other related endpoints.<\/p>\n<p><strong>Benefits of Using Circuit Breakers in Spring Cloud Gateway:<\/strong><\/p>\n<ul>\n<li><strong>Prevents Cascading Failures:<\/strong> Stops requests from overwhelming a failing service.<\/li>\n<li><strong>Improves System Resilience:<\/strong> Allows failing services time to recover without impacting the entire system.<\/li>\n<li><strong>Provides Graceful Degradation:<\/strong> Fallback mechanisms ensure a better user experience during outages.<\/li>\n<li><strong>Increases Application Stability:<\/strong> Contributes to a more robust and stable microservice ecosystem.<\/li>\n<\/ul>\n<p><strong>Conclusion:<\/strong><\/p>\n<p>Integrating a circuit breaker into your Spring Cloud Gateway is a crucial step towards building resilient microservices that interact with your Spring Data REST services. By using the <code>CircuitBreaker<\/code> or <code>ReactiveResilience4JCircuitBreaker<\/code> GatewayFilter Factories and configuring appropriate fallback mechanisms, you can significantly enhance the fault tolerance and overall stability of your distributed system. Remember to monitor your circuit breaker metrics to understand its behavior and fine-tune its configuration for optimal performance.<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":3486,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[464],"tags":[],"series":[],"class_list":["post-3826","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-spring-gateway"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/04\/ai-generated-8314612_640.jpg?fit=640%2C480&ssl=1","jetpack-related-posts":[{"id":3438,"url":"https:\/\/www.mymiller.name\/wordpress\/spring\/architecting-with-spring-and-spring-cloud\/","url_meta":{"origin":3826,"position":0},"title":"Architecting with Spring and Spring Cloud","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Building a Multi-Service Architecture with Spring 3.1.x and Spring Cloud: Unlocking the Power of Microservices In the ever-evolving landscape of software development, microservices have emerged as a powerful architectural paradigm, enabling organizations to build scalable, resilient, and agile applications. Spring, a widely adopted Java framework, provides a comprehensive suite of\u2026","rel":"","context":"In &quot;Spring&quot;","block_context":{"text":"Spring","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/field-5236879_640.jpg?fit=640%2C360&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/field-5236879_640.jpg?fit=640%2C360&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/field-5236879_640.jpg?fit=640%2C360&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3830,"url":"https:\/\/www.mymiller.name\/wordpress\/spring-gateway\/scaling-the-gatekeeper-load-balancing-multiple-instances-of-spring-cloud-gateway\/","url_meta":{"origin":3826,"position":1},"title":"Scaling the Gatekeeper: Load Balancing Multiple Instances of Spring Cloud Gateway","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"As your microservices ecosystem grows and traffic increases, a single instance of Spring Cloud Gateway might become a bottleneck or a single point of failure. To ensure high availability, fault tolerance, and improved performance, you\u2019ll likely need to run multiple instances of your Spring Cloud Gateway and load balance traffic\u2026","rel":"","context":"In &quot;Spring Gateway&quot;","block_context":{"text":"Spring Gateway","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring-gateway\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/network-3152677_640.jpg?fit=640%2C427&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/network-3152677_640.jpg?fit=640%2C427&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/network-3152677_640.jpg?fit=640%2C427&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3441,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_discovery\/spring-cloud-gateway-with-spring-cloud-discovery\/","url_meta":{"origin":3826,"position":2},"title":"Spring Cloud Gateway with Spring Cloud Discovery","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"Spring Cloud Gateway and Spring Cloud Discovery are powerful tools for building microservices architectures. Spring Cloud Gateway acts as an API gateway, routing requests to the appropriate microservices. Spring Cloud Discovery provides a registry for microservices, enabling dynamic service discovery and load balancing. In this comprehensive guide, we'll delve into\u2026","rel":"","context":"In &quot;Spring Discovery&quot;","block_context":{"text":"Spring Discovery","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_discovery\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/trees-2900064_640.jpg?fit=640%2C427&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/trees-2900064_640.jpg?fit=640%2C427&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2023\/11\/trees-2900064_640.jpg?fit=640%2C427&ssl=1&resize=525%2C300 1.5x"},"classes":[]},{"id":3828,"url":"https:\/\/www.mymiller.name\/wordpress\/spring-gateway\/load-balancing-your-microservices-configuring-spring-cloud-gateway-with-spring-discovery-server\/","url_meta":{"origin":3826,"position":3},"title":"Load Balancing Your Microservices: Configuring Spring Cloud Gateway with Spring Discovery Server","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"In a microservices architecture, ensuring high availability and distributing traffic evenly across multiple instances of a service is paramount. Spring Cloud Gateway, when integrated with a Spring Discovery Server (like Netflix Eureka, Consul, or Spring Cloud Service Registry), provides a powerful and straightforward way to achieve client-side load balancing without\u2026","rel":"","context":"In &quot;Spring Gateway&quot;","block_context":{"text":"Spring Gateway","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring-gateway\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/04\/meditation-3814069_1280.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/04\/meditation-3814069_1280.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/04\/meditation-3814069_1280.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/04\/meditation-3814069_1280.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/04\/meditation-3814069_1280.avif 3x"},"classes":[]},{"id":3647,"url":"https:\/\/www.mymiller.name\/wordpress\/spring\/centralized-api-documentation-with-spring-gateway-and-springdoc\/","url_meta":{"origin":3826,"position":4},"title":"Centralized API Documentation with Spring Gateway and Springdoc","author":"Jeffery Miller","date":"December 24, 2025","format":false,"excerpt":"In microservices architectures, where multiple services expose their own APIs, having centralized documentation is crucial for developers and consumers. Spring Gateway, acting as the API gateway, can be leveraged to aggregate and present documentation from various services in a unified manner using Springdoc. Let\u2019s explore how to achieve this. Prerequisites\u2026","rel":"","context":"In &quot;Spring&quot;","block_context":{"text":"Spring","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/08\/library-488683_1280-jpg.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/08\/library-488683_1280-jpg.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/08\/library-488683_1280-jpg.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/08\/library-488683_1280-jpg.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2024\/08\/library-488683_1280-jpg.avif 3x"},"classes":[]},{"id":3916,"url":"https:\/\/www.mymiller.name\/wordpress\/spring_shell\/streamlining-operations-leveraging-spring-shell-in-a-microservices-architecture\/","url_meta":{"origin":3826,"position":5},"title":"Streamlining Operations: Leveraging Spring Shell in a Microservices Architecture","author":"Jeffery Miller","date":"April 20, 2026","format":false,"excerpt":"Introduction: Taming the Microservices Beast In the world of modern software architecture, microservices have become the de facto standard for building scalable, resilient systems. However, this decentralized approach introduces a new challenge: operational complexity. Managing, diagnosing, and interacting with dozens or hundreds of independent services can quickly become overwhelming. While\u2026","rel":"","context":"In &quot;Spring Shell&quot;","block_context":{"text":"Spring Shell","link":"https:\/\/www.mymiller.name\/wordpress\/category\/spring_shell\/"},"img":{"alt_text":"","src":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/macbook-1711344_1280.avif","width":350,"height":200,"srcset":"https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/macbook-1711344_1280.avif 1x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/macbook-1711344_1280.avif 1.5x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/macbook-1711344_1280.avif 2x, https:\/\/www.mymiller.name\/wordpress\/wp-content\/uploads\/2025\/11\/macbook-1711344_1280.avif 3x"},"classes":[]}],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3826","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/comments?post=3826"}],"version-history":[{"count":1,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3826\/revisions"}],"predecessor-version":[{"id":3827,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/posts\/3826\/revisions\/3827"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media\/3486"}],"wp:attachment":[{"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/media?parent=3826"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/categories?post=3826"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/tags?post=3826"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/www.mymiller.name\/wordpress\/wp-json\/wp\/v2\/series?post=3826"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}