Spring WebFlux--浅谈Mono和Flux

一、概述

当我们使用SpringCloud Gateway的时候,无法避免会遇到Mono和Flux这两个类,其实它们都来自Spring WebFlux,而SpringCloud Gateway正是基于WebFlux来构建的一个高性能网关。

  • 什么是Spring WebFlux响应式编程
  • Mono常用API
  • Flux常用API
  • 总结Mono和Flux

二、正文

1、什么是Spring WebFlux响应式编程

上图来自Spring官网,展示了传统的 SpringMVC 和 WebFlux 之间的区别。

WebFlux 底层使用 Netty,这点也和我们传统的 SpringMVC 不一样,不过默认端口都是 8080。

Spring WebFlux 是一个异步非阻塞式 IO 模型,通过少量的容器线程就可以支撑大量的并发访问,所以 Spring WebFlux 可以有效提升系统的吞吐量和伸缩性,特别是在一些 IO 密集型应用中,例如微服务网关 Spring Cloud Gateway 就使用了 WebFlux,这样可以有效提升网管对下游服务的吞吐量。

WebFlux底层使用Reactor这套Java响应式编程框架,通过异步来提高系统吞吐量,涉及发布者和消费者两个基础概念,有点类似消息队列,基于发布/订阅模式。

日常我们一般只会接触到Reactor中的发布者,即Mono和Flux,功能类似Future,区别在于前者可以响应0-1个元素,后者响应0-N个元素,它们的使用方式类似Java 8的 Stream。

2、 Mono常用API

Mono.just()

功能:使用已知内容创建Mono实例

Mono<String> just = Mono.just("hello world");
just.subscribe(System.out::println);

运行代码将打印“hello world”

Mono.defer()

功能:传入一个生产者,即创建Mono的方式,每次消费都会新建一个Mono实例,而just消费多少次都只有一个实例

Mono<String> defer = Mono.defer(() -> {
  return Mono.just("time: " + new Date().toString());
});

defer.subscribe(System.out::println);
Thread.sleep(1000);
defer.subscribe(System.out::println);

两次消费打印的时间将不同

Mono.empty()

功能:创建一个不含任何元素的Mono

Mono.empty().subscribe(System.out::println);

什么都不会打印

doOnError()

功能:在消费之前发生异常时执行的逻辑

Mono.just("hello world").doFirst(() -> {
            int w = 1 / 0 ;
        }).doOnError(throwable -> {
 System.out.println("error is : " + throwable.getMessage());
        }).subscribe(System.out::println);

执行代码,将打印除零异常,并且不会执行消费
 

3、 Flux常用API

Flux.just()

功能:使用已知内容创建Flux实例

 Flux.just("abc","efg","rst").subscribe(System.out::println);

运行代码将打印三行字符串

Flux.range()

功能:创建一定的数字范围

Flux.range(1,9).subscribe(System.out::println);

运行代码将打印1到9

Flux.fromArray()

功能:根据数组来创建Flux实例

String[] arr = {"A","B","C"};
Flux.fromArray(arr).subscribe(System.out::println);

 

4、总结Mono和Flux

两个类的API大部分都一样,和Stream高度类似,包括创建、异常处理、遍历、转换、过滤、压平等等。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Integration WebFlux提供了一种基于反应式编程模型的流式交互方式,它可以让客户端和服务端之间实现数据的实时推送和响应。 以下是使用Spring Integration WebFlux实现客户端和服务端流式交互的步骤: 1. 配置服务端 首先,需要配置一个WebFlux服务器,以便客户端可以连接到它并发送请求。可以使用Spring Boot来创建WebFlux服务器,如下所示: ```java @SpringBootApplication public class WebFluxServer { public static void main(String[] args) { SpringApplication.run(WebFluxServer.class, args); } @Bean public RouterFunction<ServerResponse> route(ServerHandler handler) { return RouterFunctions.route(RequestPredicates.GET("/stream"), handler::stream); } } ``` 在此示例中,创建了一个WebFlux服务器,并注册了一个名为“route”的路由函数,将HTTP GET请求映射到名为“stream”的处理程序方法上。 2. 创建服务端处理程序 接下来,需要创建一个处理程序,该处理程序将接收来自客户端的请求,并将其转换为流式响应。可以使用Spring Integration WebFlux提供的FluxSink来实现这一点,如下所示: ```java @Component public class ServerHandler { public Mono<ServerResponse> stream(ServerRequest request) { Flux<String> flux = Flux.interval(Duration.ofSeconds(1)) .map(l -> "Tick #" + l) .take(10); return ServerResponse.ok() .contentType(MediaType.TEXT_EVENT_STREAM) .body(BodyInserters.fromProducer(flux, String.class)); } } ``` 在此示例中,创建了一个名为“stream”的处理程序方法,该方法将返回一个Flux<String>实例,该实例每秒发出一次字符串“Tick #x”,其中x是自增的数字。然后,使用ServerResponse.ok()创建一个响应对象,并将其内容类型设置为text/event-stream。最后,使用BodyInserters.fromProducer()方法将Flux<String>实例转换为响应体。 3. 配置客户端 与服务端类似,客户端也需要配置一个WebFlux客户端,以便可以连接到服务端并发送请求。可以使用Spring Boot来创建WebFlux客户端,如下所示: ```java @SpringBootApplication public class WebFluxClient { public static void main(String[] args) { SpringApplication.run(WebFluxClient.class, args); } @Bean public CommandLineRunner run(WebClient client) { return args -> { client.get() .uri("http://localhost:8080/stream") .accept(MediaType.TEXT_EVENT_STREAM) .exchange() .flatMapMany(response -> response.bodyToFlux(String.class)) .subscribe(System.out::println); }; } } ``` 在此示例中,创建了一个WebFlux客户端,并使用CommandLineRunner接口将其运行在Spring Boot应用程序中。在run()方法中,创建了一个WebClient实例,并使用它来发送HTTP GET请求到服务端的“/stream”端点。然后,将响应体转换为Flux<String>实例,并使用subscribe()方法打印每个字符串。 4. 运行客户端和服务端 现在,可以同时运行客户端和服务端应用程序,并观察到服务端每秒向客户端发送一条消息,直到发送了10条消息。 通过上述步骤,就可以使用Spring Integration WebFlux实现客户端和服务端之间的流式交互。这种方式可以用于实现实时通信、事件驱动的处理等应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值