97
Microservices Are your Frameworks ready? Martin Eigenbrodt | [email protected] Alexander Heusingfeld | [email protected]

MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

MicroservicesAre your Frameworks ready?

Martin Eigenbrodt | [email protected]

Alexander Heusingfeld | [email protected]

Page 2: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Microservices?

Page 3: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Levels of Architecture

Page 4: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI
Page 5: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Domain architecture

Page 6: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Macro (technical) architecture

Domain architecture

Page 7: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

JRuby C#

ScalaGroovy

JavaClojure

Page 8: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

RDBMSNoSQL

K/V

RDBMS RDBMS/DWHNoSQLDocDB

Page 9: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

RDBMSNoSQL

K/V

RDBMS RDBMS/DWHNoSQLDocDB

Micro architecture

Page 10: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Challenges

Page 11: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI
Page 12: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Challenges

Page 13: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Challenges

> many services to take care of

Page 14: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Challenges

> many services to take care of

> distributed system

Page 15: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Challenges

> distributed configuration

> service registration & discovery

> resilience

> fast, automated deployment

> metrics

Page 16: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Macro- vs. Micro Architecture

Page 17: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Frameworks

Page 18: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Dropwizard

Page 19: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Dropwizard

> Glue Code for well known libraries

> Java

Page 20: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Dropwizard libraries

Page 21: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Dropwizard libraries

> Jetty

Page 22: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Dropwizard libraries

> Jetty

> Jersey

Page 23: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Dropwizard libraries

> Jetty

> Jersey

> Metrics

Page 24: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Dropwizard libraries

> Jetty

> Jersey

> Metrics

> Jackson

> Guava

> Logback

> Hibernate Validator

> Apache Http Client

> JDBI

> Liquibase

> Freemarker & Mustache

> Joda

Page 25: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Bootand Spring Cloud

Page 26: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot

Page 27: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot

> convention over configuration approach

Page 28: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot

> convention over configuration approach

> Java, Groovy or Scala

Page 29: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot

> convention over configuration approach

> Java, Groovy or Scala

> self-contained jar or war

Page 30: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot

> convention over configuration approach

> Java, Groovy or Scala

> self-contained jar or war

> tackles dependency-hell via pre-packaging

Page 31: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud

Page 32: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud

> umbrella project for cloud connectors

Page 33: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud

> umbrella project for cloud connectors

> On top of Spring Boot

Page 34: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud

> umbrella project for cloud connectors

> On top of Spring Boot

> config server for distributed configuration

Page 35: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud

> umbrella project for cloud connectors

> On top of Spring Boot

> config server for distributed configuration

> annotations for service-discovery & resilience

Page 36: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play 2

Page 37: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play 2

> Java or Scala

> based on Akka

> strong async support

Page 38: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Configuration

Page 39: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play - Typesafe Config

Page 40: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play - Typesafe Config

> Config Library used by akka, play and other

Page 41: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play - Typesafe Config

> Config Library used by akka, play and other

> HOCON - JSON Data Model + syntactic sugar

Page 42: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play - Typesafe Config

> Config Library used by akka, play and other

> HOCON - JSON Data Model + syntactic sugar

> override via system property

Page 43: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play - Typesafe Config

> Config Library used by akka, play and other

> HOCON - JSON Data Model + syntactic sugar

> override via system property

> rich merge and include possibilities

Page 44: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot@ComponentScan@EnableAutoConfigurationpublic class OrderApp { public static void main(String[] args) { SpringApplication.run(OrderApp.class, args); }}

Page 45: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot@ComponentScan@EnableAutoConfigurationpublic class OrderApp { public static void main(String[] args) { SpringApplication.run(OrderApp.class, args); }}

Page 46: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot

> HTTP resource “/autoconfig” shows all properties

@ComponentScan@EnableAutoConfigurationpublic class OrderApp { public static void main(String[] args) { SpringApplication.run(OrderApp.class, args); }}

Page 47: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot

> HTTP resource “/autoconfig” shows all properties

> overwrite via application.properties or CLI parameter

@ComponentScan@EnableAutoConfigurationpublic class OrderApp { public static void main(String[] args) { SpringApplication.run(OrderApp.class, args); }}

Page 48: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot

> HTTP resource “/autoconfig” shows all properties

> overwrite via application.properties or CLI parameter

> configuration in git? -> Check spring-cloud configserver

@ComponentScan@EnableAutoConfigurationpublic class OrderApp { public static void main(String[] args) { SpringApplication.run(OrderApp.class, args); }}

Page 49: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Http Client

Page 50: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Dropwizard

public Product resolveProduct(String url) {Product product = client.resource(url)

.accept(MediaType.APPLICATION_JSON).get(Product.class);return product;

}

Page 51: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot

public Product resolveProduct(String url) { return restTemplate.getForEntity(url, Product.class); }

Page 52: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

WS.url(apiUrl).get.map { response => response.json.as[List[Bestseller]] }.recover { case e => List() }

Play

Page 53: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Service Discovery

Page 54: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Service

Service Discovery

Client

Service Registry

2. discover service instances

3. call service instanceServiceService

1. register service ("myself") & heartbeat

Page 55: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud@ComponentScan@EnableAutoConfiguration@EnableDiscoveryClientpublic class OrdersApp { public static void main(String[] args) { SpringApplication.run(OrdersApp.class, args); }}

Page 56: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud@ComponentScan@EnableAutoConfiguration@EnableDiscoveryClientpublic class OrdersApp { public static void main(String[] args) { SpringApplication.run(OrdersApp.class, args); }}

Page 57: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud@ComponentScan@EnableAutoConfiguration@EnableDiscoveryClientpublic class OrdersApp { public static void main(String[] args) { SpringApplication.run(OrdersApp.class, args); }}

Page 58: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Service Discovery with Sidecar

Sidecar Client

Service Registry

Sidecar Service

2. register service ("myself") & heartbeat

4. discover service instances

5. call service instance

1. health check

3.

Page 59: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Resilience

Page 60: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Resilience

> isolate Failure

> apply graceful degradation

> be responsive in case of failure

Page 61: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Request service

http://en.wikipedia.org/wiki/Circuit_breaker

closed

Page 62: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Request service

http://en.wikipedia.org/wiki/Circuit_breaker

closed

Request serviceopen

Page 63: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Request service

http://en.wikipedia.org/wiki/Circuit_breaker

closed

Request serviceopen

Request servicehalf- open

Page 64: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

> Provides Command-oriented Integration of Services

> Introduces Circuit Breaker, Bulkheads and Isolation

> Decouples from Service-dependencies

> Provides metrics-facility to protect from failures

Page 65: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Hystrix & Dropwizardpublic class CommandInDropwizard extends TenacityCommand<Product> {

@Override protected Product run() throws Exception {

Product product = client.resource(url).accept(MediaType.APPLICATION_JSON).get(Product.class);

return product; } protected Product getFallback() { return FALLBACK_PRODUCT }

}

Page 66: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Hystrix & Dropwizardpublic class CommandInDropwizard extends TenacityCommand<Product> {

@Override protected Product run() throws Exception {

Product product = client.resource(url).accept(MediaType.APPLICATION_JSON).get(Product.class);

return product; } protected Product getFallback() { return FALLBACK_PRODUCT }

}

Page 67: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Hystrix & Dropwizardpublic class CommandInDropwizard extends TenacityCommand<Product> {

@Override protected Product run() throws Exception {

Product product = client.resource(url).accept(MediaType.APPLICATION_JSON).get(Product.class);

return product; } protected Product getFallback() { return FALLBACK_PRODUCT }

}

Page 68: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Hystrix & Dropwizardpublic class CommandInDropwizard extends TenacityCommand<Product> {

@Override protected Product run() throws Exception {

Product product = client.resource(url).accept(MediaType.APPLICATION_JSON).get(Product.class);

return product; } protected Product getFallback() { return FALLBACK_PRODUCT }

}

Page 69: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

ResolveProductCommand command = new ResolveProductCommand(client, url);Product product = command.execute();

Hystrix & Dropwizard

Page 70: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud Hystrix

@HystrixCommand(fallbackMethod = “fallbackProduct") private Pair<String, ResponseEntity<Product>> resolveProduct(String productUri) { final RestTemplate restTemplate = new RestTemplate(); return new Pair(productUri, restTemplate.getForEntity(productUri, Product.class));}

private Pair<String, ResponseEntity<Product>> fallbackProduct(String productUri) { final Product product = new Product(productUri, null, BigDecimal.ZERO); final ResponseEntity<Product> response = new ResponseEntity<Product>(product, PARTIAL_CONTENT); return new Pair(productUri, response);}

Page 71: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud Hystrix

@HystrixCommand(fallbackMethod = “fallbackProduct") private Pair<String, ResponseEntity<Product>> resolveProduct(String productUri) { final RestTemplate restTemplate = new RestTemplate(); return new Pair(productUri, restTemplate.getForEntity(productUri, Product.class));}

private Pair<String, ResponseEntity<Product>> fallbackProduct(String productUri) { final Product product = new Product(productUri, null, BigDecimal.ZERO); final ResponseEntity<Product> response = new ResponseEntity<Product>(product, PARTIAL_CONTENT); return new Pair(productUri, response);}

auto-wrapped with command!

Page 72: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud Hystrix

@HystrixCommand(fallbackMethod = “fallbackProduct") private Pair<String, ResponseEntity<Product>> resolveProduct(String productUri) { final RestTemplate restTemplate = new RestTemplate(); return new Pair(productUri, restTemplate.getForEntity(productUri, Product.class));}

private Pair<String, ResponseEntity<Product>> fallbackProduct(String productUri) { final Product product = new Product(productUri, null, BigDecimal.ZERO); final ResponseEntity<Product> response = new ResponseEntity<Product>(product, PARTIAL_CONTENT); return new Pair(productUri, response);}

Page 73: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud Hystrix

@HystrixCommand(fallbackMethod = “fallbackProduct") private Pair<String, ResponseEntity<Product>> resolveProduct(String productUri) { final RestTemplate restTemplate = new RestTemplate(); return new Pair(productUri, restTemplate.getForEntity(productUri, Product.class));}

private Pair<String, ResponseEntity<Product>> fallbackProduct(String productUri) { final Product product = new Product(productUri, null, BigDecimal.ZERO); final ResponseEntity<Product> response = new ResponseEntity<Product>(product, PARTIAL_CONTENT); return new Pair(productUri, response);}

Page 74: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Cloud Hystrix

@HystrixCommand(fallbackMethod = “fallbackProduct") private Pair<String, ResponseEntity<Product>> resolveProduct(String productUri) { final RestTemplate restTemplate = new RestTemplate(); return new Pair(productUri, restTemplate.getForEntity(productUri, Product.class));}

private Pair<String, ResponseEntity<Product>> fallbackProduct(String productUri) { final Product product = new Product(productUri, null, BigDecimal.ZERO); final ResponseEntity<Product> response = new ResponseEntity<Product>(product, PARTIAL_CONTENT); return new Pair(productUri, response);}

method reference!

Page 75: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play - Circuit Breaker

val apiUrl = "..." val breaker = CircuitBreaker(Akka.system().scheduler, maxFailures = 5, callTimeout = 2.seconds, resetTimeout = 1.minute)

def getBestseller : Future[List[Bestseller]] = { breaker.withCircuitBreaker( WS.url(apiUrl).get.map { response => response.json.as[List[Bestseller]] }).recover { case e => List() } }

Page 76: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play - Circuit Breaker

val apiUrl = "..." val breaker = CircuitBreaker(Akka.system().scheduler, maxFailures = 5, callTimeout = 2.seconds, resetTimeout = 1.minute)

def getBestseller : Future[List[Bestseller]] = { breaker.withCircuitBreaker( WS.url(apiUrl).get.map { response => response.json.as[List[Bestseller]] }).recover { case e => List() } }

Page 77: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play - Circuit Breaker

val apiUrl = "..." val breaker = CircuitBreaker(Akka.system().scheduler, maxFailures = 5, callTimeout = 2.seconds, resetTimeout = 1.minute)

def getBestseller : Future[List[Bestseller]] = { breaker.withCircuitBreaker( WS.url(apiUrl).get.map { response => response.json.as[List[Bestseller]] }).recover { case e => List() } }

Page 78: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play - Circuit Breaker

val apiUrl = "..." val breaker = CircuitBreaker(Akka.system().scheduler, maxFailures = 5, callTimeout = 2.seconds, resetTimeout = 1.minute)

def getBestseller : Future[List[Bestseller]] = { breaker.withCircuitBreaker( WS.url(apiUrl).get.map { response => response.json.as[List[Bestseller]] }).recover { case e => List() } }

Page 79: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play - Circuit Breaker

val apiUrl = "..." val breaker = CircuitBreaker(Akka.system().scheduler, maxFailures = 5, callTimeout = 2.seconds, resetTimeout = 1.minute)

def getBestseller : Future[List[Bestseller]] = { breaker.withCircuitBreaker( WS.url(apiUrl).get.map { response => response.json.as[List[Bestseller]] }).recover { case e => List() } }

Page 80: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Deployment

Page 81: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot - Packaging

./gradlew build

./gradlew distZip

Page 82: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot - Packaging

./gradlew build

./gradlew distZip

executable JAR

Page 83: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot - Packaging

./gradlew build

./gradlew distZipZIP + shell-script

executable JAR

Page 84: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Play - Packaging

sbt distsbt debian:packageBinsbt rpm:packageBin

Page 85: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Metrics

Page 86: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Dropwizard

> “Metrics” Integrated with Dropwizard

> @Timed on Resources

> HTTP Client is already instrumented

> JVM Data

Page 87: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

"org.apache.http.client.HttpClient.cart.get-requests": { "count": 11, "max": 0.062107, "mean": 0.013355909090909092, "min": 0.005750000000000001, "p50": 0.009454, "p75": 0.010427, "p95": 0.062107, "p98": 0.062107, "p99": 0.062107, "p999": 0.062107, "stddev": 0.016285873488729705, "m15_rate": 0, "m1_rate": 0, "m5_rate": 0, "mean_rate": 2.9714422786532126, "duration_units": "seconds", "rate_units": "calls/second" }

"cart.resources.ShoppingCartResource.shoppingCart": { "count": 22, "max": 0.136162, "mean": 0.01208109090909091, "min": 0.00093, "p50": 0.008174500000000001, "p75": 0.011782250000000001, "p95": 0.11783499999999976, "p98": 0.136162, "p99": 0.136162, "p999": 0.136162, "stddev": 0.02813530239821426, "m15_rate": 1.8524577712890011, "m1_rate": 0.18057796798879996, "m5_rate": 1.315746847992022, "mean_rate": 0.133050618509084, "duration_units": "seconds", "rate_units": "calls/second" }

Page 88: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Dropwizard Metrics

> Exposed over HTTP (as Json)

> Exposed as jmx

> Others available: stdout, csv, slf4j, ganglia, graphite

Page 89: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Spring Boot Metrics

> Prepackaged Spring Boot starter module

> enables HTTP resources for metrics

> configurable via application.properties

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#production-ready

Page 90: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

{

"counter.checkouts.withproducts.3": 4, ... }

counterService.increment("checkouts.withproducts." + productUris.size());

GET /metrics HTTP/1.1

Using a counter metric in your Java code…

…will display it in the /metrics JSON

Spring Boot Metrics

Page 91: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Summary

Page 92: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Modularize into independent, self-contained systems

Summary

Page 93: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Modularize into independent, self-contained systems

Separate micro and macro architectures

Summary

Page 94: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Modularize into independent, self-contained systems

Separate micro and macro architectures

Strike a balance between control and decentralization

Summary

Page 95: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Modularize into independent, self-contained systems

Separate micro and macro architectures

Strike a balance between control and decentralization

MicroServices aren’t micro!

Summary

Page 96: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Modularize into independent, self-contained systems

Separate micro and macro architectures

Strike a balance between control and decentralization

MicroServices aren’t micro!

frameworks can’t solve all your problems

Summary

Page 97: MicroServices - Are your frameworks ready--microxchg · Dropwizard libraries > Jetty > Jersey > Metrics > Jackson > Guava > Logback > Hibernate Validator > Apache Http Client > JDBI

Martin Eigenbrodt | @eigenbrodtm [email protected]

Alexander Heusingfeld | @goldstift [email protected]

innoQ Deutschland GmbH

Krischerstr. 100 40789 Monheim am Rhein Germany Phone: +49 2173 3366-0

innoQ Schweiz GmbH

Gewerbestr. 11 CH-6330 Cham Switzerland Phone: +41 41 743 0116www.innoq.com

Ohlauer Straße 43 10999 Berlin Germany Phone: +49 2173 3366-0

Robert-Bosch-Straße 7 64293 Darmstadt Germany Phone: +49 2173 3366-0

Radlkoferstraße 2 D-81373 München Germany Telefon +49 (0) 89 741185-270

Thank you! Questions?

Comments?

https://www.innoq.com/en/talks/2015/02/microservices-jvm-applications-talk