响应式编程(reactive programming)是一种基于数据流(data stream)和变化传递(propagation of change)的声明式(declarative)的编程范式。

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

keywords:

异步非阻塞

数据流

算子 (计算逻辑)

声明式 :声明式比较适合基于流的处理方式

 

 

服务端技术栈

再学webflux 随笔 第1张

 

客户端技术

Spring WebFlux也提供了一个响应式的Http客户端API WebClient。它可以用函数式的方式异步非阻塞地发起Http请求并处理响应。其底层也是由Netty提供的异步支持。

我们可以把WebClient看做是响应式的RestTemplate,与后者相比,前者:

是非阻塞的,可以基于少量的线程处理更高的并发;
可以使用Java 8 lambda表达式;
支持异步的同时也可以支持同步的使用方式;
可以通过数据流的方式与服务端进行双向通信。

整个技术栈从命令式的、同步阻塞的【spring-webmvc + servlet + Tomcat】变成了响应式的、异步非阻塞的【spring-webflux + Reactor + Netty】

 

 

WebFlux的函数式开发模式

HandlerFunction和RouterFunction

HandlerFunction相当于Controller中的具体处理方法,输入为请求,输出为装在Mono中的响应:
Mono<T extends ServerResponse> handle(ServerRequest request);

RouterFunction,顾名思义,路由,相当于@RequestMapping,用来判断什么样的url映射到那个具体的HandlerFunction,输入为请求,输出为装在Mono里边的Handlerfunction:
Mono<HandlerFunction<T>> route(ServerRequest request);

 

 

服务器推送
SSE:服务端推送(Server Send Event),在客户端发起一次请求后会保持该连接,服务器端基于该连接持续向客户端发送数据,从HTML5开始加入。

public Mono<ServerResponse> sendTimePerSec(ServerRequest serverRequest) {
return ok().contentType(MediaType.TEXT_EVENT_STREAM).body( // 1
Flux.interval(Duration.ofSeconds(1)). // 2
map(l -> new SimpleDateFormat("HH:mm:ss").format(new Date())),
String.class);
}

 

 

响应式Spring Data
一切都是异步非阻塞的

再学webflux 随笔 第2张

 

 

 

WebClient

 

 

ref

https://blog.csdn.net/get_set/article/details/79466657 重点推荐

https://blog.csdn.net/get_set/article/details/79480233

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄