microservices with stijn van den enden & andreas evers - bejug

84
Microservices Hitchhiker’s guide to cloud native applications Andreas Evers @andreasevers Stijn Van den Enden @stieno

Upload: jworks-powered-by-ordina

Post on 22-Jan-2017

243 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

MicroservicesHitchhiker’s guide to cloud native applications

Andreas Evers @andreasevers

Stijn Van den Enden @stieno

Page 2: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Martin Fowler

“The microservice architectural style 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.”

James Lewis

Page 3: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Characteristics of a Microservice style

Page 4: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Characteristics of a Microservice style

• Small and focussed on 1 capability • easier to understand • IDE and deployment faster for 1 service

Page 5: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

• Provide firm module boundaries with explicit interface • Harder to violate boundary in development

Page 6: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

• Independent • Release and deployment • Scaling • Development

Page 7: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

• Loosely Coupled • through lightweight communication

Page 8: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

• Fault Isolation vs. bring all down.

Page 9: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

• Decentralised choreography • vs. central orchestration • vs. central point of failure

Page 10: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

• Allows try-out of new technologies. • Re-write can be limited to 1 service

• Impact Analysis stops at boundary

Page 11: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Characteristics of a Microservice style

• Decentralised data • polyglot persistence

Page 12: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Strong Module Boundaries Distribution

Eventual Consistency

Independent DeploymentOperational Complexity

Technology Diversity

Security Segmentation

Separate Scale-out

Parallel Development

Page 13: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Is this any different from SOA?

Page 14: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

SERVICE ORIENTED ARCHITECTURE?Yes, it’s SOA … but different implementation approach:

Classic SOA integrates different applications as a set of services

Microservices architect a single application as a set of services

Page 15: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Classic SOA integrates different applications as a set of services

Microservices

Enterprise Service Bus

WS* WS* WS* WS* WS*

WS* WS* WS* WS* WS*

Workflow Engine

Intelligence

Orchestration

Page 16: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

integrates different applications as a set of services

Microservices architect a single application as a set of services

business platform

accounting service contract

service

ordering service

logistics service

prospects service

capability X service

capability Y service

external integrationsbackends

{ API } { API }{ API }

{ API } { API }

{ API }{ API }

{ API } { API }

{ API } { API }

Page 17: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Classic SOA integrates different applications as a set of services

Microservices architect a single application as a set of services

Typical implementation solution differs!

Heavy-weight

ESBWS*/SOAP

Orchestration

License-drivenTarget problem:

Integrate (Legacy) Software

Intelligent Communication Layer

Light-weight

HTTP/REST/JSON

Choreography

Target problem: Architect new Business Platform

Dumb Communication Layer

Intelligent Services

Page 18: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Any practical advice on how I can start building the microservice stuff?

Page 19: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

side note: Domain Driven DesignTackling complexity by abstracting the business domain concepts and logic into a

domain model and using this as a base for software development

“In order to create good software, you have to know what that software is all about. You cannot create a banking software system unless you have a good understanding of what

banking is all about, one must understand the domain of banking.”

Eric Evans

Page 20: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Domain driven design deals with large complex models by dividing them into different functionally bounded subdomains and the explicitly describing the

interrelations between these subdomains.

Bounded contexts

Page 21: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

AccountingInventory

BillingOrdering

Functional decomposition of the business domain

Page 22: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Functional decomposition of the business domain

AccountingInventory

BillingOrdering

customer

Invoice

balance

order

item

item

stock order

order

item

incoming cash

outgoing cash

stock

Page 23: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Benefits of functional decomposition

Page 24: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

AccountingInventory

BillingOrdering

customer

Invoice

balance

order

item

item

stock order

order

item

incoming cash

outgoing cash

stock

Benefits of functional decomposition

Page 25: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Applying services to bounded contexts

Accounting ServiceInventory Service

Billing ServiceOrdering Service

customer

Invoice

balance

order

item

item

stock order

order

item

incoming cash

outgoing cash

stock

AccountingInventory

BillingOrdering

customer

Invoice

balance

order

item

item

stock order

order

item

incoming cash

outgoing cash

stock

Page 26: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

take notice.

Page 27: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Sam Newman

“If you’re coming from a monolithic system point of view, you’ll have to get much better at handling deployment, testing, and

monitoring to unlock the benefits we’ve covered so far. You’ll also need to think differently about how you scale your systems and

ensure that they are resilient. Don’t also be surprised if things like distributed transactions or CAP theorem start giving you

headaches, either!”

Page 28: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

What do we need to get started?

Page 29: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Implementing a Microservice

Page 30: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

java -jar payara-micro.jar --deploy test.war

Page 31: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Service Discovery

Page 32: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

NodeClient

Node

Node

Node

Node

?

Loadbalancer

Single Point of Failure Manual configuration management

Page 33: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Client

Node

Node

Node

Node

?

Registry

register

health

lookup

Node

🚫

unregister

Page 34: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

K/V

K/V

K/V

K/V

K/V

/etc distributed

raft - leader election

//Adding a value $ curl http://127.0.0.1:2379/v2/keys/message -XPUT -d value="Hello world”

//Quering $ curl http://127.0.0.1:2379/v2/keys/message { "action": "get", "node": { "createdIndex": 2, "key": "/message", "modifiedIndex": 2, "value": "Hello world" } }

//Delete $ curl http://127.0.0.1:2379/v2/keys/message -XDELETE

Operations

Page 35: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

K/V

K/V

K/V

K/V

K/V

/etc distributed

raft - leader election

SkyDNS

//registration $ curl -XPUT http://127.0.0.1:4001/v2/keys/skydns/local/production/preference/1 \ -d value=‘{“host”:”service5.example.com”,"port": 8080, “priority”:20}'

Operations

% dig @localhost SRV preference.production.local

;; ANSWER SECTION: preference.production.local. 3600 IN SRV 10 20 8080 service5.example.com. preference.production.local. 3600 IN SRV 10 20 8081 service4.example.com.

;; ADDITIONAL SECTION: service4.example.com. 3600 IN A 10.0.1.125 service5.example.com. 3600 IN A 10.0.2.126

Operations

Page 36: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

A HashiCorp Project.

https://www.consul.io/

K/V

K/V

K/V

K/V

K/V

Distributed Key/Value Store

http

dnsClient

raft - leader election gossip - node detection

Node

{ "service": { "name": "preference", "tags": ["spring"], "port": 8000,

"checks": [ { "script": "/usr/local/bin/check_preference.py", "interval": "10s" } ] } }

Service Registration

$ dig @127.0.0.1 -p 8600 preference.service.consul SRV ... ;; QUESTION SECTION: ;preference.service.consul. IN SRV

;; ANSWER SECTION: preference.service.consul. 0 IN SRV 1 1 8000 agent-one.node.dc1.consul.

;; ADDITIONAL SECTION: agent-one.node.dc1.consul. 0 IN A 172.20.20.11

Service Query (DNS)

$ curl http://localhost:8500/v1/catalog/service/preference [{"Node":"agent-one","Address":"172.20.20.11","ServiceID":"preference", \ "ServiceName":"preference","ServiceTags":["spring"],"ServicePort":8000}]

Service Query (http)

Page 37: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Static

Dynamic

Loadbalancer Loadbalancer

MicroService MicroService MicroService MicroService MicroService

Web Front End

Web Front End

Web Front End

Web Front End

Web Front End

MicroService MicroService MicroService MicroService MicroService

A

B

Midtier Service Registry

MicroServiceregister

renew

get registry

eureka

ribbon

https://github.com/Netflix/eureka

https://github.com/Netflix/ribbon

Page 38: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Apache ZooKeeper™

synapse - HAProxy based service discovery/routing

nerve - sidecar for service registration

we can’t cover them all …

Page 39: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Registration

Embedded In-app registrationSidecar based approach

⊖ • more difficult to take

service lifecycle into account

⊕ • no impact on the

application • language agnostic • easier to control service

registration

⊖ • requires language

specific integration • will not work with

legacy services

⊕ • deep integration with

insight in the service lifecycle

Discovery

API basedDNS

⊖ • TTL difficulties • complex routing

requires tighter integration

⊕ • legacy integration

⊖ • API integration has

impact on the application

⊕ • service metadata can be

leveraged for routing

Page 40: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

API Gateway & Routing

Page 41: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 42: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Hides partitioning of microservices

Single point of entry

Client-tailored API

Request aggregationfor performance

Simplifies clients by aggregation of APIs

Increased complexity

Increased response time by network hop

Page 43: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Surgical Routing

Stress Testing

Canary Testing

Authentication

Authorization

Choosing origin servers

Logging debug info

Adding headers

Gathering statistics and metrics

Filter error handling

Generate static responses

Load Shedding

Dynamic behaviour change

Page 44: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 45: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 46: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Architect for Failure

Page 47: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 48: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 49: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 50: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 51: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 52: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Deployment

Page 53: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

from CI to CD

Page 54: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Continuous Integration Infrastructure

build

Source Control System

Monolithic Build

single version tree

/preference-service /ordering-service /inventory-service …

Repositorypreference-service-

artefact-311

preference-service-artefact-311

preference-service-artefact-311

Page 55: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Continuous Integration Infrastructure

Source Control System

own version tree

/preference-service

Repository

/ordering-service

Repository

/inventory-service

Repository

MicroService Build preference-service-artefact-765

preference-service-artefact-311MicroService Build

preference-service-artefact-459MicroService Build

Page 56: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

preference-service-artefact-765

preference-service-artefact-311

preference-service-artefact-459

preference-service-artefact-765

deployment contextHandover environment specific technology specific application specific

Page 57: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

preference-service-artefact-765

preference-service-artefact-311

preference-service-artefact-459

preference-service-artefact-765

deployment contextHandover

Automated installation scripts

⊖ execution time lots of scripts with small delta’s

⊕ transaction cost goes down repeatable deployments

Machine image with backed in microservice as build artefact

Page 58: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

preference-service-artefact-765

preference-service-artefact-311

preference-service-artefact-459

preference-service-artefact-765

HandoverMachine image with backed in microservice as build artefact

VM Image

⊖ overhead of machine VM based deployment

⊕ speed of deployment

Containers with backed in microservice as build artefact

Page 59: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Compute, Storage, Network

Host OS

Hypervisor

VM1

MicroService

Guest OS

JVM

VM’s abstract underlying hardware, but limits resource utilisation

VM2

MicroService

Guest OS

JVM

• Isolation

• namespace

• pid mnt net uts ipc user

• resource usage

• (CPU, memory, disk I/O, etc.)

• Limited impact on Performance -

• http://ibm.co/V55Otq

• Daemon and CLI

Compute, Storage, Network

Host OS

container1

container2

container3

container4

JVM JVM JVM

MicroService MicroService MicroService

JVM

MicroService

Containers have own isolated resources

Page 60: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

/preference-service

Repository

DockerFile

Continuous Integration Infrastructure

Container Image Repository

Compute, Storage, Network

Host OS

daemon

container1

JVM

MicroService

pull

push

build

provision

container1

JVM

MicroService

Source Control System

Page 61: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Container Image

preference-service-artefact-765

Page 62: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 63: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Patterns

Page 64: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Container Image

preference-service-artefact-765

Blue Green

Content Based Router

Blue/Green deployments

Container Image

preference-service-artefact-765

Container Image

preference-service-artefact-123

production traffictest traffic

Page 65: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Container Image

preference-service-artefact-765

Stage 1 Stage 2 Stage 3

Content Based Router

Canary staged deployment

Page 66: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 67: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 68: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 69: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 70: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 71: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Zipkin + Sleuth heavily borrowing from Dapper & HTrace

Page 72: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

CollectD & StatsD

Page 73: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 74: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 75: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 76: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 77: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 78: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 79: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 80: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 81: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

Roll Your Own

https://github.com/DennisJaamann/micro-services-gui/tree/dev

Page 82: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

What about DynaTrace?

Page 83: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG
Page 84: Microservices with Stijn Van den Enden & Andreas Evers - BeJUG

- Correct Functional decomposition is crucial - reflect it in a organisational structure (💡Conway’s law)

- Getting it right is not guaranteed to be easy - your aiming for a very high standard in software delivery - balance the needs (advantages) with the costs (tradeoffs)

- take a simple step at a time

Conclusion

Are they here to stay?who can tell? but the monolith is dead