Spring Gateway

Spring Gateway

官方文档:Spring Cloud Gateway

架构图

img

Mono 和 Flux

Mono 和 Flux 是响应式编程中的核心概念,主要的特点如下:

  1. 异步处理:Mono 和 Flux 处理数据的方式是异步的,可以利用异步处理的优势来提高并发能力,解决高并发场景下的性能瓶颈。

  2. 非阻塞式数据流:Mono 和 Flux 的数据流是非阻塞式的,可以处理大量的请求和响应,避免应用程序阻塞或崩溃。

  3. 响应式处理:Mono 和 Flux 遵循响应式编程的理念,强调数据流的“推”模式,即只有当有数据可供处理时才会进行处理,能够更好地处理流式数据。

  4. 处理函数链式调用:Mono 和 Flux 通过链式调用使得函数逻辑变得简单易懂、代码更加简洁。

下面的示例通过分析源码对以上特点做进一步解释:

1
2
3
4
Flux<String> flux = Flux.just("hello", "world");
flux.map(s -> s.toUpperCase())
.flatMap(s -> Mono.just(s + "!"))
.subscribe(System.out::println);

在这个示例中,我们定义一个 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 的主要作用是在订阅和发布方面,所以仅在 “使用请求” 时即联系订阅对象。

因此,上述示例是基于非阻塞式的响应式编程概念来实现异步处理的,使得数据流的处理更加高效,性能更优。同时,链式调用和响应式处理的使用,使代码可读性更强,逻辑更清晰。


Spring Gateway
http://example.com/2023/06/01/Spring家族/Spring Gateway/
作者
where
发布于
2023年6月1日
许可协议