Slide 1

Slide 1 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM MicroServices on the JVM A practical overview Alexander Heusingfeld & Martin Eigenbrodt

Slide 2

Slide 2 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM #MicroServices #buzz • Defined by LOC? • UI or not UI? • SOA in new clothes?

Slide 3

Slide 3 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM “Micro” Services?

Slide 4

Slide 4 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM “Micro” Services? Monolith

Slide 5

Slide 5 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM “Micro” Services? Monolith

Slide 6

Slide 6 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM “Micro” Services? Monolith A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A C A A B D Y K

Slide 7

Slide 7 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM “Micro” Services? Monolith A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A C A A B D Y K

Slide 8

Slide 8 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM “Micro” Services? Monolith System A System B System C System D A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A C A A B D Y K

Slide 9

Slide 9 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM “Micro” Services? Monolith System A System B System C System D A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A C A A B D Y K

Slide 10

Slide 10 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Our approach

Slide 11

Slide 11 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Our approach • build around business capabilities

Slide 12

Slide 12 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Our approach • build around business capabilities • separate runtime processes

Slide 13

Slide 13 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Our approach • build around business capabilities • separate runtime processes • self-contained

Slide 14

Slide 14 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Our approach • build around business capabilities • separate runtime processes • self-contained • loosely coupled

Slide 15

Slide 15 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Our approach • build around business capabilities • separate runtime processes • self-contained • loosely coupled • independent life cycles

Slide 16

Slide 16 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Our approach • build around business capabilities • separate runtime processes • self-contained • loosely coupled • independent life cycles • decentralised management

Slide 17

Slide 17 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Our approach • build around business capabilities • separate runtime processes • self-contained • loosely coupled • independent life cycles • decentralised management Self-Contained System

Slide 18

Slide 18 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM We’re not talking about…

Slide 19

Slide 19 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM We’re not talking about… • micro architecture

Slide 20

Slide 20 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM We’re not talking about… • micro architecture • slicing howtos

Slide 21

Slide 21 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM We’re not talking about… • micro architecture • slicing howtos • communication protocol

Slide 22

Slide 22 text

System A System B System C

Slide 23

Slide 23 text

System A System B Persistence Logic UI System C Logic UI Persistence Logic

Slide 24

Slide 24 text

System A System B Persistence Logic UI System C HTTP HTTP Logic UI Persistence Logic

Slide 25

Slide 25 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Challenges

Slide 26

Slide 26 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Challenges • distributed configuration

Slide 27

Slide 27 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Challenges • distributed configuration • service registration & discovery

Slide 28

Slide 28 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Challenges • distributed configuration • service registration & discovery • resilience

Slide 29

Slide 29 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Challenges • distributed configuration • service registration & discovery • resilience • fast, automated deployment

Slide 30

Slide 30 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Challenges • distributed configuration • service registration & discovery • resilience • fast, automated deployment • metrics

Slide 31

Slide 31 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Frameworks

Slide 32

Slide 32 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Dropwizard

Slide 33

Slide 33 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Dropwizard • Glue Code for well known libraries • Java

Slide 34

Slide 34 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Dropwizard libraries

Slide 35

Slide 35 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Dropwizard libraries • Jetty

Slide 36

Slide 36 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Dropwizard libraries • Jetty • Jersey

Slide 37

Slide 37 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Dropwizard libraries • Jetty • Jersey • Metrics

Slide 38

Slide 38 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Dropwizard libraries • Jetty • Jersey • Metrics • Jackson • Guava • Logback • Hibernate Validator • Apache Http Client • JDBI • Liquibase • Freemarker & Mustache • Joda

Slide 39

Slide 39 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot

Slide 40

Slide 40 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot

Slide 41

Slide 41 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot • convention over configuration approach

Slide 42

Slide 42 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot • convention over configuration approach • Java, Groovy or Scala

Slide 43

Slide 43 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot • convention over configuration approach • Java, Groovy or Scala • self-contained jar or war

Slide 44

Slide 44 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot • convention over configuration approach • Java, Groovy or Scala • self-contained jar or war • tackles dependency-hell via pre-packaging

Slide 45

Slide 45 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Cloud

Slide 46

Slide 46 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Cloud • new umbrella project for cloud connectors

Slide 47

Slide 47 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Cloud • new umbrella project for cloud connectors • On top of Spring Boot

Slide 48

Slide 48 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Cloud • new umbrella project for cloud connectors • On top of Spring Boot • config server for distributed configuration

Slide 49

Slide 49 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Cloud • new umbrella project for cloud connectors • On top of Spring Boot • config server for distributed configuration • Eureka annotations for service-discovery

Slide 50

Slide 50 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Cloud • new umbrella project for cloud connectors • On top of Spring Boot • config server for distributed configuration • Eureka annotations for service-discovery • Hystrix annotations for resilience enhancements

Slide 51

Slide 51 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Play 2

Slide 52

Slide 52 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Play 2 • Java or Scala • based on Akka • strong async support

Slide 53

Slide 53 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Routing

Slide 54

Slide 54 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM @Path ("/cart") public class ShoppingCartResource { @GET @Path("{id}") @Timed @Produces(MediaType.TEXT_HTML) public ShoppingCartView shoppingCart(@PathParam("id") String cartId, @Context UriInfo uriInfo) { ImmutableList urls = dao.findItemsForCartId(cartId); ImmutableList products = catalog.resolveProducts(urls); return new ShoppingCartView(products, uriInfo.getAbsolutePath().toString() ); } ... } Dropwizard

Slide 55

Slide 55 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM @Controller
 @RequestMapping(value = ORDERS_RESOURCE)
 public class OrderController {
 
 private @Autowired CounterService counterService;
 
 @RequestMapping(method = RequestMethod.POST)
 public String checkoutCart(@RequestParam(value = "products") List productUris) {
 counterService.increment("checkouts.withproducts." + productUris.size());
 
 // save products as an order 
 return "redirect:" ORDERS_RESOURCE + order.getId(); // like “/order/123”
 }
 } Spring Boot

Slide 56

Slide 56 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM # Routes # List of all books GET / controllers.BooksController.books # A specific Book GET /books/:id controllers.BooksController.book(id:String) Play

Slide 57

Slide 57 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM object BooksController extends Controller { def books = Action.async { implicit request => val bestsellerFuture = Bestseller.getBestseller val booksFuture = Books.books for { bestseller <- bestsellerFuture books <- booksFuture } yield { Ok(views.html.books(books.values.toList, bestseller)) } } ... } Play

Slide 58

Slide 58 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Configuration

Slide 59

Slide 59 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot @ComponentScan
 @EnableAutoConfiguration
 public class OrderApp {
 
 public static void main(String[] args) {
 SpringApplication.run(OrderApp.class, args);
 }
 }

Slide 60

Slide 60 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot @ComponentScan
 @EnableAutoConfiguration
 public class OrderApp {
 
 public static void main(String[] args) {
 SpringApplication.run(OrderApp.class, args);
 }
 }

Slide 61

Slide 61 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot • opinionated preset @ComponentScan
 @EnableAutoConfiguration
 public class OrderApp {
 
 public static void main(String[] args) {
 SpringApplication.run(OrderApp.class, args);
 }
 }

Slide 62

Slide 62 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot • opinionated preset • HTTP resource “/env” shows all properties @ComponentScan
 @EnableAutoConfiguration
 public class OrderApp {
 
 public static void main(String[] args) {
 SpringApplication.run(OrderApp.class, args);
 }
 }

Slide 63

Slide 63 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot • opinionated preset • HTTP resource “/env” shows all properties • overwrite via application.properties or CLI parameter @ComponentScan
 @EnableAutoConfiguration
 public class OrderApp {
 
 public static void main(String[] args) {
 SpringApplication.run(OrderApp.class, args);
 }
 }

Slide 64

Slide 64 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Play - Typesafe Config

Slide 65

Slide 65 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Play - Typesafe Config • Config Library used by akka, play and other

Slide 66

Slide 66 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Play - Typesafe Config • Config Library used by akka, play and other • HOCON - JSON Data Model + syntactic sugar

Slide 67

Slide 67 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Play - Typesafe Config • Config Library used by akka, play and other • HOCON - JSON Data Model + syntactic sugar • override via system property

Slide 68

Slide 68 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM 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

Slide 69

Slide 69 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Http Client

Slide 70

Slide 70 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM public Product resolveProduct(String url) { Product product = client.resource(url) .accept(MediaType.APPLICATION_JSON).get(Product.class); return product; } Dropwizard

Slide 71

Slide 71 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM public Product resolveProduct(String url) { final RestTemplate restTemplate = new RestTemplate();
 return restTemplate.getForEntity(url, Product.class);
 } Spring Boot

Slide 72

Slide 72 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM WS.url(apiUrl).get.map { response => response.json.as[List[Bestseller]] }.recover { case e => List() } Play

Slide 73

Slide 73 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Service Discovery

Slide 74

Slide 74 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Registry Service Client register & heartbeat lookup call

Slide 75

Slide 75 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM @ComponentScan
 @EnableAutoConfiguration
 @EnableEurekaServer
 public class EurekaServerApp {
 
 public static void main(String[] args) {
 SpringApplication.run(EurekaServerApp.class, args);
 }
 }

Slide 76

Slide 76 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM @ComponentScan
 @EnableAutoConfiguration
 @EnableEurekaServer
 public class EurekaServerApp {
 
 public static void main(String[] args) {
 SpringApplication.run(EurekaServerApp.class, args);
 }
 } @ComponentScan
 @EnableAutoConfiguration
 @EnableEurekaClient
 public class OrdersApp {
 
 public static void main(String[] args) {
 SpringApplication.run(OrdersApp.class, args);
 }
 }

Slide 77

Slide 77 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM @ComponentScan
 @EnableAutoConfiguration
 @EnableEurekaServer
 public class EurekaServerApp {
 
 public static void main(String[] args) {
 SpringApplication.run(EurekaServerApp.class, args);
 }
 } @ComponentScan
 @EnableAutoConfiguration
 @EnableEurekaClient
 public class OrdersApp {
 
 public static void main(String[] args) {
 SpringApplication.run(OrdersApp.class, args);
 }
 }

Slide 78

Slide 78 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Resilience

Slide 79

Slide 79 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Resilience • isolate Failure • apply graceful degradation • be responsive in case of failure

Slide 80

Slide 80 text

Request service Request service http://en.wikipedia.org/wiki/Circuit_breaker Request service closed open half- open

Slide 81

Slide 81 text

> Provides Command-oriented Integration of Services > Introduces Circuit Breaker, Bulkheads and Isolation > Decouples from Service-dependencies > Provides metrics-facility to protect from failures

Slide 82

Slide 82 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM public class CommandInDropwizard extends TenacityCommand { @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 } } Hystrix & Dropwizard

Slide 83

Slide 83 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM ResolveProductCommand command = new ResolveProductCommand(client, url); Product product = command.execute(); Hystrix & Dropwizard

Slide 84

Slide 84 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM @HystrixCommand(fallbackMethod = “fallbackProduct") private Pair> resolveProduct(String productUri) {
 final RestTemplate restTemplate = new RestTemplate();
 return new Pair(productUri, restTemplate.getForEntity(productUri, Product.class));
 } private Pair> fallbackProduct(String productUri) {
 final Product product = new Product(productUri, null, BigDecimal.ZERO);
 final ResponseEntity response = new ResponseEntity(product, PARTIAL_CONTENT);
 return new Pair(productUri, response);
 } Spring Cloud Hystrix

Slide 85

Slide 85 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM @HystrixCommand(fallbackMethod = “fallbackProduct") private Pair> resolveProduct(String productUri) {
 final RestTemplate restTemplate = new RestTemplate();
 return new Pair(productUri, restTemplate.getForEntity(productUri, Product.class));
 } private Pair> fallbackProduct(String productUri) {
 final Product product = new Product(productUri, null, BigDecimal.ZERO);
 final ResponseEntity response = new ResponseEntity(product, PARTIAL_CONTENT);
 return new Pair(productUri, response);
 } Spring Cloud Hystrix wrapped in command -> async!

Slide 86

Slide 86 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM @HystrixCommand(fallbackMethod = “fallbackProduct") private Pair> resolveProduct(String productUri) {
 final RestTemplate restTemplate = new RestTemplate();
 return new Pair(productUri, restTemplate.getForEntity(productUri, Product.class));
 } private Pair> fallbackProduct(String productUri) {
 final Product product = new Product(productUri, null, BigDecimal.ZERO);
 final ResponseEntity response = new ResponseEntity(product, PARTIAL_CONTENT);
 return new Pair(productUri, response);
 } Spring Cloud Hystrix

Slide 87

Slide 87 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM @HystrixCommand(fallbackMethod = “fallbackProduct") private Pair> resolveProduct(String productUri) {
 final RestTemplate restTemplate = new RestTemplate();
 return new Pair(productUri, restTemplate.getForEntity(productUri, Product.class));
 } private Pair> fallbackProduct(String productUri) {
 final Product product = new Product(productUri, null, BigDecimal.ZERO);
 final ResponseEntity response = new ResponseEntity(product, PARTIAL_CONTENT);
 return new Pair(productUri, response);
 } Spring Cloud Hystrix

Slide 88

Slide 88 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM @HystrixCommand(fallbackMethod = “fallbackProduct") private Pair> resolveProduct(String productUri) {
 final RestTemplate restTemplate = new RestTemplate();
 return new Pair(productUri, restTemplate.getForEntity(productUri, Product.class));
 } private Pair> fallbackProduct(String productUri) {
 final Product product = new Product(productUri, null, BigDecimal.ZERO);
 final ResponseEntity response = new ResponseEntity(product, PARTIAL_CONTENT);
 return new Pair(productUri, response);
 } Spring Cloud Hystrix method reference? :(

Slide 89

Slide 89 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM 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() } } Play - Circuit Breaker

Slide 90

Slide 90 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Deployment

Slide 91

Slide 91 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot - Packaging ./gradlew distZip ./gradlew build

Slide 92

Slide 92 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot - Packaging ./gradlew distZip ./gradlew build ZIP + shell-script

Slide 93

Slide 93 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Spring Boot - Packaging ./gradlew distZip ./gradlew build ZIP + shell-script executable JAR

Slide 94

Slide 94 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Play - Packaging sbt dist sbt debian:packageBin sbt rpm:packageBin

Slide 95

Slide 95 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Metrics

Slide 96

Slide 96 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Dropwizard • “Metrics” Integrated with Dropwizard • @Timed on Resources • HTTP Client is already instrumented • JVM Data

Slide 97

Slide 97 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM "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" } "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" }

Slide 98

Slide 98 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Dropwizard Metrics • Exposed over HTTP (as Json) • Exposed as jmx • Others available: stdout, csv, slf4j, ganglia, graphite

Slide 99

Slide 99 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM 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

Slide 100

Slide 100 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Using a counter metric in your Java code… …will display it in the /metrics JSON counterService.increment("checkouts.withproducts." + productUris.size()); GET /metrics HTTP/1.1 { "counter.checkouts.withproducts.3": 4, ... }

Slide 101

Slide 101 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Conclusion

Slide 102

Slide 102 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Take Aways

Slide 103

Slide 103 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Take Aways • MicroServices aren’t micro!

Slide 104

Slide 104 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Take Aways • MicroServices aren’t micro! • Only “micro” regarding business scope

Slide 105

Slide 105 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Take Aways • MicroServices aren’t micro! • Only “micro” regarding business scope • micro services = distributed systems deep dive

Slide 106

Slide 106 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Take Aways • MicroServices aren’t micro! • Only “micro” regarding business scope • micro services = distributed systems deep dive • no framework is a silver bullet

Slide 107

Slide 107 text

@goldstift @eigenbrodtm #DV14 #MicroservicesJVM Thanks for your attention • Questions? Martin Eigenbrodt, @eigenbrodtm Alexander Heusingfeld, @goldstift https://www.innoq.com/en/timeline/