@crichardson A pattern language for microservices Chris Richardson Founder of Eventuate.io Founder of the original CloudFoundry.com Author of POJOs in Action @crichardson chris@chrisrichardson.net http://learnmicroservices.io Copyright © 2017. Chris Richardson Consulting, Inc. All rights reserved
@crichardson Presentation goal Overview of the microservice architecture pattern language and how to use it to architect an application
@crichardson About Chris
@crichardson About Chris Consultant and trainer focusing on modern application architectures including microservices (http://www.chrisrichardson.net/)
@crichardson About Chris Founder of a startup that is creating an open-source/SaaS platform that simplifies the development of transactional microservices (http://eventuate.io)
@crichardson About Chris http://learnmicroservices.io
@crichardson Agenda Why microservices? Benefits of the microservice architecture Microservices != silver bullet The microservice pattern language Applying the microservice pattern language
@crichardson Modern software development: moving fast and not breaking things! 46x 440x 24x 5x lower Amazon: ~0.001% Netflix: 16 minutes
@crichardson How to move fast and not break things? Architecture: Process: Small, autonomous teams ???? DevOps/Continuous delivery/deployment Organization:
@crichardson The monolithic architecture Tomcat Browser WAR SQL database HTML REST/JSON Client App Simple to …. Develop Test Deploy Scale Catalog Module Reviews Module Orders Module StoreFront UI Module
@crichardson But successful applications keep growing ….
@crichardson … and modularity breaks down… http://www.laputan.org/mud/ “Shantytowns are squalid, sprawling slums.”
@crichardson Monolithic hell Agile development and deployment becomes impossible By John Martin, Public Domain, https://commons.wikimedia.org/w/index.php?curid=3353638
@crichardson Monolithic hell: Technology stack becomes increasingly obsolete BUT a rewrite is not feasible
The microservice architecture is an architectural style that structures an application as a set of loosely coupled, services organized around business capabilities
@crichardson The Microservice architecture tackles complexity through modularization Improved scalability is secondary *
@crichardson Microservice architecture Browser Mobile Device Content Router API Gateway Catalog Service Review Service Order Service … Service Catalog Database Review Database Order Database … Database HTTP /HTML REST REST Browse & Search WebApp Product Detail WebApp ….
@crichardson Agenda Why microservices? Benefits of the microservice architecture Microservices != silver bullet The microservice pattern language Applying the microservice pattern language
@crichardson Microservices enable continuous delivery/deployment Process: Continuous delivery/deployment Organization: Small, agile, autonomous, cross functional teams Architecture: Microservice architecture Enables Enables Enables Successful Software Development Services = testability and deployability Teams own services
@crichardson Smaller, simpler applications Easier to understand, develop and test Less jar/classpath hell - who needs OSGI? Faster to build, test and deploy Reduced startup time - improves MTTR
Scales development: develop, deploy and scale each service independently Small, autonomous teams Clearly defined responsibilities Catalog Service Review Service Order Service … Service Catalog Team Review Team Order Team … Team Responsible for
@crichardson Easier to scale
@crichardson Improves fault isolation
@crichardson Easily evolve your technology stack ... and fail safely
@crichardson Agenda Why microservices? Benefits of the microservice architecture Microservices != silver bullet The microservice pattern language Applying the microservice pattern language
@crichardson No silver bullets http://en.wikipedia.org/wiki/Fred_Brooks
@crichardson Complexity http://highscalability.com/blog/2014/4/8/microservices-not-a-free-lunch.html
@crichardson Complexity of developing a distributed system
@crichardson Multiple databases & Transaction management Must use event-driven eventual consistency
@crichardson Complexity of testing a distributed system
@crichardson Complexity of deploying and operating a distributed system You need a lot of automation: VM/container orchestration or PaaS
@crichardson Developing and deploying features that span multiple services requires careful coordination
@crichardson Agenda Why microservices? Benefits of the microservice architecture Microservices != silver bullet The microservice pattern language Applying the microservice pattern language
@crichardson Are microservices a good fit for my application?
@crichardson When using microservices: How to decompose an application into services? How to deploy an application’s services? How to handle cross cutting concerns? Which communication mechanisms to use? How do external clients communicate with the services? How does a client discover the network location of a service instance? How to prevent a network or service failure from cascading to other services? How to maintain data consistency and implement queries? How to make testing easier? How to understand the behavior of an application and troubleshoot problems? How to implement a UI screen or page that displays data from multiple services?
@crichardson Microservice pattern language = collection of patterns that solve these architecture, design, development and operational problems
@crichardson What’s a pattern? Reusable solution to a problem occurring in a particular context
@crichardson The structure of a pattern encourages objectivity Resulting context The situationName Context Problem Related patterns The issues that must be addressed Forces Solution Benefits Drawbacks IssuesPatterns that are alternative solutions Patterns that address the issues
@crichardson Microservice architecture pattern Context Developing large, complex architecture Problem What’s the runtime architecture? Benefits Faster development Easy adopt new technologies Drawbacks Complexity of a distributed system Issues Decomposition Distributed system issues: IPC, discovery, … Alternative patterns Monolithic architecture Successor patterns Service Registry, API Gateway, …
@crichardsonMicroservice patterns Communication patterns Core Cross-cutting concerns Security Deployment Maintaining data consistency Database architecture External API Reliability Discovery Communication style Testing Observability UI Decomposition API gateway Client-side discovery Server-side discovery Service registry Self registration 3rd party registration Multiple Services per host Single Service per Host Service-per- Container Service-per-VM Messaging Remote Procedure Invocation Database per Service Event-driven architectureShared database Microservice Chassis Backend for front end Event sourcing Transaction log tailing Database triggers Application events Monolithic architecture Microservice architecture CQRS Motivating Pattern Solution Pattern Solution A Solution B General Specific Serverless deployment Circuit BreakerAccess Token Domain-specific Externalized configuration Service Integration Contract Test Service Component Test Exception tracking Distributed tracing Audit logging Application metrics Log aggregation Health check API Service deployment platform Server-side page fragment composition Client-side UI composition Decompose by business capability Decompose by subdomain Application patterns Infrastructure patterns Application Infrastructure patterns Microservices pattern language: http://microservices.io
@crichardson Agenda Why microservices? Benefits of the microservice architecture Microservices != silver bullet The microservice pattern language Applying the microservice pattern language
@crichardson The pattern language guides you when developing an architecture What architectural decisions you must make For each decision: Available options Trade-offs of each option
@crichardson Key patterns
Issue: What’s the deployment architecture? Forces Maintainability Deployability Testability Extensibility … Monolithic architecture Microservice architecture Single deployable/ executable OR Tightly coupled services Multiple loosely coupled services
Issue: How to decompose an application into services? Forces Stability Cohesive Loosely coupled Not too large Decompose by business capability Decompose by subdomain Organize around business capabilities Organize around DDD subdomains
@crichardson Issue: how to maintain data consistency? Event-driven architecture Event sourcing Transaction log tailing Database triggers Application events Context • Each service has its own database • Data is private to a service Forces Transactional data consistency must be maintained across multiple services 2PC is not an option
@crichardson Issue: how to perform queries? CQRS Context Each service has its own database Forces Queries must join data from multiple services Data is private to a service Maintain query views by subscribing to events
@crichardson Issue: How do services communicate? Messaging Remote Procedure Invocation Domain-specific Forces Services must communicate Usually processes on different machines …
@crichardson The rest are generic technical architecture patterns = Undifferentiated heavy lifting!
@crichardson Issue: How to handle cross cutting concerns? Microservice Chassis Forces Every service must implement logging; externalize configuration; health check endpoint; metrics; …
Issue: How to deploy an application’s services? Multiple Services per host Single Service per Host Service-per- Container Service-per-VM Serverless deployment Service deployment platform Forces Multiple languages Isolated Constrained Monitor-able Reliable Efficient
@crichardson Issue: How to discover a service instance’s network location? Client-side discovery Server-side discovery Service registry Self registration 3rd party registration Forces Client needs IP address of service instance Dynamic IP addresses Dynamically provisioned instances
@crichardson Issue: how to monitor the behavior of your application? Exception tracking Distributed tracing Audit logging Application metrics Log aggregation Health check API
@crichardson Summary The monolithic architecture is a good choice for small/simple applications Use the microservice architecture for large/complex applications Microservice architecture != silver bullet Use the microservice architecture pattern language to guide your decision making
@crichardson @crichardson chris@chrisrichardson.net http://learnmicroservices.io Thank you!

Spring Days NYC - A pattern language for microservices