java microservices with netflix oss & spring

56
JAVA MICROSERVICES WITH NETFLIX OSS & SPRING CONOR SVENSSON

Upload: conor-svensson

Post on 16-Apr-2017

1.464 views

Category:

Technology


12 download

TRANSCRIPT

Page 1: Java Microservices with Netflix OSS & Spring

JAVA MICROSERVICES WITH NETFLIX OSS & SPRING

CONOR SVENSSON

Page 2: Java Microservices with Netflix OSS & Spring
Page 3: Java Microservices with Netflix OSS & Spring
Page 4: Java Microservices with Netflix OSS & Spring

SPRING BOOT

SPRING BOOT

▸ Stand-alone Spring-based applications

▸ Tomcat embedded container (supports Jetty & JBoss Undertow too)

▸ Starter POMs

▸ Annotation driven

Page 5: Java Microservices with Netflix OSS & Spring

SPRING BOOT

DEPLOYMENT

▸ Self contained jar

▸ Web application archive

▸ Build targets

▸ $ mvn spring-boot:run

▸ $ gradle bootRun

Page 6: Java Microservices with Netflix OSS & Spring

SPRING BOOT

Page 7: Java Microservices with Netflix OSS & Spring

ACME HOME LOANS

Page 8: Java Microservices with Netflix OSS & Spring

ACME HOME LOANS

LOAN APPLICATION

EXTERNAL CREDIT

SERVICE

WEBSITE SERVICE

SUBMISSION SERVICE

1

2 3

Page 9: Java Microservices with Netflix OSS & Spring

ACME HOME LOANS

Page 10: Java Microservices with Netflix OSS & Spring

ACME HOME LOANS

Page 11: Java Microservices with Netflix OSS & Spring

ACME HOME LOANS

Page 12: Java Microservices with Netflix OSS & Spring

SPRING BOOT

TESTING

▸ spring-boot-starter-test starter POM provides:

▸ Spring Test

▸ Unit

▸ Hamcrest + Assert4J (v1.4)

▸ Mockito

▸ MockMvc

▸ @WebIntegrationTest

Page 13: Java Microservices with Netflix OSS & Spring
Page 14: Java Microservices with Netflix OSS & Spring
Page 15: Java Microservices with Netflix OSS & Spring

SPRING BOOT

CONFIGURATION BEANS

Page 16: Java Microservices with Netflix OSS & Spring
Page 17: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

SPRING CLOUD

▸ Microservice friendly components

▸ Distributed & versioned configuration

▸ Service discovery

▸ Dynamic routing

▸ Circuit breakers

▸ Distributed messaging

▸ Getting started:

Page 18: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

SPRING CLOUD

▸ Config

▸ Netflix

▸ Bus

▸ Cloud Foundry

▸ Cluster

▸ Consul

▸ Security

▸ Sleuth

▸ Data Flow

▸ Stream

▸ Modules

▸ Task

▸ Zookeeper

▸ AWS

▸ Connectors

▸ CLI

Page 19: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

CONFIG SERVER

▸ Git hosted configuration repository

▸ SVN & filesystem also supported (see implementations of org.springframework.cloud.config.server.EnvironmentRepository)

▸ Multiple security options w/Spring Security (HTTP Basic -> OAuth bearer tokens)

▸ Push updates via Spring Cloud Bus

Page 20: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

CONFIG SERVER

Page 21: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

CONFIG SERVER CONFIGURATION

application.yml:

Page 22: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

CLIENT CONFIGURATION FILE

website.yml:

Page 23: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

RESOURCE FORMAT

/{application}/{profile}[/{label}]

/{application}-{profile}.yml

/{label}/{application}-{profile}.yml

/{application}-{profile}.properties

/{label}/{application}-{profile}.properties

(label: master by default)

Page 24: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

RESOLVED CONFIGURATION

Page 25: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

SHARED RESOURCES

▸ Place in application.yml in root of configuration repo

▸ Profile specific configuration always takes precedence over shared

▸ E.g. Eureka server (more on this shortly)

Page 26: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

CLIENT CONFIGURATION

bootstrap.yml:

Page 27: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

CLIENT PROFILES

▸ Annotate classes to associate with a profile

▸ @Profile(“…”)

▸ Configuration (bootstrap/application properties)

▸ spring.profiles.active = …

▸ Command line

▸ -Dspring.profiles.active=…

▸ Environment variable

▸ SPRING_PROFILES_ACTIVE=…

Page 28: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

RESOLVED CLIENT CONFIGURATION

Page 29: Java Microservices with Netflix OSS & Spring

SPRING CLOUD

CONFIG SERVER GOTCHAS

▸ Client’s don’t fail on Config Server failure - boot with defaults (e.g. port 8080)

▸ To enable use spring.cloud.config.failFast=true

▸ Enable retries:

▸ Add spring-retry and spring-boot-starter-aop

▸ spring.cloud.config.retry.

Page 30: Java Microservices with Netflix OSS & Spring
Page 31: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

SPRING CLOUD NETFLIX

▸ Service discovery (Eureka)

▸ Client side load balancing (Ribbon)

▸ Dynamic routing (Zuul)

▸ Circuit breaker (Hystrix)

▸ + a few others…

Page 32: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

EUREKA

▸ Service discovery client & server

▸ Maintains registry of clients with metadata

▸ Host/port

▸ Health indicator URL

▸ Client heartbeats (30 sec default - changing not encouraged)

▸ Lease renewed with server

▸ Service available when client & server(s) metadata cache all in sync

▸ Can take up to 3 heart beats

Page 33: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

EUREKA SERVER

Page 34: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

EUREKA SERVER DASHBOARD

Page 35: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

EUREKA CLIENT SETUP

@EnableEurekaClient annotation

application.yml in Config Server repo

Page 36: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

RIBBON

▸ Client side loan balancer

▸ Can delegate to Eureka for server lists

▸ Or list servers

▸ stores.ribbon.listOfServers=… + ribbon.eureka.enabled=false

Page 37: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

RIBBON USAGE

▸ Via RestTemplate

▸ No different to normal usage - Spring Cloud Commons abstraction

▸ Qualifier’s required if using regular & Ribbon enabled RestTemplate

Page 38: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

ZUUL

▸ JVM based router & load balancer

▸ Provides single point of entry to services

▸ Including single point of authentication

▸ By default creates route for every service in Eureka

▸ Refer to http://localhost/credit-service routes to http://credit-service

▸ Filters provide limited entry points to system

Page 39: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

ZUUL SERVER CREATION

‣ Include dependency spring-cloud-starter-zuul

‣ @EnableZuulProxy application annotation

‣ E.g. Allow access only to credit-service

Page 40: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

SIDECAR

▸ Non-JVM access to components via Zuul proxy

▸ Setup Spring Boot application with @EnableSidecar

▸ Configure for your service:

▸ sidecar.port=… + sidecar.health-ui=…

▸ Access all services by Zuul URL (Sidecar running on port 80)

▸ http://localhost/config-server

Page 41: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

HYSTRIX

▸ Circuit breaker

▸ Threshold breached (20 failures in 5 seconds) => breaker kicks in

▸ Default timeout threshold 1 second

▸ Per dependency thread pools

▸ Async command support (not Spring @Async)

▸ Sync or async fallback

Page 42: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

HYSTRIX CLIENT

▸ @EnableCircuitBreaker application annotation

▸ @HystrixCommand on applicable methods

Page 43: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

Page 44: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

HYSTRIX STREAM - PRE-REQUESTS

Page 45: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

HYSTRIX STREAM - POST-REQUESTS

Page 46: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

HYSTRIX DASHBOARD

Page 47: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

HYSTRIX STREAM

Page 48: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

HYSTRIX DASHBOARD

Page 49: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

TURBINE - AGGREGATE MULTIPLE HYSTRIX CLIENTS

Page 50: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

MONITORING

▸ Add dependency spring-boot-actuator

▸ Makes available various application metrics via /metrics endpoint

▸ Integration also available with DropWizard metrics (add dependency)

▸ Spring Cloud

▸ Spectator (supersedes Servo) - metrics collection

▸ Atlas - metrics backend

Page 51: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

Page 52: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

LOGGING

▸ Logback is the default choice

▸ Alternative starters are provided

▸ Using alternatives (such as log4j2) requires exclusions throughout the starter POMs

Page 53: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

DOWNSIDES

▸ A lot of magic - e.g. CORS filters

▸ ADD (Annotation driven development)

▸ Dependency management

▸ RestTemplates - Ribbon enabled != Standard HTTP

▸ Lack of proper polygot support - libraries are in Java (Sidecar is OK as a middle ground)

▸ Spring Hystrix documentation is pretty light

Page 54: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

ALTHOUGH…

Page 55: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

RESOURCES

▸ Spring Cloud documentation - http://projects.spring.io/spring-cloud/spring-cloud.html

▸ Spring Boot sample projects - https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples

▸ Spring Cloud sample projects - https://github.com/spring-cloud-samples

▸ Hystrix annotations - https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica

▸ Useful demonstration of Spring Cloud usage - http://callistaenterprise.se/blogg/teknik/2015/05/20/blog-series-building-microservices/

▸ Spring project dependency selector - http://start.spring.io/

▸ Code to accompany this talk - https://github.com/conor10/homeloans

▸ https://www.huffle.com.au

Page 56: Java Microservices with Netflix OSS & Spring

NETFLIX OSS + SPRING

THANKS

[email protected]