때문에 따라서 개발자 커뮤니티와 고객 사이에서 점점 인기를 끌고 프로그램에 대한 응답으로 더 반응하고 탄력이 빌드 응용 프로그램에 대한 선언 (그러나 필수)의 방법으로 반응 프로그래밍 캔에 최근 몇 년 동안,합니다. 봄 5 것이다 반응성 시스템 쇼의 핵심 프레임 워크로 사실, 선언적 프로그래밍 패러다임의 변화가 있습니다.
생산자와 사용자의 요구 사이의 비동기 데이터 스트림의 반응성 프로그램 관리 데이터는 비 블록 데이터에 반응합니다. 따라서, 반응 프로그래밍 및 이러한 응용 프로그램과 관련된 모든 비 차단 비동기 및 이벤트 기반 응용 프로그램을 확장 할 스레드의 작은 금액을 필요로한다.
공유 스레드 프리젠 높은 복잡도의 적용을 확장 잠금에 기초하여 상기 상태 변수 때문에, 애플리케이션 기반의 프레임 워크 반응 실을 구축하는 데 사용하는 것이 곤란하다.
반응 프로그램의 맥락에서, "모든 흐름, 데이터의 흐름이있을 때, 모든 것이 비 블로킹 방식으로 수행된다."이러한 우수한 날카로운 주 연구 노트 기사에 대한 교훈과 모든 사람을 무엇의 봄 (5) 반응 프로그램.
왜 반응 프로그래밍
개발자는 비즈니스 로직 정의 된 이벤트의 상호 의존성에 집중할 수 있도록 반응성이 매우 높은 프로그래밍 추상화, 코드의 가독성을 향상시킨다.
고도의 동시성 메시지 처리 환경에 대한 자연 반응 모드, 그것은 일반적인 비즈니스 사용 사례입니다.
필수 배압 함수는 응답 방식은 최상의 메모리 부족의 문제를 방지한다 생산자와 소비자 사이의 트래픽 제어에 적합하다.
반응성 프로그래밍을보다 효율적 고도의 쌍방향 관리 할 수 있으며 실시간 애플리케이션이나 행동은 / 이벤트 알림 서브 시스템에 연결된 많은 경우를 트리거 할 수 있습니다.
반응 프로그래밍 예제의 사용을 통해 달성
· 뱅킹 등의 거래 처리 서비스, 많은 수의.
· 대형 온라인 쇼핑 응용 프로그램 (예 : 아마존 ) 알림 서비스를 제공합니다.
· 증권 거래소 주식 거래 사업을 변경하는 동안.
응답 흐름
"응답 스트림"이라 정의 API의 배압을 정의하는 데 사용되는 비 - 블로킹 엔티티를 갖는 비동기 데이터 스트림을 조작하는 방법을 개시 최소 인터페이스 세트를 포함하는 사양.
배압 도입 한 후, 반응 스트림 데이터 환율 출판사 제어 가입 할 수있다.
반응성 스트림 API 등 java.util.concurrent.Flow가 되었다 자바 (9) 의 일부.
응답 플로우 상호 운용성 층이 주로 사용된다.
스프링 (5) 반응 프로그래밍 제품
스프링 웹 반응성 모듈과 스프링 MVC는 같은 지원 @Controller의 프로그래밍을하지만, 스프링 웹 반응성 또한의 반응성 비 차단 엔진 실행.
Spring-Web-Reactive模块和Spring MVC共享许多常用算法,但是Spring-Web-Reactive模块已经重新定义了许多Spring MVC合约,例如HandlerMapping和HandlerAdapter,以使它们异步和非阻塞并启用 反应性HTTP请求和响应(以RouterFunction和HandlerFunction的形式)。
除了现有的RestTemplate之外,Spring 5中还引入了新的反应式WebClient。
支持响应式编程的HTTP客户端(例如Reactor,Netty,Undertow)已经适应了一组响应式的ClientHttpRequest和ClientHttpResponse抽象,这些抽象将请求和响应主体公开为Flux <DataBuffer>,并且在读取和写入端具有完全的反压支持。
Spring 5 Framework引入了Reactor作为Reactive Streams规范的实现。
Reactor是下一代Reactive库,用于在JVM上构建非阻塞应用程序。
Reactor扩展了基本的Reactive Streams Publisher合同,并定义了Flux和Mono API类型,以分别对0..N和0..1的数据序列提供声明性操作。
Spring Web Reactive利用Servlet 3.1提供的非阻塞I / O并在Servlet 3.1容器上运行。
Spring WebFlux提供了两种编程模型的选择。
1. 带注释的控制器:这些与Spring MVC相同,带有一些Spring-Web模块提供的附加注释。Spring MVC和WebFlux控制器都支持Reactive返回类型。此外,WebFlux还支持Reactive @RequestBody参数。
2. 函数式编程模型:一个基于lambda的轻量级小型库,它公开实用程序来路由和处理请求。
Spring Web响应式与Spring Web MVC
Spring 5彼此相邻容纳了Spring Web Reactive(在spring-web-reactive模块下)和Spring Web MVC(在spring-webmvc模块下)。
尽管Spring Web Reactive和Spring Web MVC模块都共享许多算法,但是由于Spring Web Reactive能够在Reactive和非阻塞的Reactive Streams HTTP适配器层上运行,因此它们不共享代码。
Spring MVC执行需要Servlet容器,而Spring Web Reactive也可以在非Servlet运行时上运行,例如Netty和Undertow。
如果绝对需要带有Java 8 lambda或Kotlin的轻量级功能性Web框架的无阻塞Web堆栈,则应考虑从Spring MVC应用程序切换到Spring Web Reactive。
响应式编程的基本配置
这是带有5.0.0 M5版本和WebFlux依赖项的pom.xml。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.M5</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId> </dependency>
</dependencies>
传统方法与反应方法
在传统方法中,执行将被阻止,并将一直等到服务执行完成。在下面的代码中,在第一个打印语句之后,程序执行将被阻塞并等待服务执行完成。服务执行完成后,将恢复程序执行并执行第二个打印语句。
@GetMapping("/traditional")
public List < Product > getAllProducts() {
System.out.println("Traditional way started");
List < Product > products = prodService.getProducts("traditional");
System.out.println("Traditional way completed");
return products;
}
在响应式方法中,程序将继续执行,而无需等待服务执行的完成。 在下面的代码中,在第一个打印语句之后,第二个打印语句将以非阻塞方式执行,而无需等待服务执行完成。将使用产品数据填充Flux流。
@GetMapping(value = "/reactive", .TEXT_EVENT_STREAM_VALUE)
public Flux < Product > getAll() {
System.out.println("Reactive way using Flux started");
Flux < Product > fluxProducts = prodService.getProductsStream("Flux");
System.out.println("Reactive way using Flux completed");
return fluxProducts;
}
响应式Web客户端
除了现有的RestTemplate之外,Spring 5还引入了Reactive WebClient。
ClientHttpRequest和ClientHttpResponse抽象将请求和响应主体公开为Flux <DataBuffer>,在读取和写入侧具有完全的反压支持。
来自Spring Core的Encoder和Decoder抽象也用于客户端,用于与类型对象之间的字节通量序列化。
以下是一个Reactive WebClient的示例,该示例调用终结点并接收和处理Reactive Stream Flux对象。
@GetMapping("/accounts/{id}/alerts")
public Flux < Alert > getAccountAlerts(@PathVariable Long id) {
WebClient webClient = new WebClient(new ReactorClientHttpConnector());
return this.repository.getAccount(id).flatMap(account -> webClient.perform(get("/alerts/{key}", account.getKey())).extract(bodyStream(Alert.class)));
}
Spring 5的局限性
· 对响应式应用程序进行故障排除有些困难,并且有可能在解决问题时偶然引入了阻止代码。
· 大多数传统的基于Java的集成库仍处于阻塞状态。
· 除少数NoSQL数据库(例如MongoDB)外,Reactive数据存储区提供有限的选项。
· 仍然不支持Spring Security。
感谢你的阅读,希望能让你有所收获~