-
RSocket카테고리 없음 2020. 2. 10. 11:32
Backpressure in Webflux 스프링 웹플럭스를 사용하여 리액티브 스트림즈 스펙에 부합하는 웹애플리케이션을 개발할 수 있다. 리액티브 스트림즈에서 가장 중요한 특징은 Backpressure인데, 스프링 웹플럭스(+ 리액터)를 사용하면 같은 애플리케이션 내부에서 이를 효과적으로 실현할 수 있다. 그러나, 만일 두 개의 서로 다른 웹애플리케이션이 네트워크를 통해 http 프로토콜로 통신을 한다면, backpressure가 어떻게 동작할까 하는 의문이 생기게 된다. 가령 다음과 같이 모두 스프링 웹플럭스로 만들어진 서비스A와 B가 있다고 하고, A가 B의 아래 api를 호출한다고 생각해보자. // Service B @GetMapping("/people") public Flux people() { ..
-
Spring Webflux Cachespring 2019. 10. 28. 01:02
개요 스프링 웹플럭스와 Reactor를 사용하여 웹서버를 개발할 때 고민이 되는 부분이 있다. 바로 캐시이다. 기존 mvc 모델에서는 스프링 캐시를 사용하여 캐싱을 쉽게 할 수 있었지만, 웹플럭스 모델에서는 스프링 캐시를 이용하여 캐싱을 할 수 없다. 다음과 같이 @Cacheable 어노테이션을 이용하여 캐싱을 한다고 하면, mvc 모델 @Cacheable public List list() { // Integer List를 리턴 } 웹플럭스 모델 @Cacheable public Mono listMono() { // Mono 체인을 리턴 } mvc 모델에서는 캐시하고자 하는 값 자체를 캐싱할 수 있지만, 웹플럭스 모델에서는 위처럼 Mono 객체가 캐싱된다. 리액티브 스트림의 생명주기 글에서 다루었듯이, M..
-
Reactor - Reactive Streams 생명 주기spring 2019. 10. 21. 00:07
개요 Spring Webflux를 사용하여 리액티브 웹 서버를 만들기 위해서는 Webflux의 구조를 이해하는 것 만큼이나 Reactor의 구조를 이해하는 것이 중요하다. Reactor에서 reactive stream은 다음과 같은 3단계의 생명 주기를 가지고있다. 1. 조립 단계 (Assembly-time) 2. 구독 단계 (Subscription-time) 3. 런타임 단계 (Runtime) 각각의 단계에 대해서 자세히 알아보자. 조립 단계 (Assembly-time) Reactive stream의 생명 주기의 첫 번째 단계는 조립 단계이다. Reactor가 제공하는 체인형 api를 사용하여 Flux나 Mono를 만들수 있는데, 이는 언뜻 보면 빌더 패턴처럼 보인다. 그러나, 해당 api들은 각각 i..
-
Spring WebFlux - Configspring 2019. 8. 29. 12:56
개요 Spring Webflux Java Configuration은 어노테이션 기반의 컨트롤러 방식이나 functional endpoints 방식에서 요청을 처리하기 위한 bean들을 정의하고 웹 관련 설정을 커스터마이징할 수 있는 api를 제공한다. @EnableWebflux 라는 어노테이션으로 웹플럭스 설정을 활성화할 수 있다. @Configuration @EnableWebFlux public class WebConfig { } WebFlux config API를 오버라이딩하기 위해서는 아래와 같이 WebFluxConfigurer을 구현한다. @Configuration @EnableWebFlux public class WebConfig implements WebFluxConfigurer { // Im..
-
Spring Webflux - CORSspring 2019. 7. 31. 19:10
개요 Spring Webflux도 MVC와 동일하게 CORS(Cross-Origin Resource Sharing)를 지원한다. 보안 상의 이유로, 브라우저는 다른 도메인으로의 AJAX 호출을 금지한다. CORS는 도메인 간의 요청을 인증하는 것에 대한 W3C 규약으로, 대부분의 브라우저들이 이를 구현하고 있다. 여기서는 CORS 규약에 대한 자세한 설명은 하지 않고, webflux에서 관련 설정하는 법을 다루고자 한다. CORS에 대한 자세한 설명은 아래 참고 https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS 설정 Local Configuration 어노테이션 컨트롤러 메소드에 @CrossOrigin 어노테이션을 사용하면 도메인 간 요청을 가능하게 할 수..
-
Spring Webflux - Functional Endpointsspring 2019. 7. 25. 12:52
개요 Spring WebFlux는 WebFlux.fn이라는 요청을 라우팅하고 처리하는 경량의 함수형 프로그래밍 모델을 포함하고 있다. 물론 Webflux는 기존 MVC처럼 어노테이션 기반의 프로그래밍 모델도 지원하기 때문에, 두 가지 모델 중 하나를 개인 선호에 따라 선택하여 쓸 수 있다. WebFlux.fn에는 다음과 같은 두 가지 핵심 클래스가 있다. - HandlerFunction : ServerRequest를 인자로 받아 Mono를 리턴한다. 어노테이션 기반 모델에서 @RequestMapping 메소드의 바디와 동일한 역할이다. - RouterFunction : ServerRequest를 인자로 받아 Mono를 리턴한다. router function이 매치가 되면, 그에 맞는 handler fuc..
-
Spring Webflux - DispatcherHandlerspring 2019. 7. 18. 12:50
개요 스프링 webflux의 request 처리는 DispatcherHandler를 거쳐 적절한 handler에 요청 처리를 맡기는 형태이다. 스프링 MVC에서 DispatcherServlet의 역할을 DispatcherHandler가 한다고 생각하면 된다. WebHttpHandlerBuilder가 HttpHandler들을 체이닝하는데, DispatcherHandler도 함께 체이닝된다. 전반적인 request 처리 과정은 아래와 같다. 웹서버(netty, jetty 등)에서 handle → ServerManager.handle() → 체인된 HttpHandler들 → DispatcherHandler.handle() 의 과정으로 HttpHandler에서 리퀘스트가 처리된다. DispatcherHandle..
-
Spring WebClientspring 2019. 7. 10. 17:11
개요 Spring Webflux에는 reactive, non-blocking하게 HTTP 요청을 처리할 수 있도록 WebClient라는 모듈을 제공한다. 기존의 RestTemplate과 같은 역할 하지만, non-blocking하다라는 점에서 차이가 있다. 내부적으로 WebClient는 HTTP 클라이언트 라이브러리에 위임하는데, 디폴트로 Reactor Netty의 HttpClient를 사용한다. Reactor Netty 외에도, Jetty의 HttpClient를 지원하며, 다른 라이브러리도 ClientHttpConnector에 넣어주면 사용할 수 있다. 설정 WebClient를 생성하는 가장 간단한 방식은 아래와 같은 static 팩토리 메소드들을 사용하는 것이다. WebClient.create() W..