java microservices with netflix oss & spring

Post on 16-Apr-2017

1.466 Views

Category:

Technology

12 Downloads

Preview:

Click to see full reader

TRANSCRIPT

JAVA MICROSERVICES WITH NETFLIX OSS & SPRING

CONOR SVENSSON

SPRING BOOT

SPRING BOOT

▸ Stand-alone Spring-based applications

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

▸ Starter POMs

▸ Annotation driven

SPRING BOOT

DEPLOYMENT

▸ Self contained jar

▸ Web application archive

▸ Build targets

▸ $ mvn spring-boot:run

▸ $ gradle bootRun

SPRING BOOT

ACME HOME LOANS

ACME HOME LOANS

LOAN APPLICATION

EXTERNAL CREDIT

SERVICE

WEBSITE SERVICE

SUBMISSION SERVICE

1

2 3

ACME HOME LOANS

ACME HOME LOANS

ACME HOME LOANS

SPRING BOOT

TESTING

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

▸ Spring Test

▸ Unit

▸ Hamcrest + Assert4J (v1.4)

▸ Mockito

▸ MockMvc

▸ @WebIntegrationTest

SPRING BOOT

CONFIGURATION BEANS

SPRING CLOUD

SPRING CLOUD

▸ Microservice friendly components

▸ Distributed & versioned configuration

▸ Service discovery

▸ Dynamic routing

▸ Circuit breakers

▸ Distributed messaging

▸ Getting started:

SPRING CLOUD

SPRING CLOUD

▸ Config

▸ Netflix

▸ Bus

▸ Cloud Foundry

▸ Cluster

▸ Consul

▸ Security

▸ Sleuth

▸ Data Flow

▸ Stream

▸ Modules

▸ Task

▸ Zookeeper

▸ AWS

▸ Connectors

▸ CLI

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

SPRING CLOUD

CONFIG SERVER

SPRING CLOUD

CONFIG SERVER CONFIGURATION

application.yml:

SPRING CLOUD

CLIENT CONFIGURATION FILE

website.yml:

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)

SPRING CLOUD

RESOLVED CONFIGURATION

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)

SPRING CLOUD

CLIENT CONFIGURATION

bootstrap.yml:

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=…

SPRING CLOUD

RESOLVED CLIENT CONFIGURATION

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.

NETFLIX OSS + SPRING

SPRING CLOUD NETFLIX

▸ Service discovery (Eureka)

▸ Client side load balancing (Ribbon)

▸ Dynamic routing (Zuul)

▸ Circuit breaker (Hystrix)

▸ + a few others…

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

NETFLIX OSS + SPRING

EUREKA SERVER

NETFLIX OSS + SPRING

EUREKA SERVER DASHBOARD

NETFLIX OSS + SPRING

EUREKA CLIENT SETUP

@EnableEurekaClient annotation

application.yml in Config Server repo

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

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

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

NETFLIX OSS + SPRING

ZUUL SERVER CREATION

‣ Include dependency spring-cloud-starter-zuul

‣ @EnableZuulProxy application annotation

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

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

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

NETFLIX OSS + SPRING

HYSTRIX CLIENT

▸ @EnableCircuitBreaker application annotation

▸ @HystrixCommand on applicable methods

NETFLIX OSS + SPRING

NETFLIX OSS + SPRING

HYSTRIX STREAM - PRE-REQUESTS

NETFLIX OSS + SPRING

HYSTRIX STREAM - POST-REQUESTS

NETFLIX OSS + SPRING

HYSTRIX DASHBOARD

NETFLIX OSS + SPRING

HYSTRIX STREAM

NETFLIX OSS + SPRING

HYSTRIX DASHBOARD

NETFLIX OSS + SPRING

TURBINE - AGGREGATE MULTIPLE HYSTRIX CLIENTS

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

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

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

NETFLIX OSS + SPRING

ALTHOUGH…

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

NETFLIX OSS + SPRING

THANKS

conor@huffle.com.au

top related