$30 off During Our Annual Pro Sale. View Details »

Spring Cloud, Spring Boot and Netflix OSS

Dave Syer
September 10, 2014

Spring Cloud, Spring Boot and Netflix OSS

Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems (e.g. configuration management, service discovery, circuit breakers, intelligent routing, micro-proxy, control bus, one-time tokens, global locks, leadership election, distributed sessions, cluster state). Coordination of distributed systems leads to boiler plate patterns, and using Spring Cloud developers can quickly stand up services and applications that implement those patterns. They will work well in any distributed environment, including the developer's own laptop, bare metal data centres, and managed platforms such as Pivotal Cloudfoundry. Slides available as HTML (with links) here: http://presos.dsyer.com/decks/cloud-boot-netflix.html.

Dave Syer

September 10, 2014
Tweet

More Decks by Dave Syer

Other Decks in Technology

Transcript

  1. Spring Cloud, Spring Boot and Netflix OSS
    Spencer Gibb
    twitter: @spencerbgibb
    email: [email protected]
    Dave Syer
    twitter: @david_syer
    email: [email protected]
    (Spring Boot and Netflix OSS
    or Spring Cloud Components)
    http://localhost:4000/decks/cloud-boot-netflix.html
    1 of 44 10/09/14 18:50

    View Slide

  2. Outline
    Define microservices
    Outline some distributed system problems
    Introduce Netflix OSS and its integration with Spring Boot
    Spring Cloud demos
    http://localhost:4000/decks/cloud-boot-netflix.html
    2 of 44 10/09/14 18:50

    View Slide

  3. What are micro-services?
    Not monolithic :-)
    Smaller units of a larger system
    Runs in its own process
    Lightweight communication protocols
    Single Responsibility Principle
    The UNIX way
    http://www.slideshare.net/ewolff/micro-services-small-is-beautiful
    http://martinfowler.com/articles/microservices.html
    http://davidmorgantini.blogspot.com/2013/08/micro-services-what-are-
    micro-services.html
    http://localhost:4000/decks/cloud-boot-netflix.html
    3 of 44 10/09/14 18:50

    View Slide

  4. Lightweight Services and
    REST
    There is a strong trend in distributed systems with lightweight
    architectures
    People have started to call them "microservices"
    http://localhost:4000/decks/cloud-boot-netflix.html
    4 of 44 10/09/14 18:50

    View Slide

  5. Spring Boot
    It needs to be super easy to implement and update a service:
    @RestController
    class ThisWillActuallyRun {
    @RequestMapping("/")
    String home() {
    Hello World!
    }
    }
    and you don't get much more "micro" than that.
    http://localhost:4000/decks/cloud-boot-netflix.html
    5 of 44 10/09/14 18:50

    View Slide

  6. Cloudfoundry
    Deploying services needs to be simple and reproducible
    $ cf push app.groovy
    and you don't get much more convenient than that.
    (Same argument for other PaaS solutions)
    http://localhost:4000/decks/cloud-boot-netflix.html
    6 of 44 10/09/14 18:50

    View Slide

  7. Continuous Delivery
    Microservices lend themselves to continuous delivery.
    You need continuous delivery
    Book (Humble and Farley): http://continuousdelivery.com Netflix Blog:
    http://techblog.netflix.com/2013/08/deploying-netflix-api.html
    http://localhost:4000/decks/cloud-boot-netflix.html
    7 of 44 10/09/14 18:50

    View Slide

  8. Example Distributed System:
    Minified
    http://localhost:4000/decks/cloud-boot-netflix.html
    8 of 44 10/09/14 18:50

    View Slide

  9. http://localhost:4000/decks/cloud-boot-netflix.html
    9 of 44 10/09/14 18:50

    View Slide

  10. No Man (Microservice) is an
    Island
    It's excellent to be able to implement a microservice really easily (Spring
    Boot), but building a system that way surfaces "non-functional"
    requirements that you otherwise didn't have.
    There are laws of physics that make some problems unsolvable
    (consistency, latency), but brittleness and manageability can be
    addressed with generic, boiler plate patterns.
    http://localhost:4000/decks/cloud-boot-netflix.html
    10 of 44 10/09/14 18:50

    View Slide

  11. Emergent features of micro-
    services systems
    Coordination of distributed systems leads to boiler plate patterns
    Distributed/versioned configuration
    Service registration and discovery
    Routing
    Service-to-service calls
    Load balancing
    Circuit Breaker
    Asynchronous
    Distributed messaging
    http://localhost:4000/decks/cloud-boot-netflix.html
    11 of 44 10/09/14 18:50

    View Slide

  12. Example: Coordination Boiler
    Plate
    http://localhost:4000/decks/cloud-boot-netflix.html
    12 of 44 10/09/14 18:50

    View Slide

  13. Bootification
    How to bring the ease of Spring Boot to a micro-services architecture?
    Netflix OSS
    Consul
    etcd
    zookeeper
    custom
    doozerd
    ha proxy
    nginx
    Typesafe Config
    and many more... what to choose?
    http://localhost:4000/decks/cloud-boot-netflix.html
    13 of 44 10/09/14 18:50

    View Slide

  14. Netflix OSS
    Eureka
    Hystrix & Turbine
    Ribbon
    Feign
    Zuul
    Archaius
    Curator
    Asgaard
    ...
    Mikey Cohen Netflix edge architecture, http://goo.gl/M159zi
    http://localhost:4000/decks/cloud-boot-netflix.html
    14 of 44 10/09/14 18:50

    View Slide

  15. Example: Spring Cloud and
    Netflix
    http://localhost:4000/decks/cloud-boot-netflix.html
    15 of 44 10/09/14 18:50

    View Slide

  16. Configuration Server
    Pluggable source
    Git implementation
    Versioned
    Rollback-able
    Configuration client auto-configured via starter
    http://localhost:4000/decks/cloud-boot-netflix.html
    16 of 44 10/09/14 18:50

    View Slide

  17. Spring Cloud Configuration
    Server
    Supports applications .properties
    Supports environments -.yml
    Default environment application.properties applies to all
    applications and environments
    DEMO
    http://localhost:4000/decks/cloud-boot-netflix.html
    17 of 44 10/09/14 18:50

    View Slide

  18. Config Client
    Consumers of config server can use client library as Spring Boot plugin
    Features:
    Bootstrap Environment from server
    POST to /env to change Environment
    @RefreshScope for atomic changes to beans via Spring lifecycle
    POST to /refresh
    POST to /restart
    http://localhost:4000/decks/cloud-boot-netflix.html
    18 of 44 10/09/14 18:50

    View Slide

  19. Environment Endpoint
    POST to /env
    Re-binds @ConfigurationProperties
    Resets loggers if any logging.level changes are detected
    Sends EnvironmentChangeEvent with list of properties that
    changed
    http://localhost:4000/decks/cloud-boot-netflix.html
    19 of 44 10/09/14 18:50

    View Slide

  20. Refresh Endpoint
    POST to /refresh
    Re-loads configuration including remote config server
    Re-binds @ConfigurationProperties
    Resets @RefreshScope cache
    http://localhost:4000/decks/cloud-boot-netflix.html
    20 of 44 10/09/14 18:50

    View Slide

  21. RefreshScope
    Annotate @Beans
    Atomic updates during /refresh
    DEMO
    @EnableConfigurationProperties(MyProps)
    public class Application {
    @Autowired
    private MyProps props
    @RefreshScope
    @Bean
    public Service service() {
    new Service(props.name)
    }
    }
    http://localhost:4000/decks/cloud-boot-netflix.html
    21 of 44 10/09/14 18:50

    View Slide

  22. Restart Endpoint
    POST to /restart closes application context and refreshes it
    Probably more useful in development than production (leaks?)
    Disabled by default
    http://localhost:4000/decks/cloud-boot-netflix.html
    22 of 44 10/09/14 18:50

    View Slide

  23. Encrypted Properties
    Authenticated clients have access to unencrypted data.
    Only encrypted data is stored in git.
    Support for server side or client side decryption
    DEMO
    http://localhost:4000/decks/cloud-boot-netflix.html
    23 of 44 10/09/14 18:50

    View Slide

  24. Discovery: Eureka
    Service Registration Server
    Highly Available
    In AWS terms, multi Availability Zone and Region aware
    http://localhost:4000/decks/cloud-boot-netflix.html
    24 of 44 10/09/14 18:50

    View Slide

  25. Eureka Client
    Register service instances with Eureka Server
    @EnableEurekaClient auto registers instance in server
    Eureka Server
    Eureka Client
    @EnableEurekaClient
    public class Application {
    }
    DEMO
    http://localhost:4000/decks/cloud-boot-netflix.html
    25 of 44 10/09/14 18:50

    View Slide

  26. Circuit Breaker: Hystrix
    latency and fault tolerance
    isolates access to other services
    stops cascading failures
    enables resilience
    circuit breaker pattern
    dashboard
    Release It!: https://pragprog.com/book/mnee/release-it
    http://localhost:4000/decks/cloud-boot-netflix.html
    26 of 44 10/09/14 18:50

    View Slide

  27. Declarative Hystrix
    Programmatic access is cumbersome
    @HystrixCommand to the rescue
    @EnableHystrix via starter pom
    Wires up spring aop aspect
    DEMO
    http://localhost:4000/decks/cloud-boot-netflix.html
    27 of 44 10/09/14 18:50

    View Slide

  28. Hystrix Synchronous
    private String getDefaultMessage() {
    return "Hello World Default";
    }
    @HystrixCommand(fallbackMethod="getDefaultMessage")
    public String getMessage() {
    return restTemplate.getForObject(/*...*/);
    }
    http://localhost:4000/decks/cloud-boot-netflix.html
    28 of 44 10/09/14 18:50

    View Slide

  29. Hystrix Future
    @HystrixCommand(fallbackMethod="getDefaultMessage")
    public Future getMessageFuture() {
    return new AsyncResult() {
    public String invoke() {
    return restTemplate.getForObject(/*...*/);
    }
    };
    }
    //somewhere else
    service.getMessageFuture().get();
    http://localhost:4000/decks/cloud-boot-netflix.html
    29 of 44 10/09/14 18:50

    View Slide

  30. Hystrix Observable
    @HystrixCommand(fallbackMethod="getDefaultMessage")
    public Observable getMessageRx() {
    return new ObservableResult() {
    public String invoke() {
    return restTemplate.getForObject(/*...*/);
    }
    };
    }
    //somewhere else
    helloService.getMessageRx().subscribe(new Observer() {
    @Override public void onCompleted() {}
    @Override public void onError(Throwable e) {}
    @Override public void onNext(String s) {}
    });
    http://localhost:4000/decks/cloud-boot-netflix.html
    30 of 44 10/09/14 18:50

    View Slide

  31. Circuit Breaker Metrics
    Via actuator /metrics
    Server side event stream /hystrix.stream
    Dashboard app via @EnableHystrixDashboard
    More coming...
    DEMO
    http://localhost:4000/decks/cloud-boot-netflix.html
    31 of 44 10/09/14 18:50

    View Slide

  32. Metric Aggregation: Turbine
    Aggregator for Hystrix data
    Pluggable locator
    Static list
    Eureka
    http://localhost:4000/decks/cloud-boot-netflix.html
    32 of 44 10/09/14 18:50

    View Slide

  33. Ribbon
    Client side load balancer
    Pluggable transport
    Protocols: http, tcp, udp
    Pluggable load balancing algorithms
    Round robin, “best available”, random, response time based
    Pluggable source for server list
    Static list, Eureka!
    http://localhost:4000/decks/cloud-boot-netflix.html
    33 of 44 10/09/14 18:50

    View Slide

  34. Feign
    Declarative web service client definition
    Annotate an interface
    Highly customizable
    Encoders/decoders
    Annotation processors (Feign, JAX-RS)
    Logging
    Supports Ribbon and therefore Eureka
    http://localhost:4000/decks/cloud-boot-netflix.html
    34 of 44 10/09/14 18:50

    View Slide

  35. Feign cont.
    Auto-configuration
    Support for Spring MVC annotations
    Uses Spring MessageConverter’s for decoder/encoder
    DEMO
    http://localhost:4000/decks/cloud-boot-netflix.html
    35 of 44 10/09/14 18:50

    View Slide

  36. Feign cont.
    public interface HelloClient {
    @RequestMapping(method = RequestMethod.GET,
    value = "/hello")
    Message hello();
    @RequestMapping(method = RequestMethod.POST,
    value = "/hello",
    consumes = "application/json")
    Message hello(Message message);
    }
    http://localhost:4000/decks/cloud-boot-netflix.html
    36 of 44 10/09/14 18:50

    View Slide

  37. Routing: Zuul
    JVM based router and filter
    Similar routing role as httpd, nginx, or CF go router
    Fully programmable rules and filters
    Groovy
    Java
    any JVM language
    http://localhost:4000/decks/cloud-boot-netflix.html
    37 of 44 10/09/14 18:50

    View Slide

  38. How Netflix uses Zuul
    Authentication
    Insights
    Stress Testing
    Canary Testing
    Dynamic Routing
    Service Migration
    Load Shedding
    Security
    Static Response handling
    Active/Active traffic management
    http://localhost:4000/decks/cloud-boot-netflix.html
    38 of 44 10/09/14 18:50

    View Slide

  39. Spring Cloud Zuul Proxy
    Store routing rules in config server
    zuul.proxy.route.customers: /customers
    uses Hystrix->Ribbon->Eureka to forward requests to
    appropriate service
    @EnableZuulProxy
    @Controller
    class Application {
    @RequestMapping("/")
    String home() {
    return 'redirect:/index.html#/customers'
    }
    }
    DEMO
    http://localhost:4000/decks/cloud-boot-netflix.html
    39 of 44 10/09/14 18:50

    View Slide

  40. Configuration: Archaius
    Client side configuration library
    extends apache commons config
    extendible sources
    Polling or push updates
    DynamicStringProperty myprop = DynamicPropertyFactory.getInstance()
    .getStringProperty("my.prop");
    someMethod(myprop.get());
    http://localhost:4000/decks/cloud-boot-netflix.html
    40 of 44 10/09/14 18:50

    View Slide

  41. Archaius: Spring Environment
    Bridge
    Auto-configured
    Allows Archaius Dynamic*Properties to find values via Spring
    Environment
    Existing Netflix libraries configured via application.
    {properties,yml} and/or Spring Cloud Config Server
    http://localhost:4000/decks/cloud-boot-netflix.html
    41 of 44 10/09/14 18:50

    View Slide

  42. Spring Cloud Bus
    Lightweight messaging bus using spring integration abstractions
    spring-amqp, rabbitmq and http
    other implementations possible
    Send messages to all services or...
    To just one applications nodes (ie just service x) ?destination=x
    Post to /bus/env sends environment updates
    Post to /bus/refresh sends a refresh command
    DEMO
    http://localhost:4000/decks/cloud-boot-netflix.html
    42 of 44 10/09/14 18:50

    View Slide

  43. Spring Cloud Starters
    spring-cloud-starter spring-cloud-starter-hystrix
    spring-cloud-starter-bus-amqp spring-cloud-starter-hystrix-
    dashboard
    spring-cloud-starter-
    cloudfoundry
    spring-cloud-starter-turbine
    spring-cloud-starter-eureka spring-cloud-starter-zuul
    spring-cloud-starter-eureka-
    server
    http://localhost:4000/decks/cloud-boot-netflix.html
    43 of 44 10/09/14 18:50

    View Slide

  44. Links
    http://github.com/spring-cloud
    http://github.com/spring-cloud-samples
    http://blog.spring.io
    http://presos.dsyer.com/decks/cloud-boot-netflix.html
    Twitter: @spencerbgibb, @david_syer
    Email: [email protected], [email protected]
    http://localhost:4000/decks/cloud-boot-netflix.html
    44 of 44 10/09/14 18:50

    View Slide