Spring Webflux学习记录

简介: 现在Reactive在Java开发者中依然还是个雾里看花的状态,都知道不是银弹,但是也都不知道在一般的业务场景它能不能用?能用到什么程度?代价是什么?因此为了破除迷信,近距离了解这项技术,从Spring Webflux开始学习,关键心得记录如下。 ## 异步思维 首先全异步编程是Reactive的核心,虽然一直作业务产品开发,但是对多线程操作也不陌生,直观感觉上即使是全异步编程也不会有太大

现在Reactive在Java开发者中依然还是个雾里看花的状态,都知道不是银弹,但是也都不知道在一般的业务场景它能不能用?能用到什么程度?代价是什么?因此为了破除迷信,近距离了解这项技术,从Spring Webflux开始学习,关键心得记录如下。

异步思维

首先全异步编程是Reactive的核心,虽然一直作业务产品开发,但是对多线程操作也不陌生,直观感觉上即使是全异步编程也不会有太大的不适应。但是,全异步真的是需要另一套代码习惯。

下面这段代码,按照我一开始的理解应该是要输出都能输出,但是事实上直接就报了“java.io.IOException: Pipe closed”,也就是说由于使用了JDK8 Closeable方式的try catch写法,导致在实际写入前就在主线程被关闭。

在这里传统的优雅的写法成为了全异步化编程模型的“陋习”,不得不在onFinally或者后续的阻塞场景写一些样板代码将其close。同时这里也暴露了另一个问题,那就是在传统开发模式和Reactive混合使用时,很容易由于前置的同步代码潜在的预期语义,导致异步化后出现各种难以捉摸的异常,并且如果没写doOnError还会丢失异常信息。

@RestController
@RequestMapping("/test")
public class GreetingHandler {

    @GetMapping("/hello")
    public Flux<String> hello(ServerHttpRequest request) {
        return Flux.just("a", "b", "c");
    }
}

public static void main(String[] args) throws Exception {
    String url = "http://localhost:8080/test/hello";
    Flux<DataBuffer> response = WebClient.create()
        .get().uri(url).exchange()
        .flatMapMany(b -> b.bodyToFlux(DataBuffer.class));

    try(PipedOutputStream outputStream = new PipedOutputStream();
        PipedInputStream inputStream = new PipedInputStream(outputStream)) {
        DataBufferUtils.write(response, outputStream)
            .doFinally(s -> {
                System.out.println("doFinally: " + s.toString() + Thread.currentThread().getId());
                try {
                    System.out.println(inputStream.available());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            })
            .doOnNext(dataBuffer -> {
                System.out.println("doOnNext" + Thread.currentThread().getId());
            })
            .doOnError(t -> {
                logger.error("", t);
            })
            .subscribe(DataBufferUtils.releaseConsumer());
    } catch (Exception e) {
        logger.error("", e);
    }
}

客户端限制

Webflux将Controller的返回固定成另Mono和Flux两种,通过使用浏览器接收到的和普通接口无二,那Webflux真的不限制客户端类型吗?

了解这个问题最好的办法一是看源码,其次就是抓包看一下通信协议。本次使用Wireshark抓包,截图如下。从服务端返回可以看出发送了三次数据,因此说明FLux接口会分成多个chunk返回客户端,同时整体上还是一个完整的HTTP协议,所以客户端不受服务端选型影响。
20200627160501.jpg

小结

从目前的初步了解来看,在一般的业务中实战Reactive就是个高风险的选型,因为有性能压力的往往只会是少数几个接口,而开发模型混合之后维护难度会加大不少,这或许就是节约成本的代价。

相关文章
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
4月前
|
前端开发 Java API
利用 Spring WebFlux 技术打造高效非阻塞 API 的完整开发方案与实践技巧
本文介绍了如何使用Spring WebFlux构建高效、可扩展的非阻塞API,涵盖响应式编程核心概念、技术方案设计及具体实现示例,适用于高并发场景下的API开发。
396 0
|
9月前
|
监控 Java 应用服务中间件
微服务——SpringBoot使用归纳——为什么学习Spring Boot
本文主要探讨为什么学习Spring Boot。从Spring官方定位来看,Spring Boot旨在快速启动和运行项目,简化配置与编码。其优点包括:1) 良好的基因,继承了Spring框架的优点;2) 简化编码,通过starter依赖减少手动配置;3) 简化配置,采用Java Config方式替代繁琐的XML配置;4) 简化部署,内嵌Tomcat支持一键式启动;5) 简化监控,提供运行期性能参数获取功能。此外,从未来发展趋势看,微服务架构逐渐成为主流,而Spring Boot作为官方推荐技术,与Spring Cloud配合使用,将成为未来发展的重要方向。
366 0
微服务——SpringBoot使用归纳——为什么学习Spring Boot
|
3月前
|
监控 Java API
Spring WebFlux 响应式编程技术详解与实践指南
本文档全面介绍 Spring WebFlux 响应式编程框架的核心概念、架构设计和实际应用。作为 Spring 5 引入的革命性特性,WebFlux 提供了完全的响应式、非阻塞的 Web 开发栈,能够显著提升系统的并发处理能力和资源利用率。本文将深入探讨 Reactor 编程模型、响应式流规范、WebFlux 核心组件以及在实际项目中的最佳实践,帮助开发者构建高性能的响应式应用系统。
708 0
|
4月前
|
缓存 Java API
Spring WebFlux 2025 实操指南详解高性能非阻塞 API 开发全流程核心技巧
本指南基于Spring WebFlux 2025最新技术栈,详解如何构建高性能非阻塞API。涵盖环境搭建、响应式数据访问、注解与函数式两种API开发模式、响应式客户端使用、测试方法及性能优化技巧,助你掌握Spring WebFlux全流程开发核心实践。
810 0
|
6月前
|
安全 Java 数据库
Spring Boot 框架深入学习示例教程详解
本教程深入讲解Spring Boot框架,先介绍其基础概念与优势,如自动配置、独立运行等。通过搭建项目、配置数据库等步骤展示技术方案,并结合RESTful API开发实例帮助学习。内容涵盖环境搭建、核心组件应用(Spring MVC、Spring Data JPA、Spring Security)及示例项目——在线书店系统,助你掌握Spring Boot开发全流程。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
1049 2
|
8月前
|
Java Spring
Spring框架的学习与应用
总的来说,Spring框架是Java开发中的一把强大的工具。通过理解其核心概念,通过实践来学习和掌握,你可以充分利用Spring框架的强大功能,提高你的开发效率和代码质量。
205 20
|
11月前
|
XML 监控 前端开发
Spring Boot中的WebFlux编程模型
Spring WebFlux 是 Spring Framework 5 引入的响应式编程模型,基于 Reactor 框架,支持非阻塞异步编程,适用于高并发和 I/O 密集型应用。本文介绍 WebFlux 的原理、优势及在 Spring Boot 中的应用,包括添加依赖、编写响应式控制器和服务层实现。WebFlux 提供高性能、快速响应和资源节省等优点,适合现代 Web 应用开发。
1342 15
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
318 9
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
200 9

热门文章

最新文章