Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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