{"id":230129,"date":"2023-09-25T00:00:18","date_gmt":"2023-09-25T07:00:18","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/java\/?p=230129"},"modified":"2023-09-22T00:41:52","modified_gmt":"2023-09-22T07:41:52","slug":"reliable-web-app-pattern-on-azure-for-java","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/java\/reliable-web-app-pattern-on-azure-for-java\/","title":{"rendered":"Reliable Web App Pattern on Azure for Java"},"content":{"rendered":"<p><em>To help you understand and use the RWA pattern, we\u2019ve created a comprehensive collection of materials that describe it in full. You can review the\u00a0<\/em><a href=\"https:\/\/learn.microsoft.com\/azure\/architecture\/web-apps\/guides\/reliable-web-app\/java\/apply-pattern\"><em>documentation<\/em><\/a><em> and access the production-quality and ready-to-deploy web application &#8211; <\/em><a href=\"https:\/\/github.com\/Azure\/reliable-web-app-pattern-java#reliable-web-app-pattern-for-java\"><em>Reference Implementation<\/em><\/a><em>.<\/em><\/p>\n<h2>The Reliable Web App Pattern<\/h2>\n<p>We\u2019re excited to announce the release of a <a href=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\">new video series<\/a> on the Reliable Web App Pattern (RWA) using Java! The RWA pattern is intended to help developers successfully re-platform their Java apps to the cloud and set a foundation for future Java modernization in Azure.<\/p>\n<p>The Reliable Web App pattern builds on the Azure Well-Architected Framework to provide guidance on business and technical goals, focusing on low-cost, high-value wins. It supplies guidance on security, reliability design patterns, operational excellence, cost-optimized environments, and more.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/rwa-converge.png\"><img decoding=\"async\" class=\"alignnone size-full wp-image-230140\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/rwa-converge.png\" alt=\"Image rwa converge\" width=\"3840\" height=\"2161\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/rwa-converge.png 3840w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/rwa-converge-300x169.png 300w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/rwa-converge-1024x576.png 1024w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/rwa-converge-768x432.png 768w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/rwa-converge-1536x864.png 1536w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/rwa-converge-2048x1153.png 2048w\" sizes=\"(max-width: 3840px) 100vw, 3840px\" \/><\/a><\/p>\n<p>In other words, the RWA pattern gives you prescriptive guidance to get your application ready to successfully run on Azure with as little code changes to your existing application as possible.<\/p>\n<p>In this article we look at three of the most interesting and powerful patterns that are a core part of the Reliable Web App pattern \u2013 Retry, Circuit-breaker and Cache-Aside.<\/p>\n<h2>Retry Pattern<\/h2>\n<p>The Retry Pattern is one of the most critical principles of the Reliable Web App pattern. Imagine your application making a request to a service. Sometimes, the service might be temporarily unavailable, or, as we techies say, there might be a &#8216;transient fault&#8217;. Our superhero, the Retry pattern, comes to the rescue by resending failed requests to the service until it&#8217;s back up.<\/p>\n<p>The Retry Pattern isn&#8217;t about mindlessly resending requests, though. It&#8217;s about intelligent retries. This means that the pattern doesn&#8217;t just resend the requests blindly. Instead, it waits for a certain amount of time between each retry, giving the failing service a chance to recover. This delay, or &#8216;backoff&#8217;, can be fixed or it can increase exponentially with each retry, depending on your configuration.<\/p>\n<h3>Reference<\/h3>\n<p>The <a href=\"https:\/\/github.com\/Azure\/reliable-web-app-pattern-java\/blob\/main\/simulate-patterns.md\">reference implementation<\/a> uses the retry pattern heavily especially when it comes to dependencies on external resources!<\/p>\n<p>The code snippet below uses Resilience4j to retry a call to Azure Files until it successfully retrieves the last modified time.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture3.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-230132\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture3.jpg\" alt=\"Image Picture3\" width=\"1203\" height=\"1011\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture3.jpg 1203w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture3-300x252.jpg 300w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture3-1024x861.jpg 1024w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture3-768x645.jpg 768w\" sizes=\"(max-width: 1203px) 100vw, 1203px\" \/><\/a><\/p>\n<h2>Circuit Breaker Pattern<\/h2>\n<p>While the Retry Pattern is indispensable, it&#8217;s not enough on its own. In some cases, a service might be down for an extended period, or it might even be permanently unavailable. Continually trying to invoke such a service would be a waste of resources. That&#8217;s where the Circuit Breaker Pattern comes in.<\/p>\n<p>The Circuit Breaker Pattern works like an electrical circuit breaker. When everything is running smoothly, the circuit is &#8216;closed&#8217;, and requests can flow through. But when a certain failure threshold is reached, the circuit &#8216;opens&#8217;, and the flow of requests is stopped. This prevents your application from repeatedly trying to invoke a service that&#8217;s down, sparing it from wasting resources on futile attempts.<\/p>\n<p>Once the circuit is open, it doesn&#8217;t close at once. Instead, it enters a &#8216;half-open&#8217; state after a certain amount of time. In this state, a limited number of requests are allowed through. If these requests succeed, the circuit closes again. If they fail, the circuit stays open. This strategy allows the Circuit Breaker Pattern to adapt to the state of the service it&#8217;s invoking, supplying a dynamic and efficient fault-handling mechanism.<\/p>\n<h3>Reference Implementation<\/h3>\n<p>The reference implementation comes with an application configuration setting that lets you simulate and test a transient failure when making a web request to GitHub. This way you can see when the circuit breaker opens or closes due to failure threshold!<\/p>\n<h2>Cache-Aside Pattern<\/h2>\n<p>In addition to reliability, performance is another crucial factor that decides the success of your cloud re-platform journey. The Cache-Aside Pattern is a key player in ensuring the high performance of your Java application in the cloud.<\/p>\n<p>The Cache-Aside Pattern is a smart caching strategy. Instead of blindly caching everything, it caches data on demand. When a request for data arrives, the application first checks the cache. If the data is in the cache, it&#8217;s returned at once. If it&#8217;s not, the application queries the database, stores the result in the cache, and then returns it.<\/p>\n<p>This pattern ensures that your cache always has the most often requested data, maximizing its effectiveness. Moreover, by reducing the load on your database, it also contributes to the overall performance and scalability of your application.<\/p>\n<h3>Reference Implementation<\/h3>\n<p>In the <a href=\"https:\/\/github.com\/Azure\/reliable-web-app-pattern-java\/blob\/main\/simulate-patterns.md\">reference implementation<\/a>, the cache-aside pattern enables us to limit read queries to the Azure PostgreSQL Flexible Server. Later calls don\u2019t have to connect to the DB and instead use the data from Azure Cache for Redis. It also provides a layer of redundancy that can keep parts of our application running if there are issues with your Azure PostgreSQL Database.<\/p>\n<p>In the context of transitioning from on-premises to Azure Cloud, it&#8217;s crucial to be selective about what data gets cached. In our reference architecture, we don&#8217;t cache all data indiscriminately. Instead, we focus on caching user details and specific settings, a decision rooted in both performance and necessity. The reason for this selective caching is twofold. First, user details and settings are accessed frequently but change infrequently, making them ideal candidates for caching. This ensures that the application remains responsive, reducing latency by eliminating the need for constant database queries. Second, not all data has the same access patterns or the same impact on application performance. Caching everything would not only consume more resources but might also introduce complexity in ensuring data consistency. Therefore, understanding what to cache\u2014and why\u2014is essential for optimizing both the performance and reliability of your re-platformed application in Azure. For a more detailed dive into caching, see the recently published blog post on this: <a href=\"https:\/\/techcommunity.microsoft.com\/t5\/azure-developer-community-blog\/how-to-use-cache-for-re-platform-to-azure\/ba-p\/3920601\">How To Use Cache for Re-platform to Azure &#8211; Microsoft Community Hub<\/a>.<\/p>\n<h2>Security and Infrastructure Reliability Considerations<\/h2>\n<p>Security is baked right into our 3 patterns, not just tacked on as an afterthought. For example, our Retry Pattern leverages short-lived OAuth tokens for enhanced security. Similarly, the Circuit Breaker Pattern serves a dual purpose: it not only manages service failures but also acts as a rate limiter to fend off potential attacks. We&#8217;ve even implemented role-based access controls, designating &#8216;User&#8217; and &#8216;Creator&#8217; roles to govern app interactions. And rest assured, all sensitive data is securely stored in Azure Key Vault.<\/p>\n<p>When it comes to reliability, our reference implementation is designed to meet a stringent 99.9% Service Level Objective (SLO), it employs a two-region, active-passive setup. This isn&#8217;t just a random choice; it&#8217;s a strategic extension of the Circuit Breaker Pattern, aimed at handling regional outages. All traffic is funneled to the active region, eliminating the need for complex data management like event-based synchronization. If that region fails, a manual failover redirects traffic to the passive region. This setup not only aligns with the goal of minimal code changes but also synergizes well with our existing Retry and Cache-Aside Patterns.<\/p>\n<p><a href=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture4.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-230133\" src=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture4.jpg\" alt=\"Image Picture4\" width=\"1203\" height=\"584\" srcset=\"https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture4.jpg 1203w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture4-300x146.jpg 300w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture4-1024x497.jpg 1024w, https:\/\/devblogs.microsoft.com\/java\/wp-content\/uploads\/sites\/51\/2023\/09\/Picture4-768x373.jpg 768w\" sizes=\"(max-width: 1203px) 100vw, 1203px\" \/><\/a><\/p>\n<p><em>Download a\u00a0<\/em><a href=\"https:\/\/arch-center.azureedge.net\/reliable-web-app-java.vsdx\"><em>Visio file<\/em><\/a><em>\u00a0of this architecture<\/em><\/p>\n<h2>The Importance of Reliability Developer Patterns in Re-platforming<\/h2>\n<p>Before we wrap up, it&#8217;s crucial to emphasize that the reliability developer patterns we&#8217;ve discussed are not just optional add-ons; they&#8217;re a necessary first step in the re-platform story. Many developers who work in typical on-premises scenarios may not have felt the urgency to implement these patterns. However, the cloud environment presents a different set of challenges, notably transient failures.<\/p>\n<p>In an on-premises setup, your application might be running in a more controlled environment where you have better predictability over hardware and network stability. Moving to the cloud, on the other hand, means thinking about these transient failures proactively. You&#8217;ll likely be interacting with multiple services over a network, making your application more susceptible to sporadic issues that you have no control over. That&#8217;s why implementing reliability patterns such as Retry, Circuit-breaker, and Cache-Aside is a necessary first step for establishing future modernization on the cloud.<\/p>\n<p>By considering these patterns early on, you&#8217;re building a robust foundation that not only ensures the smooth functioning of your application today but also paves the way for easy adaptability to future Azure services and features. It sets you on the right course to reap the full benefits of modernization with minimal disruptions to your existing workflow.<\/p>\n<p>In summary, as you embark on your journey to re-platform your Java application on Azure, remember that adopting the Reliable Web App pattern and its core reliability developer patterns is more than just good practice; it&#8217;s essential for success.<\/p>\n<h3>Final Words<\/h3>\n<p>In this article, we&#8217;ve explored the core design patterns of the Reliable Web App pattern for Java, from handling transient and non-transient faults with the Retry and Circuit Breaker Patterns to improving performance with the Cache-Aside Pattern. Armed with these tools and our comprehensive collection of materials, you&#8217;re well-prepared to navigate the challenges of cloud re-platforming, ensuring your Java application not only survives the transition but also thrives in its new environment.<\/p>\n<h2>Relevant Links:<\/h2>\n<p>Reliable Web Pattern: <a href=\"https:\/\/learn.microsoft.com\/azure\/architecture\/web-apps\/guides\/reliable-web-app\/java\/plan-implementation\">https:\/\/learn.microsoft.com\/azure\/architecture\/web-apps\/guides\/reliable-web-app\/java\/plan-implementation<\/a><\/p>\n<p>Reference implementation: <a href=\"https:\/\/github.com\/Azure\/reliable-web-app-pattern-java\">https:\/\/github.com\/Azure\/reliable-web-app-pattern-java<\/a><\/p>\n<p>Reliable Web Apps Video Series:<\/p>\n<ul>\n<li><a class=\"fui-Link ___10kug0w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1hu3pq6 f11qmguv f19f4twv f1tyq0we f1g0x7ka fhxju0i f1qch9an f1cnd47f fqv5qza f1vmzxwi f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn\" title=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\" href=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Link https:\/\/aka.ms\/eap\/rwa\/java\/videos\">https:\/\/aka.ms\/eap\/rwa\/java\/videos<\/a><\/li>\n<li><a class=\"fui-Link ___10kug0w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1hu3pq6 f11qmguv f19f4twv f1tyq0we f1g0x7ka fhxju0i f1qch9an f1cnd47f fqv5qza f1vmzxwi f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn\" title=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/overview\" href=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/overview\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Link https:\/\/aka.ms\/eap\/rwa\/java\/videos\/overview\">https:\/\/aka.ms\/eap\/rwa\/java\/videos\/overview<\/a><\/li>\n<li><a class=\"fui-Link ___10kug0w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1hu3pq6 f11qmguv f19f4twv f1tyq0we f1g0x7ka fhxju0i f1qch9an f1cnd47f fqv5qza f1vmzxwi f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn\" title=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/reliability\" href=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/reliability\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Link https:\/\/aka.ms\/eap\/rwa\/java\/videos\/reliability\">https:\/\/aka.ms\/eap\/rwa\/java\/videos\/reliability<\/a><\/li>\n<li><a class=\"fui-Link ___10kug0w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1hu3pq6 f11qmguv f19f4twv f1tyq0we f1g0x7ka fhxju0i f1qch9an f1cnd47f fqv5qza f1vmzxwi f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn\" title=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/security\" href=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/security\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Link https:\/\/aka.ms\/eap\/rwa\/java\/videos\/security\">https:\/\/aka.ms\/eap\/rwa\/java\/videos\/security<\/a><\/li>\n<li><a class=\"fui-Link ___10kug0w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1hu3pq6 f11qmguv f19f4twv f1tyq0we f1g0x7ka fhxju0i f1qch9an f1cnd47f fqv5qza f1vmzxwi f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn\" title=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/costoptimization\" href=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/costoptimization\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Link https:\/\/aka.ms\/eap\/rwa\/java\/videos\/costoptimization\">https:\/\/aka.ms\/eap\/rwa\/java\/videos\/costoptimization<\/a><\/li>\n<li><a class=\"fui-Link ___10kug0w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1hu3pq6 f11qmguv f19f4twv f1tyq0we f1g0x7ka fhxju0i f1qch9an f1cnd47f fqv5qza f1vmzxwi f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn\" title=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/opexcellence\" href=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/opexcellence\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Link https:\/\/aka.ms\/eap\/rwa\/java\/videos\/opexcellence\">https:\/\/aka.ms\/eap\/rwa\/java\/videos\/opexcellence<\/a><\/li>\n<li><a class=\"fui-Link ___10kug0w f3rmtva f1ewtqcl fyind8e f1k6fduh f1w7gpdv fk6fouc fjoy568 figsok6 f1hu3pq6 f11qmguv f19f4twv f1tyq0we f1g0x7ka fhxju0i f1qch9an f1cnd47f fqv5qza f1vmzxwi f1o700av f13mvf36 f1cmlufx f9n3di6 f1ids18y f1tx3yz7 f1deo86v f1eh06m1 f1iescvh fhgqx19 f1olyrje f1p93eir f1nev41a f1h8hb77 f1lqvz6u f10aw75t fsle3fq f17ae5zn\" title=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/performance\" href=\"https:\/\/aka.ms\/eap\/rwa\/java\/videos\/performance\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"Link https:\/\/aka.ms\/eap\/rwa\/java\/videos\/performance\">https:\/\/aka.ms\/eap\/rwa\/java\/videos\/performance<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>To help you understand and use the RWA pattern, we\u2019ve created a comprehensive collection of materials that describe it in full. You can review the\u00a0documentation and access the production-quality and ready-to-deploy web application &#8211; Reference Implementation. The Reliable Web App Pattern We\u2019re excited to announce the release of a new video series on the Reliable [&hellip;]<\/p>\n","protected":false},"author":29534,"featured_media":227205,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-230129","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-java"],"acf":[],"blog_post_summary":"<p>To help you understand and use the RWA pattern, we\u2019ve created a comprehensive collection of materials that describe it in full. You can review the\u00a0documentation and access the production-quality and ready-to-deploy web application &#8211; Reference Implementation. The Reliable Web App Pattern We\u2019re excited to announce the release of a new video series on the Reliable [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/posts\/230129","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/users\/29534"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/comments?post=230129"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/posts\/230129\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/media\/227205"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/media?parent=230129"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/categories?post=230129"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/java\/wp-json\/wp\/v2\/tags?post=230129"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}