0%

Java响应式编程

Java响应式编程

什么是响应式编程

响应式是通过异步的数据流来进行编程,在某种程度下这并不是什么很新的概念。就比如说事件中心或者一个特殊事件就是一个典型的异步事件流,你可以订阅这个事件并且做一些额外的事情。响应式就是一种编程的概念,你能够创建任意的数据,不仅仅局限于类似于点击事件这种数据上。数据流无处不再,任何东西都可以是数据流,例如用户输入、配置、缓存、数据结构。就比如说,Twitter提醒就像和点击事件一样的数据流。你能够监听这个数据流,并作出改变。

响应式编程的发起是由微软创建了在.Net系统下创建了一个响应式的扩展库。随后,RxJava也在JVM同样实现了响应式编程。随着时间的推移,一个标准化的JVM响应式的定义规范就被沉淀了下来,规范定义了一些接口和一些响应式编程库的规则。这些接口已经被整合到Java9当中了。

目前比较流行的响应式框架有RxJava,Reactor。RxJava在移动端用的比较多一些,服务端更倾向于使用Reactor进行响应式开发。

Reactor框架

Reactor是运行在JVM上的完全非阻塞的响应式编程基础框架。它能够和Java8新的API结合起来使用,特别是CompletableFuture,Stream,Duration。它提供了可组合的异步序列API,Flux(针对多元素)、Mono(针对定的元素)。大部分实现了 Reactive Streams 规范。

Reacor同时提供非阻塞跨进程通讯框架,Reactor-Netty。适用于微服务框架,Reactor Netty提供了能够承载通讯压力的Http、TCP、UDP网络引擎,并支持数据的编码和解码操作。

不过Reactor只能够运行在Java 8或以上版本的jdk。

在传统的编程思想中,大多都是线程阻塞的,这大量浪费了系统的资源,现代的应用程序需要能够支持大量的用户同时请求,尽管现代的硬件性能不断提升,当仍然是一种瓶颈。有两种方式去提升程序的表现,并行化处理,使用更多的线程和硬件资源;在现有资源基础上寻求更有效率的编发。

通常,Java程序员使用阻塞的代码,一般情况下还是挺好的,直到出现了性能问题,这个使用就需要额外引入别的线程。但是这样容易出现竞争和并发问题。

目前JVM也有异步编程的操作类,比如Callbacks、Futures但是他们用起来代码不是那么易懂并且不是很容易维护,Reactor将会对这种JVM的弊端进行处理优化。

开始使用

maven

首先在maven统一版本里管理,然后将依赖添加到

1
2
3
4
5
6
7
8
9
10
11
<dependencyManagement> 
<dependencies>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-bom</artifactId>
<version>Bismuth-RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

1
2
3
4
5
6
7
8
9
10
11
12
<dependencies>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>

</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

gradle

1
2
3
4
5
6
7
8
9
10
11
plugins {
id "io.spring.dependency-management" version "1.0.6.RELEASE"
}
dependencyManagement {
imports {
mavenBom "io.projectreactor:reactor-bom:Bismuth-RELEASE"
}
}
dependencies {
compile 'io.projectreactor:reactor-core'
}

Reactor核心功能

Rector提供了两种类型的操作符,Flux和Mono,Flux主要是针对0,N的元素,Mono主要是针对0,1个元素。

这两者主要是一种语意的差别,例如,一个Http请求只有一个请求结果,也不需要计数操作,因此使用Mono更加适合如使用Flux,因为Mono只提供了针对一项或者零个的运算符。

Flux是一个异步0-N的序列

Flux 是一个标准的Publisher,会发射出0-N的元素序列,可选择的可以由错误或者完成终止。在Reactive Stream规范中,有三种类型的元素回掉onNext,onComplete,onError。