cloud native microservices with spring cloud
TRANSCRIPT
CLOUD NATIVE MICROSERVICES WITH SPRING CLOUD
CONOR SVENSSON
SPRING BOOT
SPRING BOOT
▸ Stand-alone Spring-based applications
▸ Tomcat embedded container (supports Jetty & JBoss Undertow too)
▸ Starter POMs
▸ Annotation driven
▸ Java Configuration Beans
SPRING BOOT
SPRING BOOT
CONFIGURATION BEANS
SPRING BOOT
DEPLOYMENT
▸ Self contained jar
▸ Web application archive
▸ Build targets
▸ $ mvn spring-boot:run
▸ $ gradle bootRun
SPRING BOOT
TESTING
▸ spring-boot-starter-test starter POM provides:
▸ Spring Test
▸ Unit
▸ Hamcrest + Assert4J (v1.4)
▸ Mockito
▸ MockMvc
▸ @WebIntegrationTest
ACME HOME LOANS
ACME HOME LOANS
LOAN APPLICATION
EXTERNAL CREDIT
SERVICE
WEBSITE SERVICE
SUBMISSION SERVICE
1
2 3
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
CLOUD FOUNDRY
CLOUD FOUNDRY
▸ Cloud Foundry
▸ PAAS
▸ Supports multiple languages & frameworks
▸ Manages VM containers for deployments within a “space”
▸ Multiple spaces for different environments
▸ Command-line tool (cf)
CLOUD FOUNDRY
SPRING CLOUD FOUNDRY + CONNECTORS
▸ Spring Cloud Foundry
▸ Binding of CF single sign on to your services
▸ Integration with CF Service Discovery
▸ Spring Cloud Connectors
▸ Connectors for Spring Cloud on CF
▸ Config Server
▸ Eureka (Service Discovery)
▸ Hystrix (Circuit Breaker)
CLOUD FOUNDRY
CLOUD FOUNDRY DEPLOYMENT
▸ Signup to preferred CF platform
CLOUD FOUNDRY
CLOUD FOUNDRY DEPLOYMENT
▸ Create Spring Cloud components in CF provider
▸ Config Server
▸ Eureka (Service Discovery)
▸ Hystrix (Circuit Breaker)
▸ Update client applications
▸ CF provider client libraries (see https://docs.pivotal.io/spring-cloud-services/index.html)
▸ Deploy
▸ cf push AcmeWebsite -p website/target/website-0-SNAPSHOT.jar
ACME HOME LOANS
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/
▸ Creation of Spring Cloud Components on Pivotal Web Services https://docs.pivotal.io/spring-cloud-services/index.html
▸ Code to accompany this talk - https://github.com/conor10/homeloans
▸ https://www.huffle.com.au
▸ Ether Mining 101, SydEthereum Meetup @Tyro Fintech Hub, Thursday 30th June - http://bit.ly/28KdbgW