Spring Boot and Netflix OSS

7.101 visualizações

Publicada em

Speakers: Spencer Gibb, Dr. David Syer
Web / JavaScript Track
Learn basic concepts about Spring Boot and Netflix OSS software and how to integrate Netflix OSS technologies into Spring Boot including:

distributed configuration using Spring and Archaius
Eureka (service registration and discovery)
Feign (easy rest clients)
Ribbon (client side load balancing)
Hystrix (circuit breaker/fault tolerance library)
RxJava (Reactive Programming library)
Zuul (routing)
Turbine and Hystrix Dashboard (service health dashboard)

Publicada em: Software
1 comentário
18 gostaram
Estatísticas
Notas
Sem downloads
Visualizações
Visualizações totais
7.101
No SlideShare
0
A partir de incorporações
0
Número de incorporações
122
Ações
Compartilhamentos
0
Downloads
228
Comentários
1
Gostaram
18
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Spring Boot and Netflix OSS

  1. 1. Spring Cloud, Spring Boot and Netflix OSS Spencer Gibb twitter: @spencerbgibb email: sgibb@pivotal.io Dave Syer twitter: @david_syer email: dsyer@pivotal.io (Spring Boot and Netflix OSS or Spring Cloud Components) http://presos.dsyer.com/decks/cloud-boot-netflix.html 1 of 44 24/09/14 21:52
  2. 2. Outline http://presos.dsyer.com/decks/cloud-boot-netflix.html Define microservices Outline some distributed system problems Introduce Netflix OSS and its integration with Spring Boot Spring Cloud demos 2 of 44 24/09/14 21:52
  3. 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://presos.dsyer.com/decks/cloud-boot-netflix.html 3 of 44 24/09/14 21:52
  4. 4. http://presos.dsyer.com/decks/cloud-boot-netflix.html Lightweight Services and REST There is a strong trend in distributed systems with lightweight architectures People have started to call them "microservices" 4 of 44 24/09/14 21:52
  5. 5. Spring Boot http://presos.dsyer.com/decks/cloud-boot-netflix.html 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. 5 of 44 24/09/14 21:52
  6. 6. Cloudfoundry http://presos.dsyer.com/decks/cloud-boot-netflix.html 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) 6 of 44 24/09/14 21:52
  7. 7. Continuous Delivery Microservices lend themselves to continuous delivery. You actually need continuous delivery to extract maximum value. Book (Humble and Farley): http://continuousdelivery.com Netflix Blog: http://techblog.netflix.com/2013/08/deploying-netflix- api.html http://presos.dsyer.com/decks/cloud-boot-netflix.html 7 of 44 24/09/14 21:52
  8. 8. http://presos.dsyer.com/decks/cloud-boot-netflix.html Example Distributed System: Minified 8 of 44 24/09/14 21:52
  9. 9. http://presos.dsyer.com/decks/cloud-boot-netflix.html 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. 9 of 44 24/09/14 21:52
  10. 10. http://presos.dsyer.com/decks/cloud-boot-netflix.html 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 10 of 44 24/09/14 21:52
  11. 11. http://presos.dsyer.com/decks/cloud-boot-netflix.html Spring IO Platform 11 of 44 24/09/14 21:52
  12. 12. http://presos.dsyer.com/decks/cloud-boot-netflix.html Example: Coordination Boiler Plate 12 of 44 24/09/14 21:52
  13. 13. Bootification http://presos.dsyer.com/decks/cloud-boot-netflix.html 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? 13 of 44 24/09/14 21:52
  14. 14. Netflix OSS Eureka Hystrix & Turbine Ribbon Feign Zuul Archaius Curator Asgaard ... http://presos.dsyer.com/decks/cloud-boot-netflix.html Mikey Cohen Netflix edge architecture, http://goo.gl/M159zi 14 of 44 24/09/14 21:52
  15. 15. http://presos.dsyer.com/decks/cloud-boot-netflix.html Example: Spring Cloud and Netflix 15 of 44 24/09/14 21:52
  16. 16. http://presos.dsyer.com/decks/cloud-boot-netflix.html Configuration Server Pluggable source Git implementation Versioned Rollback-able Configuration client auto-configured via starter 16 of 44 24/09/14 21:52
  17. 17. Spring Cloud Configuration Server Supports applications <appname>.properties Supports environments <appname>-<envname>.yml Default environment application.properties applies to all applications and environments DEMO http://presos.dsyer.com/decks/cloud-boot-netflix.html 17 of 44 24/09/14 21:52
  18. 18. Config Client http://presos.dsyer.com/decks/cloud-boot-netflix.html 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 18 of 44 24/09/14 21:52
  19. 19. http://presos.dsyer.com/decks/cloud-boot-netflix.html 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 19 of 44 24/09/14 21:52
  20. 20. http://presos.dsyer.com/decks/cloud-boot-netflix.html Refresh Endpoint POST to /refresh Re-loads configuration including remote config server Re-binds @ConfigurationProperties Resets @RefreshScope cache 20 of 44 24/09/14 21:52
  21. 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://presos.dsyer.com/decks/cloud-boot-netflix.html 21 of 44 24/09/14 21:52
  22. 22. http://presos.dsyer.com/decks/cloud-boot-netflix.html Restart Endpoint POST to /restart closes application context and refreshes it Probably more useful in development than production (leaks?) Disabled by default 22 of 44 24/09/14 21:52
  23. 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://presos.dsyer.com/decks/cloud-boot-netflix.html 23 of 44 24/09/14 21:52
  24. 24. http://presos.dsyer.com/decks/cloud-boot-netflix.html Discovery: Eureka Service Registration Server Highly Available In AWS terms, multi Availability Zone and Region aware 24 of 44 24/09/14 21:52
  25. 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://presos.dsyer.com/decks/cloud-boot-netflix.html 25 of 44 24/09/14 21:52
  26. 26. http://presos.dsyer.com/decks/cloud-boot-netflix.html 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 26 of 44 24/09/14 21:52
  27. 27. Declarative Hystrix Programmatic access is cumbersome @HystrixCommand to the rescue @EnableHystrix via starter pom Wires up spring aop aspect DEMO http://presos.dsyer.com/decks/cloud-boot-netflix.html 27 of 44 24/09/14 21:52
  28. 28. http://presos.dsyer.com/decks/cloud-boot-netflix.html Hystrix Synchronous private String getDefaultMessage() { return "Hello World Default"; } @HystrixCommand(fallbackMethod="getDefaultMessage") public String getMessage() { return restTemplate.getForObject(/*...*/); } 28 of 44 24/09/14 21:52
  29. 29. http://presos.dsyer.com/decks/cloud-boot-netflix.html Hystrix Future @HystrixCommand(fallbackMethod="getDefaultMessage") public Future<String> getMessageFuture() { return new AsyncResult<String>() { public String invoke() { return restTemplate.getForObject(/*...*/); } }; } //somewhere else service.getMessageFuture().get(); 29 of 44 24/09/14 21:52
  30. 30. Hystrix Observable @HystrixCommand(fallbackMethod="getDefaultMessage") public Observable<String> getMessageRx() { return new ObservableResult<String>() { public String invoke() { return restTemplate.getForObject(/*...*/); } }; } //somewhere else helloService.getMessageRx().subscribe(new Observer<String>() { @Override public void onCompleted() {} @Override public void onError(Throwable e) {} @Override public void onNext(String s) {} }); http://presos.dsyer.com/decks/cloud-boot-netflix.html 30 of 44 24/09/14 21:52
  31. 31. Circuit Breaker Metrics Via actuator /metrics Server side event stream /hystrix.stream Dashboard app via @EnableHystrixDashboard More coming... DEMO http://presos.dsyer.com/decks/cloud-boot-netflix.html 31 of 44 24/09/14 21:52
  32. 32. Metric Aggregation: Turbine Aggregator for Hystrix data Pluggable locator Static list Eureka http://presos.dsyer.com/decks/cloud-boot-netflix.html 32 of 44 24/09/14 21:52
  33. 33. Ribbon http://presos.dsyer.com/decks/cloud-boot-netflix.html 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! 33 of 44 24/09/14 21:52
  34. 34. Feign http://presos.dsyer.com/decks/cloud-boot-netflix.html Declarative web service client definition Annotate an interface Highly customizable Encoders/decoders Annotation processors (Feign, JAX-RS) Logging Supports Ribbon and therefore Eureka 34 of 44 24/09/14 21:52
  35. 35. Feign cont. Auto-configuration Support for Spring MVC annotations Uses Spring MessageConverter’s for decoder/encoder DEMO http://presos.dsyer.com/decks/cloud-boot-netflix.html 35 of 44 24/09/14 21:52
  36. 36. Feign cont. http://presos.dsyer.com/decks/cloud-boot-netflix.html public interface HelloClient { @RequestMapping(method = RequestMethod.GET, value = "/hello") Message hello(); @RequestMapping(method = RequestMethod.POST, value = "/hello", consumes = "application/json") Message hello(Message message); } 36 of 44 24/09/14 21:52
  37. 37. Routing: Zuul http://presos.dsyer.com/decks/cloud-boot-netflix.html 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 37 of 44 24/09/14 21:52
  38. 38. http://presos.dsyer.com/decks/cloud-boot-netflix.html How Netflix uses Zuul Authentication Insights Stress Testing Canary Testing Dynamic Routing Service Migration Load Shedding Security Static Response handling Active/Active traffic management 38 of 44 24/09/14 21:52
  39. 39. http://presos.dsyer.com/decks/cloud-boot-netflix.html 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 39 of 44 24/09/14 21:52
  40. 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://presos.dsyer.com/decks/cloud-boot-netflix.html 40 of 44 24/09/14 21:52
  41. 41. http://presos.dsyer.com/decks/cloud-boot-netflix.html 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 41 of 44 24/09/14 21:52
  42. 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://presos.dsyer.com/decks/cloud-boot-netflix.html 42 of 44 24/09/14 21:52
  43. 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://presos.dsyer.com/decks/cloud-boot-netflix.html 43 of 44 24/09/14 21:52
  44. 44. Links http://presos.dsyer.com/decks/cloud-boot-netflix.html 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: sgibb@pivotal.io, dsyer@pivotal.io 44 of 44 24/09/14 21:52

×