microservices design patterns for java application

67
Refactoring your Java EE applications using Microservices and Containers Arun Gupta Vice President, Developer Advocacy Couchbase @arungupta, blog.arungupta.me [email protected]

Upload: javadayua

Post on 06-Jan-2017

2.097 views

Category:

Software


3 download

TRANSCRIPT

Refactoring your Java EE applications using

Microservicesand

Containers

Arun GuptaVice President, Developer Advocacy

Couchbase @arungupta, blog.arungupta.me

[email protected]

@arungupta #devoxx

@arungupta #devoxx

Monolith Application

UI Database

Business Logic

HTMLHTMLHTML

CSSCSS

HTMLHTMLCDIHTMLHTMLREST

HTMLHTMLJSF

HTMLHTMLJPALoad

BalancerCache

DB

@arungupta #devoxx

EAR

Monolith Application

EARWAR

LoadBalancer WARWAR

JARJARJARJAR

Cache

DB

@arungupta #devoxx

Advantages of Monolith

• Typically packaged in a single .ear

• Easy to test (all required services are up)

• Simple to develop

@arungupta #devoxx

Monolith Version ManagementUI Database

Business Logic

HTMLHTML

HTMLHTML HTMLHTML HTMLHTML

HTMLHTML

Version 1

UI Database

Business Logic

HTMLHTML

HTMLHTML HTMLHTML HTMLHTML

HTMLHTML

Version 2

UI Database

Business Logic

HTMLHTML

HTMLHTML HTMLHTML HTMLHTML

HTMLHTML

Version 3

UI Database

Business Logic

HTMLHTML

HTMLHTML HTMLHTML HTMLHTML

HTMLHTML

Version 4

@arungupta #devoxx

Disadvantages of Monolith

• Difficult to deploy and maintain

• Obstacle to frequent deployments

• Dependency between unrelated features

• Makes it difficult to try out new technologies/framework

@arungupta #devoxx http://akfpartners.com/techblog/2008/05/08/splitting-applications-or-services-for-scale/

@arungupta #devoxx

An architectural approach, that emphasizes the decomposition of applications into single-purpose,

loosely coupled services managed by cross-functional teams, for delivering and maintaining complex software systems with the velocity and quality required by today’s

digital business

@arungupta #devoxx

@arungupta #devoxx

UI

Business Logic

Persistence

Orders

Shipping

Catalog

👱 🙍🙍👱👱

👱 🙍🙍👱👱

👱 🙍🙍👱👱

@arungupta #devoxx

“Any organization that designs a system (defined more broadly here than just information systems) will inevitably produce a design whose structure is

a copy of the organization's communication structure.”

–Melvin Conway

http://www.melconway.com/Home/Committees_Paper.html

@arungupta #devoxx

Teams around business capability

Orders

👱 🙍🙍👱👱

Shipping

👱 🙍🙍👱👱

Catalog

👱 🙍🙍👱👱

Characteristics

@arungupta #devoxx

Single Responsibility Principle

1DO

THING

Characteristics

@arungupta #devoxx

Explicitly Published interfaceCharacteristics

@arungupta #devoxx

Independently replace and upgradeCharacteristics

@arungupta #devoxx

“you build it, you run it!”

With great power, comes

great responsibility

Characteristics

@arungupta #devoxx

Designed for failure

Fault tolerance is a requirement, not a feature

http://techblog.netflix.com/2012/02/fault-tolerance-in-high-volume.html

Characteristics

@arungupta #devoxx

@arungupta #devoxx

Characteristics

@arungupta #devoxx

100% automatedCharacteristics

@arungupta #devoxx

Sync or Async MessagingCharacteristics

@arungupta #devoxx

Sync vs Async

Queue

P1

P2

P3

P4

C1

C2

C3ThriftProtobuf

Avro

Characteristics

@arungupta #devoxx

“Smart endpoints, Dumb pipes”Characteristics

@arungupta #devoxx

SOA

• SOA 2.0

• Hipster SOA

• SOA done right

• SOA++

@arungupta #devoxx

SOA 2.0?• Conway’s Law • Service Discovery • Immutable VM

@arungupta #devoxx

@arungupta #devoxx

Strategies for decomposing• Verb or usecase - e.g. Checkout UI

• Noun - e.g. Catalog product service

• Bounded context

• Single Responsible Principle - e.g. Unix utilities

@arungupta #devoxx

Service A

Towards microservices

EARWAR

LoadBalancer WAR

WAR

JARJARJARJAR

DBCache

Cache

DB

@arungupta #devoxx

Aggregator

Service C

WAR

Service B

WAR

Aggregator Pattern #1

DBCache

Service A

WARDBCache

DBCacheAggregator

LoadBalancer

@arungupta #devoxx

Aggregator

Service C

WAR

Service B

WAR

Proxy Pattern #2

DBCache

Service A

WARDBCache

DBCacheProxy

LoadBalancer

@arungupta #devoxx

Chained Pattern #3

Service A

WAR

DBCache

LoadBalancer

Service B

WAR

DBCache

Service C

WAR

DBCache

@arungupta #devoxx

Branch Pattern #4

Service A

WAR

DBCache

LoadBalancer Service B

WAR

DBCache

Service D

WAR

DBCache

Service C

WAR

DBCache

@arungupta #devoxx

Shared Resources #5Service B

WAR

DBCache

Service C

WAR

Service D

WAR

DBCache

Service A

WAR

DBCache

LoadBalancer

@arungupta #devoxx

Async Messaging #5Service B

WAR

DBCache

Service C

WAR

Service D

WAR

DBCacheDBCache

Service A

WAR

DBCache

LoadBalancer

Queue

@arungupta #devoxx

https://dzone.com/refcardz/getting-started-with-microservices

@arungupta #devoxx

Design Principles for Monoliths

• DDD

• SoC using MVC

• High cohesion, low coupling

• DRY

• CoC

• YAGNI

@arungupta #devoxx

Advantages of microservices• Easier to develop, understand, maintain

• Starts faster than a monolith, speeds up deployments

• Local change can be easily deployed, great enabler of CD

• Each service can scale on X- and Z-axis

• Improves fault isolation

• Eliminates any long-term commitment to a technology stack

• Freedom of choice of technology, tools, frameworks

@arungupta #devoxx

@arungupta #devoxx

“If you can't build a [well-structured] monolith, what makes you think microservices are the answer?”

http://www.codingthearchitecture.com/2014/07/06/distributed_big_balls_of_mud.html

“If your monolith is a big ball of mud, your microservice will be a bag of dirt”

Arun Gupta

@arungupta #devoxx

Config FilesClassesWeb Pages

User

Catalog

Order

DatabaseCSS

JS

C O M M O N

C O M MO N

@arungupta #devoxx

UserWeb Pages

Classes

Config Files

CatalogOrder

Database

Shopping Cart UI

Service Registry

registerregisterregister

discover

Database Database

discover

https://github.com/arun-gupta/microservices/

@arungupta #devoxx

Monolith vs MicroserviceMonolith Microservice

Archives 1 5 (Contracts, Order, User, Catalog, Web)

Web pages 8 8

Config Files

4 (persistence.xml, web.xml, load.sql,

template.xhtml)12

(3 per archive)

Classes 12 26 (Service registration/discovery, Application)

Archive Size 24 KB ~52 KB total

http://blog.arungupta.me/monolithic-microservices-refactoring-javaee-applications/

@arungupta #devoxx

Service Registry/Discovery• ZooKeeper and

Curator

• Kubernetes

• etcd

• Consul

• OSGi

• Snoop

• . . .

https://github.com/arun-gupta/microservices/blob/master/service-discovery.adoc

@arungupta #devoxx

Design Considerations• UI and Full stack

• Client-side composition (JavaScript?)

• Server-side HTML generation (JSF?)

• One service, one UI

• REST Services

• Event sequencing instead of 2PC

• API Management

@arungupta #devoxx

API Management

• Centralized governance policy configuration

• Tracking of APIs and consumers of those APIs

• Easy sharing and discovery of APIs

• Leveraging common policy configuration across different APIs

• Security, Caching, Rate limiting, Metrics, Billing, …

@arungupta #devoxx

NoOps

• Service replication (Kubernetes)

• Dependency resolution (Nexus)

• Failover (Circuit Breaker)

• Resiliency (Circuit Breaker)

• Service monitoring, alerts and events (ELK)

@arungupta #devoxx

@arungupta #devoxx https://gigaom.com/2012/01/31/why-2013-is-the-year-of-noops-for-programmers-infographic/

@arungupta #devoxx

Data Strategy• Private tables-, schema-, or database-per-service

• No sharing tables

• Only one service writes to a table(s), read-only by others

• No transactions across databases

• Logical transactions in application

@arungupta #devoxx

Event Sourcing• State of the application is defined by a sequence of events

• Events are stored in a document format

• Events are immutable

• Delete is implemented as an event

@arungupta #devoxx

Event Source @ WixStores

http://www.slideshare.net/aviranwix/road-to-continuous-delivery-wixcom

@arungupta #devoxx

Event Sourcing

http://www.slideshare.net/aviranwix/road-to-continuous-delivery-wixcom

@arungupta #devoxx

CQRS

• Traditional: CRUD using same data model

• Command Query Responsibility Segregation

• Different model to update and read information

• Command: change the state of system, do not return value

• Query: return state, do not change state

@arungupta #devoxx

CQRS

EditorSegment

PublishSegment

Multiple writes Less read, cached

http://www.slideshare.net/aviranwix/scaling-wix-with-microservices-and-multi-cloud-2015

@arungupta #devoxx

Microservices stack in seconds• Touchbase: Social network platform built using CEAN

• https://github.com/couchbaselabs/touchbase/

@arungupta #devoxx https://www.joyent.com/blog/how-to-dockerize-a-complete-application

@arungupta #devoxx

@arungupta #devoxx

@arungupta #devoxx

• Lightweight open source framework for Java EE microservices

• Uses standard Java EE APIs

• Produces standalone JARs that run anywhere

• Completely modular and easily extensible

@arungupta #devoxx

Great Fit for Microservices

• Dependency-driven - simple to use

• Pick and choose Java EE components that you want

• Even their implementations

• JAR includes all the dependencies

• Ideal for running in PaaS and Docker

@arungupta #devoxx

Components• Containers

• Jetty (default)

• Coming: Tomcat, Undertow, Grizzly

• Java EE components

• Current: Servlet, JSP, EL, CDI, JAX-RS, Bean Validation, JSON, JSF

• Coming: JMS, EJB, JAX-WS

@arungupta #devoxx

Jetty JPA CDI JSF

Jetty JPA CDI JAX-RS

Jetty JPA JAX-RSJSP

Microservice 1

Microservice 2

Microservice 3

Load balancer

@arungupta #devoxx

How to scale?

• Only requires Java SE

• Multiple instances and load balance

• Scale using PaaS and all Docker-like environments

• Each microservice can scale horizontally or vertically

@arungupta #devoxx

Drawbacks of microservices

• Additional complexity of distributed systems

• Significant operational complexity, need high-level of automation

• Rollout plan to coordinate deployments

• Slower ROI, to begin with

@arungupta #devoxx

Microservice Premium“don’t even consider microservices unless you have a system that’s too complex to manage as a monolith”

http://martinfowler.com/bliki/MicroservicePremium.html

@arungupta #devoxx

References

• github.com/arun-gupta/microservices

• github.com/javaee-samples/docker-java

• dzone.com/refcardz/getting-started-with-microservices