Spring Gateway
Spring Gateway
官方文档:Spring Cloud Gateway
架构图
Mono 和 Flux
Mono 和 Flux 是响应式编程中的核心概念,主要的特点如下:
异步处理:Mono 和 Flux 处理数据的方式是异步的,可以利用异步处理的优势来提高并发能力,解决高并发场景下的性能瓶颈。
非阻塞式数据流:Mono 和 Flux 的数据流是非阻塞式的,可以处理大量的请求和响应,避免应用程序阻塞或崩溃。
响应式处理:Mono 和 Flux 遵循响应式编程的理念,强调数据流的“推”模式,即只有当有数据可供处理时才会进行处理,能够更好地处理流式数据。
处理函数链式调用:Mono 和 Flux 通过链式调用使得函数逻辑变得简单易懂、代码更加简洁。
下面的示例通过分析源码对以上特点做进一步解释:
1 |
|
在这个示例中,我们定义一个 Flux 对象,包含两个字符串元素。然后,我们调用 map 方法将字符串元素转化为大写格式,并调用 flatMap 方法将处理后的字符串添加后缀 “!”. 最后我们在订阅 flux 对象后,会得到”HELLO!”和”WORLD!”两个消息。
这里使用的是 Flux 的 “源码”来分析其特点。在源码中,map 方法通过调用了 org.reactivestreams.Publisher#map(java.util.function.Function) 方法,将输入变换为另外一个 Flux 对象(实现org.reactivestreams.Publisher接口),已达到转换功能,并且它返回的还是 Flux 对象,实现了链式调用。flatMap 方法通过组合 map 和 flatMapIterable 方法的实现,在接收到 upstream 的 onNext 信号后,flatMap 方法先调用传入的 Function(通过 flatMap 的形参传入)将 upstream 中的元素转换出一个 Publisher,然后对这个 Publisher 进行拍扁并交给 downstream 处理。所以,它的返回值是 Mono 对象。
在 subscribe 方法上的操作是使用 “响应式处理”,这意味着我们在处理流时只会在 “使用请求” 时才会向下推送流数据,而不是使用 “拉取请求” 的模式。这实现了一流的流式操作和异步处理的流媒体。此外,Mono 和 Flux 的主要作用是在订阅和发布方面,所以仅在 “使用请求” 时即联系订阅对象。
因此,上述示例是基于非阻塞式的响应式编程概念来实现异步处理的,使得数据流的处理更加高效,性能更优。同时,链式调用和响应式处理的使用,使代码可读性更强,逻辑更清晰。