{"id":1907,"date":"2017-02-28T20:06:16","date_gmt":"2017-02-28T19:06:16","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=1907"},"modified":"2023-06-07T15:25:14","modified_gmt":"2023-06-07T13:25:14","slug":"microservices-legolizing-software-development-1","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-1\/","title":{"rendered":"Microservices &#8211; Legolizing Software Development I"},"content":{"rendered":"<p style=\"text-align: justify;\">Welcome to our five-part series about microservices and a legolized software development. We\u2019d like to share our lessons learned about architecture, development environment and security considerations with you. We will also explain some issues we stumbled over and what solutions we chose to solve them.<\/p>\n<p style=\"text-align: justify;\">I) 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.<\/p>\n<p>II) Part two will take a closer look on how caching improves the heavy and frequent communication within our setup. <a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-2\/\">[read]<\/a><\/p>\n<p>III) Security is a topic that always occurs with microservices. We\u2019ll present our solution for managing both, authentication and authorization at one single point. <a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-3\/\">[read]<\/a><\/p>\n<p>IV) An automated development environment will save you. We explain how we set up Jenkins, Docker and Git to work seamlessly together. <a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-4\/\">[read]<\/a><\/p>\n<p>V) We finish with a concluding review about the use of microservices in small projects and give an overview about our top stumbling blocks.<span style=\"font-weight: 400;\">\u00a0<\/span><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-5\/\">[read]<\/a><\/p>\n<p><!--more--><\/p>\n<h1 style=\"text-align: justify;\">Example Architecture<\/h1>\n<p style=\"text-align: justify;\">Let\u2019s start with an example generic microservices architecture, containing a user website and a monitoring page for developers. The authentication and authorization is controlled by the Auth service. Furthermore, we have the four services A-D and one for monitoring. The red External Service could be a foreign API, which is connected by the External Service Mapper. The connection lines are purple, because all requests will be send over the Reverse Proxy, e.g. a Nginx server, which maps IPs and ports to static URLs.<\/p>\n<p style=\"text-align: justify;\">The questions we want to answer in this section:<\/p>\n<ol style=\"text-align: justify;\">\n<li>How do the services communicate with each other?<\/li>\n<li>How do we integrate external services into our system?<\/li>\n<li>Can we protect our services from unauthorized requests?<\/li>\n<li>How to handle all the monitoring?<\/li>\n<\/ol>\n<figure style=\"width: 684px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-01.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1927\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-1\/architecture-01\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-01.png\" data-orig-size=\"684,564\" 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=\"Architecture &amp;#8211; 01\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-01.png\" class=\"size-full wp-image-1927 aligncenter\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-01.png\" alt=\"\" width=\"684\" height=\"564\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-01.png 684w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-01-300x247.png 300w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \/><\/a><figcaption class=\"wp-caption-text\">Generic Microservice Architecture<\/figcaption><\/figure>\n<h1 style=\"text-align: justify;\">Reverse Proxy and Load Balancer<\/h1>\n<p style=\"text-align: justify;\">By letting the services communicate via the reverse proxy we gain helpful advantages.<\/p>\n<ol style=\"text-align: justify;\">\n<li>All information about servers, IP addresses and ports are only held by the reverse proxy. We only need to\u00a0store static URLs in each service to their dependents.<\/li>\n<li>The services can easily be spread over various servers, because they aren&#8217;t referring to the localhost or a fixed IP address.<\/li>\n<li>The reverse proxy can also load balance the traffic, if multiple instances are running (e.g. service A v1).<\/li>\n<li>It\u2019s easy to run different versions of a service in parallel (e.g. service A v1 and v2). In some scenarios, it might be useful to initially route only a part of the traffic to the newer version, before migrating to it completely.<\/li>\n<\/ol>\n<figure style=\"width: 411px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-02.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1928\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-1\/architecture-02\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-02.png\" data-orig-size=\"411,323\" 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=\"Architecture &amp;#8211; 02\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-02.png\" class=\"aligncenter size-full wp-image-1928\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-02.png\" alt=\"\" width=\"411\" height=\"323\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-02.png 411w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-02-300x236.png 300w\" sizes=\"auto, (max-width: 411px) 100vw, 411px\" \/><\/a><figcaption class=\"wp-caption-text\">Reverse Proxy and Load Balancer<\/figcaption><\/figure>\n<p style=\"text-align: justify;\">Now we have a scalable and easy controllable setup for the routing. Managing all IP addresses and ports within each service would rapidly create a mess of configuration and handling flexible or automated changes would seem to be nearly impossible. However, the downside of this configuration is that the reverse proxy is the single point of failure in the system. We think this is a fair trade off, because the Nginx server doesn&#8217;t contain a lot of application logic and at some point, you need an entry point for the URL of your services. It would take a lot more time to update reconfiguration in the DNS\u00a0service.<\/p>\n<p style=\"text-align: justify;\">Down the road, we plan\u00a0to evaluate if we gain performance by adding the URLs to the hosts file at least while\u00a0the reverse proxy is running on the same server as some services.<\/p>\n<h2 style=\"text-align: justify;\">External Services<\/h2>\n<p style=\"text-align: justify;\">It\u2019s always bad to depend on sources you can\u2019t control, but in many cases, you won\u2019t have a choice. The key goal is to build a reliable service even if foreign systems fail. We tried to build a setup that is as flexible and reliable as possible. If a service needs such data it connects an own service (service D), which is connected to the external interface, with another service (External Service Mapper).<\/p>\n<p style=\"text-align: justify;\">There are two options to provide data, depending on the type:<\/p>\n<ol style=\"text-align: justify;\">\n<li>If you can store the data in your own database, do it. Collect the data from the foreign API (push or pull) within the best interval (e.g. store weather data every hour). This guarantees availability, even if the external service is offline.<\/li>\n<li>If you can\u2019t store the data due to the size or complexity (e.g. Google Maps), you\u2019ll have to live with it. Build the best possible fallback.<\/li>\n<\/ol>\n<p style=\"text-align: justify;\">Why do we need an additional service (External Service Mapper) and don&#8217;t implement its logic into our service D?<\/p>\n<p style=\"text-align: justify;\">This modularization helps us if we add a second foreign interface (e.g. OpenStreetMap) or the external API provides an updated version. So we will not have to change anything in our internal connected service (Service D) if anything outside of our system changes.<\/p>\n<h2 style=\"text-align: justify;\">Auth Service<\/h2>\n<p style=\"text-align: justify;\">Within the microservice setup, connections between all\u00a0services are possible. Due to security in our example setup, every service will always be connected to the auth service. Every request, no matter if it was send by a user outside of the system or an interservice connection, will be checked by the requested service asking the Auth service. We will take a deeper look in the authentication and authorization process in our <a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-3\/\">third part<\/a> of the blog series. Just keep in mind that these are necessary connections we implement in every service. Even if we hide some services from the public, before processing a request we make sure that it\u2019s valid. We don&#8217;t build a wall and once someone passed it, he would get access to the whole system. As a side effect, we will be able to\u00a0make a service public anytime in the future, without having to implement any additional security functions.<\/p>\n<figure style=\"width: 684px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-03.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1929\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-1\/architecture-03\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-03.png\" data-orig-size=\"684,563\" 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=\"Architecture &amp;#8211; 03\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-03.png\" class=\"aligncenter size-full wp-image-1929\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-03.png\" alt=\"\" width=\"684\" height=\"563\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-03.png 684w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-03-300x247.png 300w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \/><\/a><figcaption class=\"wp-caption-text\">Auth Service<\/figcaption><\/figure>\n<h2 style=\"text-align: justify;\">Monitoring<\/h2>\n<p style=\"text-align: justify;\">If you have lots of\u00a0services, monitoring their activities is very important. Similar to the auth service, every service has implemented a connection to the monitoring service, to push or get data pulled. There are two different kinds of data to monitor:<\/p>\n<ol style=\"text-align: justify;\">\n<li>Heartbeat: To monitor the running services, their system resources and availability, we need a heartbeat that is send or requested in a specified interval. The monitoring service can then provide an overview for the operator\/developer, about the whole system.<\/li>\n<li>Logs: We need to collect the logs of all services, to process them and gather additional information. The services should at least log all incoming requests and outgoing responses with a timestamp. More detailed logging, e.g. inside the application logic, could be stored in a service specific log file.<\/li>\n<\/ol>\n<figure style=\"width: 685px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-04.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"1930\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-1\/architecture-04\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-04.png\" data-orig-size=\"685,563\" 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=\"Architecture &amp;#8211; 04\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-04.png\" class=\"aligncenter size-full wp-image-1930\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-04.png\" alt=\"\" width=\"685\" height=\"563\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-04.png 685w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-04-300x247.png 300w\" sizes=\"auto, (max-width: 685px) 100vw, 685px\" \/><\/a><figcaption class=\"wp-caption-text\">Monitoring<\/figcaption><\/figure>\n<p style=\"text-align: justify;\">In the next blog post we will take a closer look on how caching improves the heavy and frequent communication within our setup.<br \/>\n<a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-2\/\">Continue with Part II &#8211; Caching<\/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>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.<\/p>\n","protected":false},"author":193,"featured_media":1927,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[651,2],"tags":[49,11,91,12,93],"ppma_author":[718],"class_list":["post-1907","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-system-designs","category-system-engineering","tag-architecture","tag-loadbalancing","tag-microservices","tag-nginx","tag-reverse-proxy"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Architecture-01.png","jetpack-related-posts":[{"id":1915,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-5\/","url_meta":{"origin":1907,"position":0},"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":23067,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2022\/03\/15\/security-strategies-and-best-practices-for-microservices-architecture\/","url_meta":{"origin":1907,"position":1},"title":"Security Strategies and Best Practices for Microservices Architecture","author":"Larissa Schmauss","date":"15. March 2022","format":false,"excerpt":"Microservices architectures seem to be the new trend in the approach to application development. However, one should always keep in mind that microservices architectures are always closely associated with a specific environment:\u00a0Companies want to develop faster and faster, but resources are also becoming more limited, so they now want to\u2026","rel":"","context":"In &quot;Scalable Systems&quot;","block_context":{"text":"Scalable Systems","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/scalable-systems\/"},"img":{"alt_text":"","src":"https:\/\/lh6.googleusercontent.com\/LbFspPRY1BxRBdAVjQwWXeJ6UOoxl6JWsRYrxboF5ObXlNNgy3uZikcGkc3cgzI0mr_ZlbWPxvdp0FoJC1k-odh7mRc2lCPXaMSq8TudjfoZ7e5HKstaMHmLpH319jCym6vQRo1a","width":350,"height":200,"srcset":"https:\/\/lh6.googleusercontent.com\/LbFspPRY1BxRBdAVjQwWXeJ6UOoxl6JWsRYrxboF5ObXlNNgy3uZikcGkc3cgzI0mr_ZlbWPxvdp0FoJC1k-odh7mRc2lCPXaMSq8TudjfoZ7e5HKstaMHmLpH319jCym6vQRo1a 1x, https:\/\/lh6.googleusercontent.com\/LbFspPRY1BxRBdAVjQwWXeJ6UOoxl6JWsRYrxboF5ObXlNNgy3uZikcGkc3cgzI0mr_ZlbWPxvdp0FoJC1k-odh7mRc2lCPXaMSq8TudjfoZ7e5HKstaMHmLpH319jCym6vQRo1a 1.5x"},"classes":[]},{"id":23961,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/10\/microservices-any-good\/","url_meta":{"origin":1907,"position":2},"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":1912,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-2\/","url_meta":{"origin":1907,"position":3},"title":"Microservices &#8211; Legolizing Software Development II","author":"Korbinian Kuhn, Steffen Mauser","date":"28. February 2017","format":false,"excerpt":"Part two will take a closer look on how caching improves the heavy and frequent communication within our setup.","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\/Caching-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\/Caching-01.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2017\/02\/Caching-01.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":1967,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-3\/","url_meta":{"origin":1907,"position":4},"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":1924,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2017\/02\/28\/microservices-legolizing-software-development-4\/","url_meta":{"origin":1907,"position":5},"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":[]}],"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\/1907","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=1907"}],"version-history":[{"count":35,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/1907\/revisions"}],"predecessor-version":[{"id":2254,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/1907\/revisions\/2254"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media\/1927"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=1907"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=1907"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=1907"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=1907"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}