{"id":1912,"date":"2017-02-28T20:13:58","date_gmt":"2017-02-28T19:13:58","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=1912"},"modified":"2023-06-07T15:25:23","modified_gmt":"2023-06-07T13:25:23","slug":"microservices-legolizing-software-development-2","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-2\/","title":{"rendered":"Microservices &#8211; Legolizing Software Development II"},"content":{"rendered":"<p style=\"text-align: justify;\">Welcome to part two of our microservices series. If you\u2019ve missed a previous post you can read it here:<\/p>\n<p style=\"text-align: justify;\">I)<a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-1\/\"> Architecture<br \/>\n<\/a>II) <a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-2\/\">Caching<br \/>\n<\/a>III) <a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-3\/\">Security<br \/>\n<\/a>IV) <a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-4\/\">Continuous Integration<br \/>\n<\/a>V) <a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-5\/\">Lessons Learned<\/a><\/p>\n<h1 style=\"text-align: justify;\">Caching<\/h1>\n<p style=\"text-align: justify;\">The microservice structure can generate a heavy communication between many services. Worst case scenario is a long tail of dependencies, resulting in a high latency of the response for the initial request. This can get even worse, e.g. if the services were running on different servers placed in various data centers. Even if some requests can run parallel, the response time for the initial requested service will take at least the answering time of the tail it depends on.<\/p>\n<p><!--more--><\/p>\n<figure style=\"width: 1123px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1919\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-2\/caching-01\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01.png\" data-orig-size=\"1123,665\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Caching &amp;#8211; 01\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01-1024x606.png\" class=\"aligncenter wp-image-1919 size-full\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01.png\" width=\"1123\" height=\"665\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01.png 1123w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01-300x178.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01-768x455.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01-1024x606.png 1024w\" sizes=\"auto, (max-width: 1123px) 100vw, 1123px\" \/><\/a><figcaption class=\"wp-caption-text\">Request Flow<\/figcaption><\/figure>\n<p style=\"text-align: justify;\">An examplary request flow: The user enters a website, which sends a GET request to a service A. The requested service depends on data of the services B and C, which can be requested in parallel. In turn, service C depends on data of service D. Due to the security setup, every service has to authorize the request by asking the auth service. In sum the single request of the user is followed by seven interservice requests.<\/p>\n<p style=\"text-align: justify;\">This leads to the question, what can we do to improve the response time?<\/p>\n<ol style=\"text-align: justify;\">\n<li>Skip the authentication for all services that don&#8217;t have to be accessed publicly and keep them only inside the architecture.<\/li>\n<li>Keep the login information, e.g. session keys, at every service in its own database.<\/li>\n<li>Cache every GET request if possible.<\/li>\n<\/ol>\n<figure style=\"width: 1123px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-02.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1920\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-2\/caching-02\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-02.png\" data-orig-size=\"1123,665\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Caching &amp;#8211; 02\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-02-1024x606.png\" class=\"wp-image-1920 size-full aligncenter\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-02.png\" width=\"1123\" height=\"665\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-02.png 1123w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-02-300x178.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-02-768x455.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-02-1024x606.png 1024w\" sizes=\"auto, (max-width: 1123px) 100vw, 1123px\" \/><\/a><figcaption class=\"wp-caption-text\">Partially cached request flow<\/figcaption><\/figure>\n<p style=\"text-align: justify;\">In this example, the user requested similar data with slightly changed parameters. The single services don&#8217;t have to communicate with the auth service anymore, because they cached the response from the first request. We reduced the seven interservice requests to only three.<\/p>\n<figure style=\"width: 1118px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-03.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1921\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-2\/caching-03\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-03.png\" data-orig-size=\"1118,665\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Caching &amp;#8211; 03\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-03-1024x609.png\" class=\"wp-image-1921 size-full aligncenter\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-03.png\" width=\"1118\" height=\"665\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-03.png 1118w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-03-300x178.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-03-768x457.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-03-1024x609.png 1024w\" sizes=\"auto, (max-width: 1118px) 100vw, 1118px\" \/><\/a><figcaption class=\"wp-caption-text\">Full cached request flow<\/figcaption><\/figure>\n<p style=\"text-align: justify;\">Now let\u2019s assume service A processes some raw data from the other services and the user sends a third request with changed parameters that only affects this processing. Service A has still cached the Auth response and the raw data responses of the other services. It can now simply process the cached results and answer the initial request directly. In this round, we don&#8217;t need any interservice communication.<\/p>\n<p style=\"text-align: justify;\">Summing up the examples, we can see how to improve the response latency and reduce the communication overhead a microservices architecture generates. Of course, the caching could be implemented in every interface, but it might be a good solution to use REST and HTTP as protocol, because it already implements it.<\/p>\n<p style=\"text-align: justify;\">Additionally, we have some nice side effects.<\/p>\n<ol style=\"text-align: justify;\">\n<li>The service which sends the response, can decide if and how long the data is\u00a0cacheable. It might also be useful to implement a delete cache interface for\u00a0every service, to clear caches that expired earlier.<\/li>\n<li>Database access can be reduced, if we cache data that might be requested repeatedly.<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">Security is a topic that always occurs with microservices. In the next blog post we will\u00a0present\u00a0our solution for managing both, authentication and authorisation at one single point.<br \/>\n<a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-3\/\">Continue with Part III &#8211; Security<\/a><\/p>\n<hr \/>\n<p style=\"text-align: justify;\">Kost, Christof [<a href=\"mailto:ck154@hdm-stuttgart.de\">ck154@hdm-stuttgart.de<\/a>]<br \/>\nKuhn, Korbinian [<a href=\"mailto:kk129@hdm-stuttgart.de\">kk129@hdm-stuttgart.de<\/a>]<br \/>\nSchelling, Marc [<a href=\"mailto:ms467@hdm-stuttgart.de\">ms467@hdm-stuttgart.de<\/a>]<br \/>\nMauser, Steffen [<a href=\"mailto:sm182@hdm-stuttgart.de\">sm182@hdm-stuttgart.de<\/a>]<br \/>\nVaratharajah, Calieston\u00a0[<a href=\"mailto:cv015@hdm-stuttgart.de\">cv015@hdm-stuttgart.de<\/a>]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Part two will take a closer look on how caching improves the heavy and frequent communication within our setup.<\/p>\n","protected":false},"author":193,"featured_media":1919,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[651,2],"tags":[92,91],"ppma_author":[718],"class_list":["post-1912","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-system-designs","category-system-engineering","tag-caching","tag-microservices"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01.png","jetpack-related-posts":[{"id":1967,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-3\/","url_meta":{"origin":1912,"position":0},"title":"Microservices \u2013 Legolizing Software Development III","author":"Calieston Varatharajah, Christof Kost, Korbinian Kuhn, Marc Schelling, Steffen Mauser","date":"28. February 2017","format":false,"excerpt":"Security is a topic that always occurs with microservices. We\u2019ll present our solution for managing both, authentication and authorization at one single point.","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/auth_login_gesamt03.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/auth_login_gesamt03.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/auth_login_gesamt03.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/auth_login_gesamt03.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/auth_login_gesamt03.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/auth_login_gesamt03.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1915,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-5\/","url_meta":{"origin":1912,"position":1},"title":"Microservices &#8211; Legolizing Software Development V","author":"Korbinian Kuhn, Steffen Mauser","date":"28. February 2017","format":false,"excerpt":"We finish with a concluding review about the use of microservices in small projects and give an overview about our top stumbling blocks.","rel":"","context":"In &quot;System Designs&quot;","block_context":{"text":"System Designs","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1907,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-1\/","url_meta":{"origin":1912,"position":2},"title":"Microservices &#8211; Legolizing Software Development I","author":"Korbinian Kuhn, Steffen Mauser","date":"28. February 2017","format":false,"excerpt":"In the first part, we present an example microservice structure, with multiple services, a foreign API interface and a reverse proxy that also allows load balancing.","rel":"","context":"In &quot;System Designs&quot;","block_context":{"text":"System Designs","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-01.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-01.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-01.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":23961,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/10\/microservices-any-good\/","url_meta":{"origin":1912,"position":3},"title":"Microservices &#8211; any good?","author":"Kim Bastiaanse","date":"10. February 2023","format":false,"excerpt":"As software solutions continue to evolve and grow in size and complexity, the effort required to manage, maintain and update them increases. To address this issue, a modular and manageable approach to software development is required.\u00a0Microservices architecture provides a solution by breaking down applications into smaller, independent services that can\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Microservice.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":1924,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-4\/","url_meta":{"origin":1912,"position":4},"title":"Microservices \u2013 Legolizing Software Development IV","author":"Calieston Varatharajah, Christof Kost, Korbinian Kuhn, Marc Schelling, Steffen Mauser","date":"28. February 2017","format":false,"excerpt":"An automated development environment will save you. We explain how we set up Jenkins, Docker and Git to work seamlessly together.","rel":"","context":"In &quot;System Designs&quot;","block_context":{"text":"System Designs","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/draw_io_docker_small-1024x439.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/draw_io_docker_small-1024x439.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/draw_io_docker_small-1024x439.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":28364,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/02\/19\/monolith-vs-micro-services-back-to-the-future-with-modular-monolith\/","url_meta":{"origin":1912,"position":5},"title":"Monolith vs. Micro Services &#8211; Back to the future with modular monolith","author":"Leon Obertopp","date":"19. February 2026","format":false,"excerpt":"Anmerkung: Dieser Blogpost wurde f\u00fcr das Modul Enterprise IT (113601a) verfasst. Einleitung: In den vergangen Jahren war die Microservice-Architektur in vielen Unternehmen fast alternativlos. Die grundlegende Idee von Microservices ist es, Anwendungen in kleine, unabh\u00e4ngige Dienste zu zerlegen, welche separat entwickelt, skaliert und deployed werden k\u00f6nnen. Dieser Ansatz soll flexible\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/Pasted_image_20260214135003.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/Pasted_image_20260214135003.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/Pasted_image_20260214135003.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":718,"user_id":193,"is_guest":0,"slug":"kk129","display_name":"Korbinian Kuhn, Steffen Mauser","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/e55f12f0048e76d004529e6da31f8f5fe030917ab31166bd5df95af51bc7e234?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/1912","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/193"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=1912"}],"version-history":[{"count":33,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/1912\/revisions"}],"predecessor-version":[{"id":2253,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/1912\/revisions\/2253"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media\/1919"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=1912"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=1912"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=1912"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=1912"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}