{"id":11492,"date":"2017-07-03T16:07:17","date_gmt":"2017-07-03T14:07:17","guid":{"rendered":"https:\/\/blog.zhaw.ch\/icclab\/?p=11492"},"modified":"2019-08-05T13:54:06","modified_gmt":"2019-08-05T11:54:06","slug":"cloud-native-microservices-reference-architecture","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/","title":{"rendered":"Cloud-Native Microservices Reference Architecture"},"content":{"rendered":"\n<p>by <a href=\"https:\/\/blog.zhaw.ch\/icclab\/josef-spillner\/\">Josef Spillner<\/a><\/p>\n\n\n<p><span style=\"font-weight: 400\">How are cloud-native applications engineered? In contrast to the increasing <a href=\"https:\/\/trends.google.com\/trends\/explore?q=cloud-native\">popularity of the topic<\/a>, there are surprisingly few reference applications available. <\/span><span style=\"font-weight: 400\">In the <a href=\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-document-management\/\">previous blogpost<\/a> we described a first version of a prototypical document management application consisting of composed containers which is called ARKIS Microservices. We elaborated on the challenges involved when designing and developing a <\/span><b>cloud-native application<\/b><span style=\"font-weight: 400\">. In addition, we showed some details about the architecture and functionalities of version 2.5 of this generic reference application .<\/span><\/p>\n<p><span style=\"font-weight: 400\">In this blogpost, we now dive deeper into the architecture of the latest version 3.3, paying attention to each component. The document management software is a<\/span> <span style=\"font-weight: 400\">cloud-native application based on a <\/span><b>microservices architecture<\/b><span style=\"font-weight: 400\">. The software permits multiple tenants to manage their documents (create, read, update, delete and search patterns in documents). It manages the different tenants and offers <\/span><b>different isolation models<\/b><span style=\"font-weight: 400\"> to store the documents of a tenant. Furthermore, the services are <\/span><b>discoverable<\/b><span style=\"font-weight: 400\"> through declarative service descriptions, and their use is billed according to a <\/span><b>pay-per-use<\/b><span style=\"font-weight: 400\"> scheme.<\/span><\/p>\n<p><!--more--><\/p>\n<p><span style=\"font-weight: 400\">ARKIS Microservices 3.3 also offers some administration features, for example, migration between the different isolation models for a specific tenant or addition of hundreds or thousands generic documents to a tenant. This allows for a quick evaluation of the application without the need to import real data, and thus ensures an <\/span><b>instant service experience<\/b><span style=\"font-weight: 400\">.<\/span><\/p>\n<p><b>Multi-tenancy<\/b><span style=\"font-weight: 400\"> is a common requirement of lots of applications in the cloud. There are different options to implement multi-tenancy with respect to stateful services. In older architectural designs one can find these <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/aa479086(d=printer).aspx\">options <\/a><\/span><span style=\"font-weight: 400\">but in the new microservices approach we have found a more versatile multi-tenancy option thanks to the new features that microservices offer us. Summarizing, there are 5 multi-tenancy models ordered by level of isolation of the tenants (- to +): <\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">A: Shared DBMS, Shared database, shared schema, shared table\/collection<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">B: Shared DBMS, Shared database, shared schema, one table\/collection per tenant<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">C: Shared DBMS, Shared database, one schema per tenant<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">D: Shared DBMS, one database per tenant<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">E: One DBMS per tenant<\/span><\/li>\n<\/ul>\n<p>The prototype covers all the models which a NoSQL database support (option C is not possible because MongoDB as used by us has not schemas) and it is possible to migrate the tenants between the different models and have tenants in all the models at the same time.<\/p>\n<figure id=\"attachment_11493\" aria-describedby=\"caption-attachment-11493\" style=\"width: 848px\" class=\"wp-caption aligncenter\"><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-11493 size-full\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png\" alt=\"\" width=\"848\" height=\"504\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png 848w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram-300x178.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram-768x456.png 768w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram-500x297.png 500w\" sizes=\"auto, (max-width: 848px) 100vw, 848px\" \/><\/a><figcaption id=\"caption-attachment-11493\" class=\"wp-caption-text\">The big picture: ARKIS Microservices architecture<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400\">In the big picture above, all the components of the architecture are shown in relation. We can divide it in 3 layers: <\/span><b>database<\/b><span style=\"font-weight: 400\">,<\/span><b> backend <\/b><span style=\"font-weight: 400\">and<\/span><b> frontend<\/b><span style=\"font-weight: 400\">. A total of eight microservices implement the application-specific logic and presentation, whereas more microservices are generic and only parameterised and bound to the application.<br>\n<\/span><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">The database layer<\/span><span style=\"font-weight: 400\">. We can find here the persistence of the data that the application manages, basically documents and users (tenants). It is composition of <\/span><b>MongoDB<\/b><span style=\"font-weight: 400\"> microservices and covers all the multi-tenancy models. These microservices are the unique<\/span><b> stateful microservices<\/b><span style=\"font-weight: 400\"> of the application. Optionally, they could be bound from an already running DBaaS.<br>\n<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">The backend layer<\/span><span style=\"font-weight: 400\">. These are <\/span><b>stateless microservices<\/b><span style=\"font-weight: 400\"> which implement a <\/span><b>REST API<\/b><span style=\"font-weight: 400\">. We can find five different microservices (independently scalable) implemented in <\/span><b>Python <\/b><span style=\"font-weight: 400\">which are the core of the application: <\/span>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">User MS: CRUD of users.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Document MS: CRUD of documents.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Search MS: Search patterns inside the documents.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Migrate MS: Migrate the documents of a tenant between the multi-tenancy models.<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Data MS: Add generic data for a tenant in its multi-tenancy model.<\/span><\/li>\n<\/ul>\n<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">The frontend layer. <\/span><span style=\"font-weight: 400\">Three stateless microservices implemented using <\/span><b>HTML5<\/b><span style=\"font-weight: 400\">, <\/span><b>Javascript<\/b><span style=\"font-weight: 400\"> with <\/span><b>jQuery<\/b><span style=\"font-weight: 400\">, <\/span><b>Bootstrap<\/b><span style=\"font-weight: 400\"> and <\/span><b>CSS3<\/b><span style=\"font-weight: 400\"> to create the <\/span><b>interface<\/b><span style=\"font-weight: 400\"> of a webpage. These show the common account creation\/login view as well as the role-dependent admin and user views after a successful login.<\/span><\/li>\n<\/ul>\n<figure id=\"attachment_11494\" aria-describedby=\"caption-attachment-11494\" style=\"width: 535px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/ScreenShotArkis3.3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-11494\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/ScreenShotArkis3.3-1024x446.png\" alt=\"\" width=\"535\" height=\"239\"><\/a><figcaption id=\"caption-attachment-11494\" class=\"wp-caption-text\">ARKIS 3.3 Screen shot<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400\">The other three components which comprise the architecture are <\/span><a href=\"https:\/\/getkong.org\"><b>Kong<\/b><\/a><span style=\"font-weight: 400\">, the <\/span><a href=\"https:\/\/github.com\/OAI\/OpenAPI-Specification\"><b>OpenAPI<\/b> <b>specification<\/b><\/a> <span style=\"font-weight: 400\">and <\/span><b><a href=\"https:\/\/github.com\/icclab\/cyclops\">Cyclops<\/a>.<\/b><\/p>\n<ul>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Kong.<\/span><span style=\"font-weight: 400\"> It is an open-source API gateway and microservices management layer. Adding plugins to Kong, we can add easily extra functionalities to our API, as for example plugins of authentication, security, traffic control, transformation, serverless, logging, analytics and monitoring. Thanks to that we don\u2019t need to implement these common characteristics to any of our microservices, avoiding to repeat code inside them and making lightweight our microservices.&nbsp;<\/span>Kong is implemented for running as microservice itself and the application has been extended to run it in a Kubernetes cluster, through small modifications to the upstream <a href=\"https:\/\/github.com\/serviceprototypinglab\/arkismicroservices\/tree\/master\/api\/kong\">Kong deployment files<\/a>.<\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">OpenAPI specification.<\/span><span style=\"font-weight: 400\"> The goal is to define a standard, language-agnostic interface to REST APIs. This specification is also called <\/span><a href=\"https:\/\/swagger.io\/specification\/\"><b>Swagger specification<\/b><\/a><span style=\"font-weight: 400\">. The <a href=\"https:\/\/swagger.io\/swagger-editor\/\">Swagger editor<\/a> is a open-source tool for helping application engineers to create the specification file and the complementary <a href=\"https:\/\/swagger.io\/swagger-ui\/\">Swagger UI <\/a>offers an interface to see in a user-friendly way all the API information described in the specification. With this specification a developer can easily learn and understand how to use the API. It is also a standard that helps to upload APIs to a marketplace such as <a href=\"https:\/\/market.mashape.com\/api\/new\">Mashape One<\/a><\/span><span style=\"font-weight: 400\">. Hence, we have modelled the <a href=\"https:\/\/github.com\/serviceprototypinglab\/arkismicroservices\/blob\/master\/api\/arkis-swagger.json\">ARKIS Microservices description<\/a> declaratively in OpenAPI. Nevertheless, OpenAPI has limitations compared to many years of research on service description languages, and does not fully express the service behaviour.<br>\n<\/span><\/li>\n<li style=\"font-weight: 400\"><span style=\"font-weight: 400\">Cyclops<\/span><span style=\"font-weight: 400\">: <\/span><b>rating<\/b><span style=\"font-weight: 400\">, <\/span><b>charging <\/b><span style=\"font-weight: 400\">and <\/span><b>billing<\/b><span style=\"font-weight: 400\"> framework. Cyclops is open-source and it is designed following a microservice architecture. Easy to install, it is a fast solution to rate the usage of a tenant of the service API and generate a bill for any period of usage time. The clients of the application can also use Cyclops to see all their bills and details of their usage. We <a href=\"https:\/\/github.com\/serviceprototypinglab\/arkismicroservices\/blob\/master\/containers\/Backend\/Search\/backend.py\">performed the integration<\/a> with the ARKIS Microservices prototype in the search microservice, so each time that a user uses this function the microservice will send a JSON post to the Cyclops endpoint with the information to be charged properly.<\/span><\/li>\n<\/ul>\n<figure id=\"attachment_11496\" aria-describedby=\"caption-attachment-11496\" style=\"width: 584px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/swaggereditordocuments.png\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-11496 size-large\" src=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/swaggereditordocuments-1024x496.png\" alt=\"\" width=\"584\" height=\"283\" srcset=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/swaggereditordocuments-1024x496.png 1024w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/swaggereditordocuments-300x145.png 300w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/swaggereditordocuments-768x372.png 768w, https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/swaggereditordocuments-500x242.png 500w\" sizes=\"auto, (max-width: 584px) 100vw, 584px\" \/><\/a><figcaption id=\"caption-attachment-11496\" class=\"wp-caption-text\">Swagger editor<\/figcaption><\/figure>\n<p><span style=\"font-weight: 400\">This architecture was designed and developed inside the project <a href=\"https:\/\/blog.zhaw.ch\/icclab\/category\/transfer-2\/arkis\/\">ARKIS<\/a><\/span><span style=\"font-weight: 400\"> where we also compared different <\/span><span style=\"font-weight: 400\">orchestration tools<\/span><span style=\"font-weight: 400\">, created a formula to help us to scale properly the microservices and compare the multi-tenancy options with respect to isolation, resources usage and performance. The implementation thus reflects research results from our ongoing initiatives on Cloud-Native Applications, Service Tooling and Cloud Accounting &amp; Billing.<br>\n<\/span><\/p>\n<p><span style=\"font-weight: 400\">You can find the latest version of the ARKIS Microservices prototype<\/span><span style=\"font-weight: 400\"> with all the information in the <a href=\"https:\/\/github.com\/serviceprototypinglab\/arkismicroservices\">repository<\/a> of the <a href=\"https:\/\/blog.zhaw.ch\/icclab\/category\/labs\/splab\/\">Service Prototyping Lab<\/a>. &nbsp;<\/span><\/p><div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/api\/\">api<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/cloud-native-application\/\">cloud-native application<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/cna\/\">CNA<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/containers\/\">containers<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/cyclops\/\">Cyclops<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/kong\/\">kong<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/microservices\/\">microservices<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/open-source\/\">open source<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/web-application\/\">Web Application<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>How are cloud-native applications engineered? In contrast to the increasing popularity of the topic, there are surprisingly few reference applications available. In the previous blogpost we described a first version of a prototypical document management application consisting of composed containers which is called ARKIS Microservices. We elaborated on the challenges involved when designing and developing [&hellip;]<\/p>\n","protected":false},"author":486,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1],"tags":[829,558,770,609,420,874,566,684,469],"features":[],"class_list":["post-11492","post","type-post","status-publish","format-standard","hentry","category-allgemein","tag-api","tag-cloud-native-application","tag-cna","tag-containers","tag-cyclops","tag-kong","tag-microservices","tag-open-source","tag-web-application"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Cloud-Native Microservices Reference Architecture - Service Engineering (ICCLab &amp; SPLab)<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Cloud-Native Microservices Reference Architecture\" \/>\n<meta property=\"og:description\" content=\"How are cloud-native applications engineered? In contrast to the increasing popularity of the topic, there are surprisingly few reference applications available. In the previous blogpost we described a first version of a prototypical document management application consisting of composed containers which is called ARKIS Microservices. We elaborated on the challenges involved when designing and developing [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Engineering (ICCLab &amp; SPLab)\" \/>\n<meta property=\"article:published_time\" content=\"2017-07-03T14:07:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-08-05T11:54:06+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png\" \/>\n<meta name=\"author\" content=\"icclab\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"icclab\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/\"},\"author\":{\"name\":\"icclab\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\"},\"headline\":\"Cloud-Native Microservices Reference Architecture\",\"datePublished\":\"2017-07-03T14:07:17+00:00\",\"dateModified\":\"2019-08-05T11:54:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/\"},\"wordCount\":1056,\"commentCount\":0,\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png\",\"keywords\":[\"api\",\"cloud-native application\",\"CNA\",\"containers\",\"Cyclops\",\"kong\",\"microservices\",\"open source\",\"Web Application\"],\"articleSection\":[\"*.*\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/\",\"name\":\"Cloud-Native Microservices Reference Architecture - Service Engineering (ICCLab &amp; SPLab)\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png\",\"datePublished\":\"2017-07-03T14:07:17+00:00\",\"dateModified\":\"2019-08-05T11:54:06+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#primaryimage\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png\",\"contentUrl\":\"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/icclab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Cloud-Native Microservices Reference Architecture\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/\",\"name\":\"Service Engineering (ICCLab &amp; SPLab)\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563\",\"name\":\"icclab\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g\",\"caption\":\"icclab\"},\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/author\/icclab\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Cloud-Native Microservices Reference Architecture - Service Engineering (ICCLab &amp; SPLab)","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/","og_locale":"en_US","og_type":"article","og_title":"Cloud-Native Microservices Reference Architecture","og_description":"How are cloud-native applications engineered? In contrast to the increasing popularity of the topic, there are surprisingly few reference applications available. In the previous blogpost we described a first version of a prototypical document management application consisting of composed containers which is called ARKIS Microservices. We elaborated on the challenges involved when designing and developing [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/","og_site_name":"Service Engineering (ICCLab &amp; SPLab)","article_published_time":"2017-07-03T14:07:17+00:00","article_modified_time":"2019-08-05T11:54:06+00:00","og_image":[{"url":"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png","type":"","width":"","height":""}],"author":"icclab","twitter_card":"summary_large_image","twitter_misc":{"Written by":"icclab","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/"},"author":{"name":"icclab","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563"},"headline":"Cloud-Native Microservices Reference Architecture","datePublished":"2017-07-03T14:07:17+00:00","dateModified":"2019-08-05T11:54:06+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/"},"wordCount":1056,"commentCount":0,"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png","keywords":["api","cloud-native application","CNA","containers","Cyclops","kong","microservices","open source","Web Application"],"articleSection":["*.*"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/","url":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/","name":"Cloud-Native Microservices Reference Architecture - Service Engineering (ICCLab &amp; SPLab)","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#primaryimage"},"image":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png","datePublished":"2017-07-03T14:07:17+00:00","dateModified":"2019-08-05T11:54:06+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#primaryimage","url":"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png","contentUrl":"https:\/\/blog.zhaw.ch\/icclab\/files\/2017\/07\/SwaggerDiagram.png"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/icclab\/cloud-native-microservices-reference-architecture\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/icclab\/"},{"@type":"ListItem","position":2,"name":"Cloud-Native Microservices Reference Architecture"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/icclab\/#website","url":"https:\/\/blog.zhaw.ch\/icclab\/","name":"Service Engineering (ICCLab &amp; SPLab)","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/045c6bde7e681e689e4fc051d8932563","name":"icclab","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7b13169e03783f50e96b96fa2ff222b9c530d13c3125f077c7c44f729b857a51?s=96&d=mm&r=g","caption":"icclab"},"url":"https:\/\/blog.zhaw.ch\/icclab\/author\/icclab\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/11492","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/users\/486"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/comments?post=11492"}],"version-history":[{"count":8,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/11492\/revisions"}],"predecessor-version":[{"id":12487,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/11492\/revisions\/12487"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/media?parent=11492"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/categories?post=11492"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/tags?post=11492"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/features?post=11492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}