{"id":79377,"date":"2018-07-17T13:00:41","date_gmt":"2018-07-17T10:00:41","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/?p=79377"},"modified":"2023-12-11T12:19:53","modified_gmt":"2023-12-11T10:19:53","slug":"microservices-for-java-developers-introduction","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html","title":{"rendered":"Microservices for Java Developers: Introduction"},"content":{"rendered":"<h2><a name=\"introduction\"><\/a>1. Introduction<\/h2>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">Microservices<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a>, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a> \u2026 One of the hottest topics in the industry nowadays and the new shiny thing everyone wants to be doing, often without really thinking about the deep and profound transformations this architectural style requires both from the people and organization perspectives.<\/p>\n<p>In this tutorial we are going to talk about practical <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservice architecture<\/a>, starting from the core principles and progressively moving towards making it production ready. There is tremendous amount of innovations happening in this space so please take everything we are going to discuss along the tutorial with some grain of salt: what is the accepted practice today may not hold its promise tomorrow. For better or worse, the industry is still building the expertise and gaining the experience around developing and operating microservices.<\/p>\n<div class=\"toc\">\n<h3>Table Of Contents<\/h3>\n<dl>\n<dt><a href=\"#introduction\">1. Introduction<\/a><\/dt>\n<dt><a href=\"#monoliths\">2. Monoliths Around Us<\/a><\/dt>\n<dt><a href=\"#yes\">3. Saying \u201cYes!\u201d to Microservices<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#architecture\">3.1. Architecture(s) inside Architecture<\/a><\/dt>\n<dt><a href=\"#context\">3.2. Bounded Context<\/a><\/dt>\n<dt><a href=\"#ownership\">3.3. Ownership<\/a><\/dt>\n<dt><a href=\"#deployments\">3.4. Independent Deployments<\/a><\/dt>\n<dt><a href=\"#versioning\">3.5. Versioning<\/a><\/dt>\n<dt><a href=\"#tool\">3.6. Right Tool for the Job<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#distributed\">4. The Danger of the Distributed Monolith<\/a><\/dt>\n<dd>\n<dl>\n<dt><a href=\"#remote\">4.1. Every Function is (potentially) a Remote Call<\/a><\/dt>\n<dt><a href=\"#chattiness\">4.2. Chattiness<\/a><\/dt>\n<dt><a href=\"#cycles\">4.3. Dependency Cycles<\/a><\/dt>\n<dt><a href=\"#sharing\">4.4. Sharing<\/a><\/dt>\n<\/dl>\n<\/dd>\n<dt><a href=\"#conclusions\">5. Conclusions<\/a><\/dt>\n<dt><a href=\"#next\">6. What\u2019s next<\/a><\/dt>\n<\/dl>\n<\/div>\n<p>There are a lot of different opinions on doing the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a> the \u201cright way\u201d but the truth is, there is no really the magic recipe or advice which will get you there. It is a process of continuous learning and improvement while doing your best to keep the complexity under control. Please do not take everything discussed along this tutorial as granted, stay open-minded and do not be afraid to challenge things.<\/p>\n<p>If you are looking to expand your bookshelf, there is not much literature available yet on the matter but <a href=\"https:\/\/www.amazon.com\/Building-Microservices-Designing-Fine-Grained-Systems-ebook\/dp\/B00T3N7XB4\/ref=sr_1_3?s=digital-text&amp;ie=UTF8&amp;qid=1530992472&amp;sr=1-3&amp;keywords=microservices&amp;dpID=51e6hCWFZNL&amp;preST=_SY445_QL70_&amp;dpSrc=srch\">Building Microservices: Designing Fine-Grained Systems<\/a> by <a href=\"https:\/\/www.amazon.com\/default\/e\/B01B76VPKO\/\">Sam Newman<\/a> and <a href=\"https:\/\/www.amazon.com\/Microservice-Architecture-Aligning-Principles-Practices-ebook\/dp\/B01IO2VKGS\/ref=sr_1_5?s=digital-text&amp;ie=UTF8&amp;qid=1530992549&amp;sr=1-5&amp;keywords=microservices&amp;dpID=51609YUH2mL&amp;preST=_SY445_QL70_&amp;dpSrc=srch\">Microservice Architecture: Aligning Principles, Practices, and Culture<\/a> by <a href=\"https:\/\/www.amazon.com\/default\/e\/B01IW8VTN8\/\">Irakli Nadareishvili<\/a> are certainly the books worth owning and reading.<\/p>\n<h2><a name=\"monoliths\"><\/a>2. Monoliths Around Us<\/h2>\n<p>For many years traditional <a href=\"https:\/\/en.wikipedia.org\/wiki\/Monolithic_application\">single-tiered architecture<\/a> or\/and <a href=\"https:\/\/en.wikipedia.org\/wiki\/Client%E2%80%93server_model\">client\/server architecture<\/a> (practically, thin client talking to beefy server) were the dominant choices for building software applications and platforms. And fairly speaking, for the majority of the projects it worked (and still works) quite well but the appearance of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservice architecture<\/a> suddenly put the scary <a href=\"https:\/\/en.wikipedia.org\/wiki\/Monolithic_application\">monolith<\/a> label on all of that (which many read as <strong>legacy<\/strong>).<\/p>\n<p>This is a great example when the hype around the technology could shadow the common sense. There is nothing wrong with <a href=\"https:\/\/en.wikipedia.org\/wiki\/Monolithic_application\">monolith<\/a>s and there are numerous success stories to prove that. However, there are indeed the limits you can push them for. Let us briefly talk about that and outline a couple of key reasons to look towards adoption of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservice architecture<\/a>.<\/p>\n<p>Like it or not, in many organization <a href=\"https:\/\/en.wikipedia.org\/wiki\/Monolithic_application\">monolith<\/a> is the synonym to <a href=\"https:\/\/en.wikipedia.org\/wiki\/Big_ball_of_mud\">big ball of mud<\/a>. The maintenance costs are skyrocketing very fast, the increasing amount of bugs and regressions drags quality bar down, business struggles with delivering new features since it takes too much time for developers to implement. This may look like a good opportunity to look back and analyze what went wrong and how it could be addressed. In many cases splitting the large codebase into a set of cohesive modules (or components) with well established <a href=\"https:\/\/en.wikipedia.org\/wiki\/Application_programming_interface\">API<\/a>s (without necessarily changing the packaging model per se) could be the simplest and cheapest solution possible.<\/p>\n<p>But often you may hit the scalability issues, both scaling the software platform and scaling the engineering organization, which are difficult to solve while following the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Monolithic_application\">monolith<\/a> architecture. The famous <a href=\"https:\/\/en.wikipedia.org\/wiki\/Conway%27s_law\">Conway\u2019s law<\/a> summarized this pretty well.<\/p>\n<blockquote>\n<p><em>&#8220;\u2026 that organizations which design systems &#8230; are constrained to produce designs which are copies of the communication <\/em><a href=\"https:\/\/en.wikipedia.org\/wiki\/Organizational_structure\"><em>structures<\/em><\/a><em> of these organizations.&#8221; &#8211; <\/em><a href=\"http:\/\/www.melconway.com\/Home\/Committees_Paper.html\"><em>http:\/\/www.melconway.com\/Home\/Committees_Paper.html<\/em><\/a><div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<\/blockquote>\n<p>Could the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a> be the light at the end of the tunnel? It is absolutely possible but please be ready to change dramatically the engineering organization and development practices you used to follow. It is going to be a bumpy ride for sure but it should be highlighted early on that along this tutorial we are not going to question the architecture choices (and push you towards <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a>) but instead assume that you did you research and strongly believe that <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a> is the answer you are looking for.<\/p>\n<h2><a name=\"yes\"><\/a>3. Saying \u201cYes!\u201d to Microservices<\/h2>\n<p>So what the terms <strong>\u201cmicroservices\u201d <\/strong>and<strong> \u201cmicroservice achitecture\u201d <\/strong>actually mean? You may find that there are quite a few of slightly different definitions but arguably the most complete and understandable one is formulated by <a href=\"https:\/\/www.martinfowler.com\/\">Martin Fowler<\/a> in his essay on <a href=\"https:\/\/www.martinfowler.com\/articles\/microservices.html\">microservice architecture<\/a>:<\/p>\n<blockquote>\n<p><em>In short, the microservice architectural style \u2026 is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies. &#8211; <\/em><a href=\"https:\/\/www.martinfowler.com\/articles\/microservices.html\"><em>https:\/\/www.martinfowler.com\/articles\/microservices.html<\/em><\/a><\/p>\n<\/blockquote>\n<p>The prefix <strong>\u201cmicro\u201d<\/strong> became the constant source of confusion as it is supposed to frame the size of the service somehow. Unsurprisingly, it turned out to be quite hard to justify exactly. The good rule of thumb is to split your system in such a way that every microservice has a single meaningful purpose to fulfill. Another somewhat controversial definition of the <strong>\u201cmicro\u201d<\/strong> scale is that the microservice should be small enough to fit into the head of one developer (or more formally, maintainer).<\/p>\n<p>There are basically two routes which may direct you towards embracing <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservice architecture<\/a>: starting the green-field application or evolving the architecture of the existing one (most likely, the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Monolithic_application\">monolith<\/a>). In order to succeed while starting the journey by taking any of these routes, there are a number of the prerequisites and principles to be aware of.<\/p>\n<p>First of all, <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a> are all about domain modeling and domain design done right. There are two distinguishing books, <a href=\"https:\/\/www.amazon.com\/Domain-Driven-Design-Tackling-Complexity-Software\/dp\/0321125215\/ref=sr_1_1?ie=UTF8&amp;qid=1530574498&amp;sr=8-1&amp;keywords=domain+driven+design\">The Domain-Driven Design: Tackling Complexity in the Heart of Software<\/a> by <a href=\"https:\/\/www.amazon.com\/default\/e\/B001KDCO2I\">Eric Evans<\/a> and <a href=\"https:\/\/www.amazon.com\/Implementing-Domain-Driven-Design-Vaughn-Vernon\/dp\/0321834577\/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1530574561&amp;sr=1-1&amp;keywords=implementing+domain+driven\">Implementing Domain-Driven Design<\/a> by <a href=\"https:\/\/www.amazon.com\/Vaughn-Vernon\/e\/B0096T71SA\">Vaughn Vernon<\/a>, which are the credible sources on the subject and highly recommended reads. If you do not know your business domain well enough, the only advice would be to hold on with opening the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a> flood gate.<\/p>\n<p>The importance of that is going to become clear in a few moments but it is particularly very difficult problem to tackle when you start the development of the application from scratch since there are too many unknowns in the equation.<\/p>\n<h3><a name=\"architecture\"><\/a>3.1 Architecture(s) inside Architecture<\/h3>\n<p>Overall, <a href=\"https:\/\/www.martinfowler.com\/articles\/microservices.html\">microservice architecture<\/a> mandates to structure your application as a set of modest services but does not dictate how the services (and communication between them) should be implemented. In some sense, it could be thought of some kind of supreme architecture.<\/p>\n<p>As such the architectural choices applied to the individual microservices vary and, among many others, <a href=\"https:\/\/staging.cockburn.us\/hexagonal-architecture\/\">hexagonal architecture<\/a> (also known as <a href=\"https:\/\/staging.cockburn.us\/hexagonal-architecture\/\">ports and adapters<\/a>), <a href=\"https:\/\/8thlight.com\/blog\/uncle-bob\/2012\/08\/13\/the-clean-architecture.html\">clean architecture<\/a>, <a href=\"https:\/\/jeffreypalermo.com\/2008\/07\/the-onion-architecture-part-1\/\">onion architecture<\/a> and the old buddy <a href=\"https:\/\/en.wikipedia.org\/wiki\/Multitier_architecture\">layered architecture<\/a> could be often seen in the wild.<\/p>\n<h3><a name=\"context\"><\/a>3.2 Bounded Context<\/h3>\n<p>The definition of the <a href=\"https:\/\/martinfowler.com\/bliki\/BoundedContext.html\">bounded context<\/a> comes directly from the domain-driven design principles. When applied to the <a href=\"https:\/\/www.martinfowler.com\/articles\/microservices.html\">microservice architecture<\/a>, it outlines the boundaries of the business subdomain each microservice is responsible for. The <a href=\"https:\/\/martinfowler.com\/bliki\/BoundedContext.html\">bounded context<\/a> becomes the foundation of the microservice contract and essentially serves as the fence to the external world.<\/p>\n<p>The cumulative business domain model of the whole application constitutes from the domain models of all its microservices, with <a href=\"https:\/\/martinfowler.com\/bliki\/BoundedContext.html\">bounded context<\/a> in between to glue them together. Clearly, if the business domain is not well-defined and decomposed, so are the domain models, boundary contexts and microservices in front of them.<\/p>\n<h3><a name=\"ownership\"><\/a>3.3 Ownership<\/h3>\n<p>Each microservice has to serve as the single source of truth of the domain it manages, including the data it owns. It is exceptionally important to cut off any temptations of data sharing (for example, consulting data stores directly), as such bypassing the contract microservice establishes.<\/p>\n<p>In reality, the things will never stay completely isolated so there should be a solution. Indeed, since data sharing is not an option, you would immediately face the need to duplicate some pieces and, consequently, find a way to keep them in-sync.<\/p>\n<p>Every implementation change which you are going to make should be deconstructed into pieces and land in the right microservice (or set of microservices), unambiguously.<\/p>\n<p>From organizational perspective, the ownership translates into having a dedicated cross-functional team for each microservice (or perhaps, a few microservices). The cross-functional aspect is a significant step towards achieving the maturity and ultimate responsibility: <strong>you build it, you ship it, you run it and you support it<\/strong> (or to put it simply, <strong>you build it, you own it<\/strong>).<\/p>\n<h3><a name=\"deployments\"><\/a>3.4 Independent Deployments<\/h3>\n<p>Each microservice should be independent from every other: not only during the development time but also at deployment time. Separate deployments, and most importantly, the ability to scale independently, are the strongest forces behind the <a href=\"https:\/\/www.martinfowler.com\/articles\/microservices.html\">microservice architecture<\/a>. Think about microservices as the autonomous units, by and large agnostic to the platform and infrastructure, ready to be deployed anywhere, any time.<\/p>\n<h3><a name=\"versioning\"><\/a>3.5 Versioning<\/h3>\n<p>Being independent also means that each microservice should have own lifecycle and release versioning. It is kind of flows out from the discussion around ownership however this time the emphasis is on collaboration. As in any loosely-coupled distributed system, it is very easy to break things. The changes have to be efficiently communicated between the owning teams so everyone is aware what is coming and could account for it.<\/p>\n<p>Maintaining <a href=\"https:\/\/en.wikipedia.org\/wiki\/Backward_compatibility\">backward<\/a> (and <a href=\"https:\/\/en.wikipedia.org\/wiki\/Forward_compatibility\">forward<\/a>) compatibility becomes a must-have practice. This is another favor of responsibility: not only make sure the new version of your microservice is up and running smoothly, the existing consumers continue to function flawlessly.<\/p>\n<h3><a name=\"tool\"><\/a>3.6 Right Tool for the Job<\/h3>\n<p>The <a href=\"https:\/\/www.martinfowler.com\/articles\/microservices.html\">microservice architecture<\/a> truly embraces <strong>\u201cpick the right tool for the job\u201d<\/strong> philosophy. The choices of the programming languages, frameworks, and libraries are not fixed anymore. Since different <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a> are subjects to different requirements, it becomes much easier to mix and match various engineering decisions, as far as <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a> could communicate with each other efficiently.<\/p>\n<h2><a name=\"distributed\"><\/a>4. The Danger of the Distributed Monolith<\/h2>\n<p>Let us be fair, the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservice architecture<\/a> has many things to offer but it also introduces a lot of complexity into the picture. Unsurprisingly, the choice of the programming languages and\/or frameworks may amplify this complexity even more.<\/p>\n<p>When decision is made to adopt <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a>, many organizations and teams fall into the trap of applying the same development practices and processes that used to work in the past. This is probably the primary reason why the end result quite often becomes a <a href=\"https:\/\/www.infoq.com\/news\/2016\/02\/services-distributed-monolith\">distributed monolith<\/a>, a nightmare for developers and horror for operations. Let us talk about that for a moment.<\/p>\n<h3><a name=\"remote\"><\/a>4.1 Every Function is (potentially) a Remote Call<\/h3>\n<p>Since each microservice lives in a separate process somewhere, every function invocation may potentially cause a storm of network calls to upstream <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a>. The boundary here could be implicit and not easy to spot in the code, as such the proper instrumentation has to be present from day one. Network calls are expensive but, most importantly, everything could fail in spectacular ways.<\/p>\n<h3><a name=\"chattiness\"><\/a>4.2 Chattiness<\/h3>\n<p>Quite often one microservice needs to communicate with a few other upstream <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a>. This is absolutely normal and expected course of action. However when the microservice in question needs to call dozens of other <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a> (or issues a ton of calls to another microservice to accomplish its mission), it is huge red flag that the split was not done right. The high level of chattiness not only is subject to network latency and failures, it manifests the presence of the useless mediators or incapable proxies.<br \/>\n[ulp id=&#8217;DdINgEqoOovgkhhk&#8217;]<br \/>\n&nbsp;<\/p>\n<h3><a name=\"cycles\"><\/a>4.3 Dependency Cycles<\/h3>\n<p>The extreme version of chattiness is existence of the cycles between <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a>, either direct or indirect. Cycles are often invisible but very dangerous beasts. Even if you find the magic sequence to deploy such interdependent <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a> into production, sooner or later they are going to bring the application to its knees.<\/p>\n<h3><a name=\"sharing\"><\/a>4.4 Sharing<\/h3>\n<p>Managing the common ground between microservices is particularly difficult problem to tackle. There are many best practices and patterns which we as the developers have learnt over the years. Among others the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Don%27t_repeat_yourself\">DRY<\/a> and <a href=\"https:\/\/en.wikipedia.org\/wiki\/Code_reuse\">code reuse<\/a> principles stand out.<\/p>\n<p>Indeed, we know that the code duplication (also widely known as <a href=\"https:\/\/en.wikipedia.org\/wiki\/Copy_and_paste_programming\">copy\/paste programming<\/a>) is bad and should be avoided at all costs. In context of <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservice architecture<\/a> though, sharing code between different microservices introduces the highest level of coupling possible.<\/p>\n<p>It highly unrealistic (although worth trying) that you could completely get rid of shared libraries or alike, especially when your <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservices<\/a> are written using the same programming language or platform. The goal in this case would be to master the art of reducing the amount of shared pieces to absolutely necessary minimum, ideally to none. Otherwise, this kind of sharing will drag you down the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Monolithic_application\">monolith<\/a> way, but this time the distributed one.<\/p>\n<h2><a name=\"conclusions\"><\/a>5. Conclusions<\/h2>\n<p>In this section we quite briefly talked about the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservice architecture<\/a>, the benefits it delivers on the table, the complexity it introduces and the significant changes it brings to engineering organization. The opportunities this architectural style enables are tremendous but on the flip side of the coin, the price of the mistakes is equally very high.<\/p>\n<h2><a name=\"next\"><\/a>6. What\u2019s next<\/h2>\n<p>In the next section of the tutorial we are going to talk about typical inter-service communication styles proven to fit well the <a href=\"https:\/\/en.wikipedia.org\/wiki\/Microservices\">microservice architecture<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Introduction Microservices, microservices, microservices \u2026 One of the hottest topics in the industry nowadays and the new shiny thing everyone wants to be doing, often without really thinking about the deep and profound transformations this architectural style requires both from the people and organization perspectives. In this tutorial we are going to talk about &hellip;<\/p>\n","protected":false},"author":141,"featured_media":2386,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[15],"tags":[960],"class_list":["post-79377","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development","tag-microservices"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Microservices for Java Developers: Introduction - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Interested to learn more about Microservices? Then check out our detailed Tutorial on Microservices for Java Developers!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Microservices for Java Developers: Introduction - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Interested to learn more about Microservices? Then check out our detailed Tutorial on Microservices for Java Developers!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2018-07-17T10:00:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-12-11T10:19:53+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Andrey Redko\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andrey Redko\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html\"},\"author\":{\"name\":\"Andrey Redko\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/771a6504862edc45322776832cbce413\"},\"headline\":\"Microservices for Java Developers: Introduction\",\"datePublished\":\"2018-07-17T10:00:41+00:00\",\"dateModified\":\"2023-12-11T10:19:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html\"},\"wordCount\":2221,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/software-development-2-logo.jpg\",\"keywords\":[\"Microservices\"],\"articleSection\":[\"Software Development\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html\",\"name\":\"Microservices for Java Developers: Introduction - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/software-development-2-logo.jpg\",\"datePublished\":\"2018-07-17T10:00:41+00:00\",\"dateModified\":\"2023-12-11T10:19:53+00:00\",\"description\":\"Interested to learn more about Microservices? Then check out our detailed Tutorial on Microservices for Java Developers!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/software-development-2-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/software-development-2-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2018\\\/07\\\/microservices-for-java-developers-introduction.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Software Development\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/software-development\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Microservices for Java Developers: Introduction\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/771a6504862edc45322776832cbce413\",\"name\":\"Andrey Redko\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g\",\"caption\":\"Andrey Redko\"},\"description\":\"Andriy is a well-grounded software developer with more then 12 years of practical experience using Java\\\/EE, C#\\\/.NET, C++, Groovy, Ruby, functional programming (Scala), databases (MySQL, PostgreSQL, Oracle) and NoSQL solutions (MongoDB, Redis).\",\"sameAs\":[\"http:\\\/\\\/aredko.blogspot.com\\\/\",\"http:\\\/\\\/ca.linkedin.com\\\/in\\\/aredko\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/andrey-redko\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Microservices for Java Developers: Introduction - Java Code Geeks","description":"Interested to learn more about Microservices? Then check out our detailed Tutorial on Microservices for Java Developers!","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:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html","og_locale":"en_US","og_type":"article","og_title":"Microservices for Java Developers: Introduction - Java Code Geeks","og_description":"Interested to learn more about Microservices? Then check out our detailed Tutorial on Microservices for Java Developers!","og_url":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2018-07-17T10:00:41+00:00","article_modified_time":"2023-12-11T10:19:53+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg","type":"image\/jpeg"}],"author":"Andrey Redko","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Andrey Redko","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html"},"author":{"name":"Andrey Redko","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/771a6504862edc45322776832cbce413"},"headline":"Microservices for Java Developers: Introduction","datePublished":"2018-07-17T10:00:41+00:00","dateModified":"2023-12-11T10:19:53+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html"},"wordCount":2221,"commentCount":0,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg","keywords":["Microservices"],"articleSection":["Software Development"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html","url":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html","name":"Microservices for Java Developers: Introduction - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg","datePublished":"2018-07-17T10:00:41+00:00","dateModified":"2023-12-11T10:19:53+00:00","description":"Interested to learn more about Microservices? Then check out our detailed Tutorial on Microservices for Java Developers!","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/software-development-2-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2018\/07\/microservices-for-java-developers-introduction.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Software Development","item":"https:\/\/www.javacodegeeks.com\/category\/software-development"},{"@type":"ListItem","position":3,"name":"Microservices for Java Developers: Introduction"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/771a6504862edc45322776832cbce413","name":"Andrey Redko","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/16419ce8394173028eddaeb992859862bab50cfcf74589fa9bb9a3dd8bb27518?s=96&d=mm&r=g","caption":"Andrey Redko"},"description":"Andriy is a well-grounded software developer with more then 12 years of practical experience using Java\/EE, C#\/.NET, C++, Groovy, Ruby, functional programming (Scala), databases (MySQL, PostgreSQL, Oracle) and NoSQL solutions (MongoDB, Redis).","sameAs":["http:\/\/aredko.blogspot.com\/","http:\/\/ca.linkedin.com\/in\/aredko"],"url":"https:\/\/www.javacodegeeks.com\/author\/andrey-redko"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/79377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/141"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=79377"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/79377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/2386"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=79377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=79377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=79377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}