Se ha denunciado esta presentación.
Se está descargando tu SlideShare. ×

Core Spring + Reactive 김민석

Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Próximo SlideShare
Serverless Spring 오충현
Serverless Spring 오충현
Cargando en…3
×

Eche un vistazo a continuación

1 de 32 Anuncio

Core Spring + Reactive 김민석

Descargar para leer sin conexión

SpringFramework 5에서 선보이는 Reactive와 같은 핵심기능이 Spring Data, Spring Security, Spring WebFlux프로젝트에 녹아져 있는지 살펴봅니다. 또한 이러한 기능들이 어떻게 여러분의 시스템의 반응성을 높이고 효율적으로 동작하게 하는지 알아봅니다.

SpringFramework 5에서 선보이는 Reactive와 같은 핵심기능이 Spring Data, Spring Security, Spring WebFlux프로젝트에 녹아져 있는지 살펴봅니다. 또한 이러한 기능들이 어떻게 여러분의 시스템의 반응성을 높이고 효율적으로 동작하게 하는지 알아봅니다.

Anuncio
Anuncio

Más Contenido Relacionado

Presentaciones para usted (20)

Similares a Core Spring + Reactive 김민석 (20)

Anuncio

Más de VMware Tanzu Korea (20)

Más reciente (20)

Anuncio

Core Spring + Reactive 김민석

  1. 1. 김민석 Senior Platform Architect Pivotal Cloud Foundry mkim@pivotal.io 1 Core Spring & Reactive
  2. 2. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 2 여기서 다루는 세션들 스프링 프로젝트를 이용한 프로그래밍 Reactive Spring (Tue/05) Reactive Applications on Apache Tomcat and Servlet 3.1 Containers(Tue /05) Spring Integration 5.0: What's New?(Tue/ 05) Not Only Reactive - Data Access with Spring Data(Tue /05) Reactive Data Access with Spring Data (Tue /05) Under the Hood of Reactive Data Access (Tue/06) Simplifying Apache Geode with Spring Sata(Wed/06) JDBC, What is it Good For? (Thu/07) Spring Security 5: The Reactive Parts(Tue /05) Bootiful Development with Spring Boot and React (Wed/ 06) Next Generation OAuth Support with Spring Security 5.0 (Wed/06) Lessons Learned from Upgrading Thymeleaf (Wed /06) Why Spring <3 Kotlin( Tue/07) What's New in Spring AMQP 2.0( Wed/06) JUnit 5 — New Opportunities for Testing on the JVM(Thu /07) Spring Core New in Spring Framework 5.0: Functional Web Framework(Tue/05) Spring Framework 5.0 on JDK 8 & 9 (Wed /06) Reactor in Action (Web /06) Spring Framework 5: Hidden Gems(Wed/06) It's a Kind of Magic: Under the Covers of Spring Boot (Web /06) 55 New Features in JDK 9 (Thu/ 07) Servlet or Reactive Stacks: The Choice is Yours. Oh No... The Choice is Mine!(Tue/ 05) Design & Architecting Designing, Implementing, and Using Reactive APIs(Web/06) Cloud-Native Batch Processing with Spring Batch 4 (Tue /05) Bringing New Technology to Legacy Land (Tue /05) State or Events? Which Shall I Keep? (Tue /05) Kafka Streams - From the Ground Up to the Cloud (Tue /05) Cloud Event Driven Architectures with Spring Cloud Stream 2.0(Wed/06) Spring Driven Industrial IoT Utilizing Edge, Fog, and Cloud Computing( Wed/ 06)
  3. 3. 3 1. Spring Framework Core 살펴보기 2. Reactive Programming 개념이해하기 3. Demo 4. 어떻게 적용할 것인가?
  4. 4. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/
  5. 5. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive
  6. 6. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 6 Spring Framework 5.0 Overview • Back-Pressure(Reactive 데이터 흐름 제어) • Reactive Spring Data • Function Reactive Programming • Project Reactor
  7. 7. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ • 6개월 단위 Major release • Agile development • JDK9: 2017/09 • JDK10: 2018/03 • JDK11: 2018/09 • LTS support release • JDK8 (LTS) • JDK11(LTS) • 3 years • No Overlap of support JDK Release and Support model Java 8 Adoption(Oct. 2017, Baeldung) Java 8 Java 7 Java 6 Java 9
  8. 8. 8 1. Spring Framework Core 살펴보기 2. Reactive Programming 개념이해하기 3. Demo 4. 어떻게 적용할 것인가?
  9. 9. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Servlet and Reactive Servlet 3.1 (2013) Reactor (2013) Servlet1.0 (1997) Servlet 3.0 (2009)
  10. 10. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 10 Servlet and Reactive
  11. 11. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 11 Servlet and Reactive
  12. 12. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ • 대안적 프로그래밍 방식 • 쉽고, 간결하고 에러가 줄어드는 비동기 이벤트 기반 프로그래밍 • 고성능, concurrency 코딩 • Reactive Stream 명세 (http://www.reactive-streams.org/ ) • WebFlux는 다양한 non-blocking API를 지원 Spring WebFlux를 이용한 Reactive Programming
  13. 13. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 13 멀티쓰레드 프로그래밍 • Keeping an unused ExecutorService alive • Wrong thread-pool capacity while using fixed length thread-pool • Unexpectedly-long blocking with Future‘s get() method
  14. 14. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring WebFlux – 기존 RestController 방식
  15. 15. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring WebFlux – RouterFunction 방식 (1/2)
  16. 16. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring WebFlux – RouterFunction 방식 (2/2) https://spring.io/blog/2016/09/22/new-in-spring-5-functional-web-framework https://github.com/myminseok/webflux-functional-mkim
  17. 17. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Spring WebFlux를 이용한 Reactive Programming https://spring.io/blog/2016/04/19/understanding-reactive-types
  18. 18. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Spring Data – being Reactive
  19. 19. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ <T> List<T> findAll(Class<T> entityClass, String collectionName); <T> T findOne(Query query, Class<T> entityClass); … <T> Flux<T> findAll(Class<T> entityClass, String collectionName); <T> Mono<T> findOne(Query query, Class<T> entityClass); … Reactive Spring Data - ReactiveMongoOperations
  20. 20. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Spring Data - MongoDB
  21. 21. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Spring Integration
  22. 22. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ Reactive Spring Integration https://github.com/artembilan/spring-integration-s1p2017
  23. 23. 23 1. Spring Framework Core 살펴보기 2. Reactive Programming 개념이해하기 3. Demo 4. 어떻게 적용할 것인가?
  24. 24. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ • 샘플: https://github.com/rstoyanchev/demo-reactive-spring • Spring Webflux • WebClient • Reactive Spring Data (@Tailable) • Streaming Data from Reactive repository to Reactive Client 24 Spring Webflux & Spring Data Demo
  25. 25. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 샘플: https://github.com/myminseok/s1p-reactor-in-action Reactor 테스트 • StepVerifier Debugging • Async pipeline을 Debug, tracing하려고 할 때 .checkpoint()를 활용. Spring WebFlux를 이용한 Reactive Programming
  26. 26. 26 1. Spring Framework Core 살펴보기 2. Reactive Programming 개념이해하기 3. Demo 4. 어떻게 적용할 것인가?
  27. 27. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ • Networking • Latency • Failures • Back-pressure(Data Flow Control) • Highly Concurrent Operations • Scalability 효과적인 Reactive Usecase https://github.com/cloudfoundry/cf-java-client
  28. 28. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 28 Servlet or Reactive?
  29. 29. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ If it isn't broken, don’t fix it. Imperative is simple until it is not 29 Servlet or Reactive?
  30. 30. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ • Spring Framework 5.x • JDK 8 codebase (LTS), JDK9+ compatible • Support Java EE Level 7( Servlet 3.1, JPA 2.1) • Prepare to Java EE Level 8 (Servlet 4.x, JPA 2.x) • Dropped support (Portlet, Velocity, JDO…) • Spring Framework 5.x + • Upgrade train(JDK 9->10 ->11(LTS)) • Spring framework 5.x building target to JDK11 • Spring Framework 4.3 • JDK6 codebase, JDK7,8,9 compatible • Backport from Spring framework 5 (@UsesJava8 …) 30 Spring Framework & JDK 업그레이드 계획하기
  31. 31. Unless otherwise indicated, these slides are © 2013 -2016 Piv otal Software, Inc. and licensed under a Creative Commons Attribution-NonCommercial license: http://creativecommons.org/licenses/by-nc/3.0/ 1. JDK Baseline Update 2. Web Servers 3. Libraries • Jackson 2.9+ Hibernate 5.0+ EhCache 2.10+ 4. Removed Packages, Classes and Methods • Hibernate 5 (orm.hibernate3/hibernate4 dropped) 5. Dropped Support • Portlet, Velocity, JasperReports, XMLBeans, JDO, Guava (replaced by the Caffeine support • Spring Framework 4.3.x (supported until 2020) 6. Common Logging • spring-jcl 31 Spring Framework 5.0 적용하기 https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-5.x
  32. 32. 32 링크: https://goo.gl/53aEtB 행사 종료 후 설문에 참여한 분들께는 보온병을 선물로 드립니다. 등록데스크에서 설문 완료 페이지를 보여주시고 선물을 받아가시길 바랍니다 실시간 Q&A 질문 등록하기! 설문지 이벤트 참여하기!

Notas del editor

  • Spring one platform 전체 130여개 세션중 spring core , 및 reactive와 관련된 세션을 모아봤습니다. 23개
    전체적으로 일관된 메시지가 있었고 이중에서 핵심적인 내용만 정리해서 소개해 드릴까합니다.
    그외에 spring5를 고려하실때 추가적으로 도움이 될만한 내용들을 정리해봤습니다.

  • Netflix tech blog.
    https://medium.com/netflix-techblog/optimizing-the-netflix-api-5c9ac715cf19
    https://medium.com/netflix-techblog/reactive-programming-at-netflix-b944d49874d2

    Netflix에서 처음 개발된 기술 from microsoft’s RX

    Netflix에서 대용량의 영화목록, 광고처리, request에 대한 일관된 방식, 스트림처리, 검색, 필터, 조작, merge, 응답하기 위해
    수백대의 서버에서 하루 2십억이상 요청을 처리 (2013)
    수많은 device에서 발생하는 요청을 효과적으로 처리하기 위해

    Rx project :
    Reactive란, consumer가 data에 반응한다해서 reactive programming이라고 부름.

    Device에서 오는 API 호출을 통합했고, 일부 서버사이드 호출도 최적화함.
    서버내부에서 마이크로서비스 구성을하고 api등록의 자동화(spring cloud의 eureka)
    Reactive programming 기법을 적용해서 Nonblocking 활용
    Hystrix도 reactive하게 개발. 장애대응을 자동화함.
    엔드포인트를 시스템이 아닌 기능(functionality)으로 보고



  • Webflux: Reactive Streams API를 지원하는 다양한 구현체를 지원( java completableFuture, RxJava, reactor, Akka. 그중 reactor를 더욱 잘 지원.

    앞서 보신 기술스택이 반영된 스프링 프로젝트는 크게 두가지 계열로 나뉘게 됩니다.
    하나는 기존의 blocking관련 servlet stack
    다른 하나는 reactive기술(non blocking, back pressure)기술이 반영된 reactive stack 이 있습니다.


    https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-5-FAQ
    https://docs.spring.io/spring/docs/current/spring-framework-reference/overview.html#overview

    API: https://spring.io/blog/2016/06/13/notes-on-reactive-programming-part-ii-writing-some-code



  • Java 8이 2016년 중반 릴리즈 되었는데, 이미 많이 사용하는것으로 조사되었음.
    (jdk9는 JDK 8, 2016년 중반 출시이후 1년 6개월 걸렸음)

    JDK release model이 개선되어서, 2018년 부터 매 6개월 마다 major release를 출시 하겠다.
    JDK개발을 좀더 agile하게. 시기가 되면 그때 준비된 feature로 무조건 릴리즈.

    매 6개월 마다 새로운 릴리즈,
    시사점: JDK조차도 릴리즈 속도가 빨라져서 이제는 platform의 진화속도가 빨라졌기 때문에, 애플리케이션도 빠르게 진화해야 의미있는 서비스로 남을 수 있다.

    LTS 모델로 변경되었음.
    JDK 8, JDK 11가 LTS임.
    Jdk9 feature release이고
    Jdk11 LTS가 나오면, JDK8 public update는 중단.

    JDK release model이 개선되어서, 2018년 부터 매 6개월 마다 major release를 출시 하겠다반
    JDK개발을 좀더 agile하게. 시기가 되면 그때 준비된 feature로 무조건 릴리즈.

    매 6개월 마다 새로운 릴리즈,
    시사점: JDK조차도 릴리즈 속도가 빨라져서 이제는 platform의 진화속도가 빨라졌기 때문에, 애플리케이션도 빠르게 진화해야 의미있는 서비스로 남을 수 있다.

    LTS 모델로 변경되었음.
    JDK 8, JDK 11가 LTS임.
    Jdk9 feature release이고
    Jdk11 LTS가 나오면, JDK8 public update는 중단.

    java 8 base프로젝트.:
    Junit5,
    Reactor3
    Tomcat9
    Jetty 9.3 * 9.4
    Hibernate ORM 5.2
    Hibernate Validator 6

    (more to follow in 2018)

    Junit5: re-implementation, new API design. 사용법은 비슷하지만, back ward compatibility는 유지.
    Reactor 3: java 8 base. Composition API(Flux, Mono, CompletableFuture, )가 수없이 많음. 이것들이 Standard API화 되어, 유니크하게 완성도를 높였음. Rxjava2(java6 base line)



    Repackage: java.util.concurrent.Flow Java9의 org.reactivestreas와 동일한 구조, type. 현재 적당한 청중이 없음. 유용하지 않음.
    SF5에서 만약 당신이 Flow를 반환하는 Webflux endpoint를 생성하면, project reactor kernel에서 동작하도록 지원함. Driver를 만들어도 동일함.
    다만, 당분간 reactivestreams를 사용할것을 권고



    --------

    JDK8
    Interface에 default method선언가능.
    Java.util.concurrent.completableFuture.
    Java.time type은 사용못함

    Handler method에서 CompletableFuture를 반환 , => programmatinc design perspective as classic programmatic API

    Optimized immutable , 진작에 했어야함.

    Extensions to the Stream API : API design할 때 유용한 클래스, framework에는 현재 사용되지 않음. Optional(java8) 이지만, 대부분 java9에 있는 기능이므로.





  • Servlet v3.0 API: asnyc

  • #Servlet or Reactive Stacks: The Choice is Yours. Oh No... The Choice is Mine!
    https://content.pivotal.io/springone-platform-2017/servlet-or-reactive-stacks-the-choice-is-yours-oh-no-the-choice-is-mine-rossen-stoyanchev
    https://www.slideshare.net/Pivotal/servlet-or-reactive-stacks-the-choice-is-yours-oh-nothe-choice-is-mine
    https://github.com/rstoyanchev/demo-reactive-spring



    두가지 모델에서 기술적으로는 어느정도 구현이 가능함.

    Reactive에서의 강점은 쉬운 프로그래밍, backpressure기능이 추가.
    두가지 모델이 있는데, servlet은 같은 자원대비 한계가 있다. Thread를 무한정 늘릴수 없기 때문에


    Concurrency, asynchonisity, servlet 모델은 도전과제가 많음.
    MSA에서 Remote call

    Programming model; async모델에서 데이터 공유문제
    Concurrency를 로우레벨로 내리는 노력; blocking이 cheaper만드는 노력, blocking co-routines, thread보다

    Thread를 무한정 늘릴수 없음. 수십만개 thread in JVM.
    Nodejs: eventloop, Callback, notification를 활용, 고 성능 with small footprint.


    Reactive: CompletableFuture(Java8): callback이 많이 없어 좋음, ReativeX(MS: operators vocabulary) , Reactor (, …

    Java8 Lamdas syntax, 다른방식의 데이터 처리 가능성을 열었음. Readibility
  • Spring framework상에 reative stack 스택을 사용해서 웹 애플리케이션을 개발하는 것인데,
    reactive를 지원하는 container
    Reative를 지원하는 webflux
    여기에 functional style api를 이용해서 router, handler등을 개발하는 것입니다.

    RouterFuction
  • https://content.pivotal.io/springone-platform-2017/reactor-in-action-simon-basl%C3%A9-victor-grazi

    https://www.slideshare.net/Pivotal/reactor-in-action?qid=8ab6e2d6-9475-46d9-90db-9b7eb492d068&v=&b=&from_search=1

    https://github.com/simonbasle-demos/s1p-reactor-in-action

    https://github.com/vgrazi/reactive-demo/



    리액티브 스트림을 지원하는 구현체 라이브러리는 여러 종루가 있습니다.. Rxjava, reactor, rajava2, Akka
    이들이 점점 표준화되고 있는데, pivotal이 주도하는 프로젝트가 바로 project reactor입니다.
    이 라이브러기가 추구하는 목표는 프로그래밍적인 요소로 스프링에서 목표하는것과 동일하게 간략하고 가독성이 뛰어나며 에러로 부터 자유로운 방식으로,
    직접 thread를 조작을 다루지 않으면서도, 하위 런타임, container를 잘 활용하여 reacive요소를 구현하고 이를 통해서
    적은 하드웨어 리소스로 더 많은 workload를 처리하는 것이죠.

    기본적인 워크로드는 스트림 처리로서
    이를 표준화하는 조직이 있는데, http://www.reactive-streams.org/ 이 개념을 바탕으로 라이브러리에 녹여냈습니다.


  • Spring framework상에 reative stack 스택을 사용해서 웹 애플리케이션을 개발하는 것인데,
    reactive를 지원하는 container
    Reative를 지원하는 webflux
    여기에 functional style api를 이용해서 router, handler등을 개발하는 것입니다.

    RouterFuction
  • Webflux-functional-demo/
    RoutingConfiguration.java, PersonController


    Requet mapping같은 Web endpoint를 functional스타일로 추가하는 방법
    Core framework Java 8 language feature(lambda)가 spring과 함께 쓰이는 예시.


    org.springframework.web.reactive.function.server
    public abstract class RouterFunctions

  • Webflux-functional-demo/
    RoutingConfiguration.java, PersonController


    Requet mapping같은 Web endpoint를 functional스타일로 추가하는 방법
    Core framework Java 8 language feature(lambda)가 spring과 함께 쓰이는 예시.


    org.springframework.web.reactive.function.server
    public abstract class RouterFunctions

  • Webflux-functional-demo/
    RoutingConfiguration.java, PersonController


    Requet mapping같은 Web endpoint를 functional스타일로 추가하는 방법
    Core framework Java 8 language feature(lambda)가 spring과 함께 쓰이는 예시.


    org.springframework.web.reactive.function.server
    public abstract class RouterFunctions

  • Java.util.stream: subsciber가 1개임. Flux/mono: n개의 subscriber

    Reactor는 concurrent agnostic: thread를 직접관리하지 않고 로직만 코딩.


    Java stream: it has not been designed to deal with operation with latency, such as I/O operations. And that is where Reactive APIs like Reactor or RxJava come in.
  • https://content.pivotal.io/springone-platform-2017/not-only-reactive-data-access-with-spring-data-christoph-strobl-john-blum

    https://www.slideshare.net/Pivotal/not-only-reactive-data-access-with-spring-data?ref=https://content.pivotal.io/slides/not-only-reactive-data-access-with-spring-data

    https://github.com/christophstrobl/not-only-reactive-data-acces



    JDBC

  • https://github.com/christophstrobl/not-only-reactive-data-access/blob/master/spring-data-fluent-template-api/src/test/java/com/example/ReactiveFluentMongoAPITests.java

    Builder Style Template
    .as()에는 Project이 사용됨.


    .firstValue()는 결과에서 Optional을 제거하고 반환함.
  • https://github.com/christophstrobl/not-only-reactive-data-access/blob/master/spring-data-fluent-template-api/src/test/java/com/example/ReactiveFluentMongoAPITests.java

    Builder Style Template
    .as()에는 Project이 사용됨.


    .firstValue()는 결과에서 Optional을 제거하고 반환함.
  • https://content.pivotal.io/springone-platform-2017/spring-integration-5-0-whats-new-artem-bilan
    https://www.slideshare.net/Pivotal/spring-integration-50-whats-new
    https://github.com/artembilan/spring-integration-s1p2017


    IntegrationFlow Builder.reseqeuence()


    Spring integration에서 flux message channel을 적용, all message handler는 reactive subscriber 를 직접 구현해서 이벤트를 reactive하게 사용





  • 샘플 https://github.com/rstoyanchev/demo-reactive-spring


    ## WebClient vs Rest template.
    Frontend: Car location service
    Mongo repository
    Webclient
    Backend service: Booking car
    Reactor mono(delay 데모)

    curl –v –X POST http://localhost:8080/booking


    ## car-location-service
    Jvisualvm
    Netty에서는 thread를 지정하지 않아도 자동으로 지정해서 많은 일을 추상화해줌
    Frontend spring MVC도 webflux만 지정하면 코드변경없이 netty로 변경됨.; spring mvc와 완전히 다른 concurrency 방식.

    curl http://localhost:8081/cars | jq
    데이터가 모두 모이면 반환 Request(unbounded)

    curl -v –H "Accept: application/stream+json" http://localhost:8081/cars

    ClientUploadApp를 실행해서 데이터 입력.
    서버 로그 확인. streaming… line by line request(1), request(31)….
    return this.repository.findCarsBy().log().limitRequest(20);


    curl -v -H "Accept: text/event-stream" http://localhost:8081/cars



    ## 콘테이너 변경 데모
    @Controller: 동일한 @controller annotation지원
    Reactive client: 초기에는 reactive stack을 분리하려했으나 배운것은 reactive stack이 servlet에서도 유용함
    동일한 container활용: tomcat, jetty, Servlet container/ 두가지를 모두가지고 있어 stack에서 필요한 것만 활용.
    Netty, Undertow
  • 샘플: https://github.com/simonbasle-demos/s1p-reactor-in-action
    https://github.com/myminseok/s1p-reactor-in-action

    # Flux, 테스트
    StepVerifier
    TestingTest.java

    # Functional Reactive Programming(no 인터넷)
    스트림
    Tomcat vs netty
    WebFluxController.java
    http://localhost:8080/api/names

    # WebClient (internet)
    ClientExample.java

    curl https://swapi.co/api/people/ | jq
    curl https://swapi.co/api/people/\?search\=Luke | jq

    스트림.
    curl -v http://localhost:8080/api/starwars/person?name=Luke
    curl -v http://localhost:8080/api/starwars/person-s\?name\=Luke



    # Debugging
    Async pipeline을 Debug, tracing하려고 할 때 .checkpoint()를 활용.
    Debugging.java






    TestingTest.java



  • https://content.pivotal.io/blog/reacting-to-spring-framework-5-0

    Reactor의 backpressure기능은 데이터를 교환할 때 latency가 있을 경우에 상당히 유용함.
    다만, 작업이 CPU를 많이 사용할 경우 큰 효과를 보지 못함.
    대표적으로 cloud foundry의 client가 reactive하게 개발되었습니다. 그래서 적은 자원으로 network이 불안할 때 안정적으로 서빗를 처리할 수 잇습니다.

    The high-latency network interaction is good fit for a Reactive Design
    Encourages asynchronous and high concurrent usage
    Partnering with Project Reactor early influenced both the design of the client and of Reactor

    https://content.pivotal.io/springone-platform-2017/designing-implementing-and-using-reactive-apis-ben-hale-paul-harris
    https://content.pivotal.io/slides/designing-implementing-and-using-reactive-apis-2
    https://www.slideshare.net/Pivotal/designing-implementing-and-using-reactive-apis-84035115?ref=https://content.pivotal.io/slides/designing-implementing-and-using-reactive-apis-2


    https://github.com/cloudfoundry/cf-java-client




    Reactor를 어떤경우에 사용해야하는가? 모든 경우를 해결하지 못함. Debug가 어려울수 있음.
    Value가 단점도다 큰 경우에만.

    Timeout, Retry해도 문제 없는 경우; networking
    Thread를 직접 관리할 필요없이 flatMap()을 활용해 플랫폼이 최대한 자원을 사용해서 성능을 높이고자 하는 경우(최적화)
    Scalibility: 효율성에 대한 이야기임.


    내가 이런 문제를 겪고 있는가?
    Cpu가 idle인 경우 적용할것
    작은 시스템에 connection이 부족한 경우,그러나 cpu가 거의 쓰이고 있다면 궂이 reactive를 적용할 필요가 없음.





    Unit을 작고 간결하게 작성할것, 가독성도 높아짐.
    Reactive operation에 활용이 쉬워짐..
    어떤 thread가 무엇을 할지를 지정하지 않으므로, 싱글, 병렬처리를 프레임워크가 자동 조절.


    결과에 따라 추가 페이지를 얻어오는데, 상세한 처리는 reactor가 알아서 해주는 코딩


    Reactive programming에서 method reference를 엮을 수 있는 기술
    Callback hell을 정리하고 가독성을 높일 수 있다.



  • Continuity를 제공하려 노력함. (가운데 겹치는 부분
    문제해결을 위해 더 많은 옵션과 도구가 제공됨. Good fit 에 맞게 사용할 수 있음.
    마이크로서비스마다 다른 선택을 할 수 있음.


    If it ain’t broken, don’t fix it.

    Imperative is simple until it is not


    Webflux는 적은 메모리 footprint로 고성능을 내므로 resilient, spike에 대응

    성능적인 측면에서 cpu를 이미 많이 사용하는 모델은 의미가 없음.



  • Continuity를 제공하려 노력함. (가운데 겹치는 부분
    문제해결을 위해 더 많은 옵션과 도구가 제공됨. Good fit 에 맞게 사용할 수 있음.
    마이크로서비스마다 다른 선택을 할 수 있음.


    If it ain’t broken, don’t fix it.

    Imperative is simple until it is not


    Webflux는 적은 메모리 footprint로 고성능을 내므로 resilient, spike에 대응

    성능적인 측면에서 cpu를 이미 많이 사용하는 모델은 의미가 없음.



  • https://content.pivotal.io/springone-platform-2017/spring-framework-5-0-on-jdk-8-9-juergen-hoeller
    https://content.pivotal.io/slides/spring-framework-5-0-on-jdk-8-9

    JDK9 GA 며칠후에 spring framework5가 GA 되었습니다.

    Jdk9은 LTS가 아님. 9/10/11를 의미함. 업그레이드를 해야함.
    JDK10 March 2018
    JDK11 Sep/Oct 2018


    스프링프레임워크 4.3을 사용하시는 경우,
    SP4 –JDK6 base
    JAVA6는 fading out중임
    SF4.3는 계속 업그레이드하겠지만, JAVA6는 first-class가 아님.
    IBM(JDK6 EOL in websphere, april 2017)
    Oracle: extended support, Fading out: Dec, 2018

    SF4.3+ JDK6에서 에러가 나는데 JDK7에서는 돌아가는 경우가 있을 수 있음. JDK7로 업그레이드 권고함
    Spring framework 4.3의 베이스 JDK는 6이었는데, 이미 JDK8의 많은 기능들을 지원하고 있다는 점인데요,
    Spring framework 5를 개발하면서 많은 기능을 4.3으로 백포트 했습니다.

    다시말하면, spring 4.3을 JDK8에서 사용한다면, spring framework5의 기능을 바로 사용할 수 있다는 것입니다.
    예를 들어, Java.util.optional은 java8이지만 SF4.3에서 사용합니다.
    ----- 그러나 많은 시나리오에서 feel like임, 예를 들어, core에서는 실제 동작은 그렇지 않을 수 있음.

    The Spring Framework no longer supports: Portlet, Velocity, JasperReports, XMLBeans, JDO, Guava (replaced by the Caffeine support). If those are critical to your project, you should stay on Spring Framework 4.3.x (supported until 2020).



    jdk8
    대규모 프로젝트의 경우, JVM class path를 당분간 활용할것. 모든것이 호환됨 language level 9, java9, runtime benefits. 심각하게 upgrade가 쉬움
    Java 8 bytecode level: 기존에 존재하는 툴 ASM tool들이 compile 8에 호환됨. 빌드타임에 성공할 수 있지만, runtime에 깨질수 있음.
    빌드 8 , deploy on JDK 8,9


    # JDK9타겟일 경우
    그럼에도 Java9은 매우 적용할 가치가 있음.
    Compact Strings: static memory consumption을 엄청나게 줄임. 코스수정없이, 재컴파일 없이(java8 target, run java9)
    GC G1이 default:

    다른 소프트웨어와 마찬가지로,(chrome, IOS) Upgrade train에 올라가는 것임.
    LTS 적어도 3년 이상
    Spring framework5은 JDK 11을 타겟으로 빌딩되고 있음.
    Forward compatible

    # java8 bytecode level -> ASM tools
    build against jdk8-> run jdk9


    스프링 프레임워크마다 공식적으로 지원하는 베이스 JDK version, JAVA EE버젼 두가지가 있습니다.
    JDK의 변경사항을 프레임워크에서 수용하기 위해 코드 베이스를 JDK8, Java EE 7+ 으로 변경하였습니다.
    JAVA EE 7 API Level: Servlet 3.1, JPA 2.0
    JAVA EE 8 API Level: Servlet4, JPA 2.2
    JAVA EE 8은 다음버젼에서 본격적으로 지원하기 전에 준비를 시작하는 단계로 보시면 되겠습니다.











  • https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-5.x
    Jdk update

    2. Web Servers
    Tomcat 8.5+ Jetty 9.4+ WildFly 10+ WebSphere 9+
    with the addition of Netty 4.1 and Undertow 1.4 for Spring WebFlux

    3. Libraries Jackson 2.9+ Hibernate 5.0+ EhCache 2.10+

    4. Removed packages
    Hibernate 5 (orm.hibernate3/hibernate4 dropped)

    5. Dropped support
    The Spring Framework no longer supports: Portlet, Velocity, JasperReports, XMLBeans, JDO, Guava (replaced by the Caffeine support). If those are critical to your project, you should stay on Spring Framework 4.3.x (supported until 2020).
    Alternatively, you may create custom adapter classes in your own project (possibly derived from Spring Framework 4.x)

    6.
    JCL(자카르타 커먼 로깅)
    slf4j(Simple Logging Façade for java)

    Spring 4.3:SLF4j/logback, Log4j2.x를 쓰려면, bridge를 선언하고, commons-logging을 제외해야했음.( common-logging은 제체 구현체가 있음)
    Spring 5
    - spring-jcl이 Commons Logging bridge내장. Spring-jcl은 Log4j2, SLF4j, JUL을 자동으로 인식함. 별도 bridge가 없어도 됨.
    - spring-jcl은 jcl-over-slf4j, lo4j-over-slf4j을 기본적으로 superseed (log4j 2x, logback이 있으면 실행시간에 셋업됨)
    혹시라도 다른 라이브러이에서 충돌할 수 도 있으니, commons-logging, jcl-over-slf4j를 여전히 제외할것.


  • https://goo.gl/53aEtB

×