Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Java Microservices with Netflix OSS & Spring

Java Microservices with Netflix OSS & Spring

conor10

March 02, 2016
Tweet

More Decks by conor10

Other Decks in Programming

Transcript

  1. SPRING BOOT SPRING BOOT ▸ Stand-alone Spring-based applications ▸ Tomcat

    embedded container (supports Jetty & JBoss Undertow too) ▸ Starter POMs ▸ Annotation driven
  2. SPRING BOOT DEPLOYMENT ▸ Self contained jar ▸ Web application

    archive ▸ Build targets ▸ $ mvn spring-boot:run ▸ $ gradle bootRun
  3. SPRING BOOT TESTING ▸ spring-boot-starter-test starter POM provides: ▸ Spring

    Test ▸ Unit ▸ Hamcrest + Assert4J (v1.4) ▸ Mockito ▸ MockMvc ▸ @WebIntegrationTest
  4. SPRING CLOUD SPRING CLOUD ▸ Microservice friendly components ▸ Distributed

    & versioned configuration ▸ Service discovery ▸ Dynamic routing ▸ Circuit breakers ▸ Distributed messaging ▸ Getting started:
  5. SPRING CLOUD SPRING CLOUD ▸ Config ▸ Netflix ▸ Bus

    ▸ Cloud Foundry ▸ Cluster ▸ Consul ▸ Security ▸ Sleuth ▸ Data Flow ▸ Stream ▸ Modules ▸ Task ▸ Zookeeper ▸ AWS ▸ Connectors ▸ CLI
  6. SPRING CLOUD CONFIG SERVER ▸ Git hosted configuration repository ▸

    SVN & filesystem also supported (see implementations of org.springframework.cloud.config.server.EnvironmentR epository) ▸ Multiple security options w/Spring Security (HTTP Basic -> OAuth bearer tokens) ▸ Push updates via Spring Cloud Bus
  7. 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)
  8. 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=…
  9. 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.
  10. NETFLIX OSS + SPRING SPRING CLOUD NETFLIX ▸ Service discovery

    (Eureka) ▸ Client side load balancing (Ribbon) ▸ Dynamic routing (Zuul) ▸ Circuit breaker (Hystrix) ▸ + a few others…
  11. 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
  12. 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
  13. 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
  14. 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
  15. NETFLIX OSS + SPRING ZUUL SERVER CREATION ‣ Include dependency

    spring-cloud-starter-zuul ‣ @EnableZuulProxy application annotation ‣ E.g. Allow access only to credit-service
  16. 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
  17. 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
  18. 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
  19. NETFLIX OSS + SPRING LOGGING ▸ Logback is the default

    choice ▸ Alternative starters are provided ▸ Using alternatives (such as log4j2) requires exclusions throughout the starter POMs
  20. 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
  21. 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