webflux源码解析(5)-response处理

2024-08-28 03:52

本文主要是介绍webflux源码解析(5)-response处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 1. 说明
  • 2. response的处理
  • 3. response的适配

1. 说明

之前的文章前后梳理了接收connection中的msg、将msg转成request、处理request的主流程,当业务代码执行完毕后,对response会有一段处理逻辑,本文对其进行梳理。

2. response的处理

还是核心类 DispatcherHandler (可参考webflux源码解析(1)-主流程)

org.springframework.web.reactive.DispatcherHandler#handle
在这里插入图片描述

对于http请求:
在这里插入图片描述

将请求的返回体回写到response中:
org.springframework.web.reactive.result.method.annotation.ResponseBodyResultHandler#handleResult

org.springframework.web.reactive.result.method.annotation.AbstractMessageWriterResultHandler#writeBody

在这里插入图片描述

对于普通的http请求,把数据写到message中的方法为:
org.springframework.http.codec.EncoderHttpMessageWriter#write

在这里插入图片描述

此处的message有不同的实现

在这里插入图片描述

对于普通的http请求,执行的方法是:
org.springframework.http.server.reactive.AbstractServerHttpResponse#writeWith

在这里插入图片描述

org.springframework.http.server.reactive.ReactorServerHttpResponse#writeWithInternal

在这里插入图片描述

此处的response实现为 HttpServerOperations ,HttpServerOperations 是 HttpOperations 的子类,此处执行的send方法为 reactor.netty.http.HttpOperations#send

在这里插入图片描述

获取对应的channel,并将数据回写至客户端。

3. response的适配

webflux定义接口时,返回需要是Mono 或者 Flux 对象,但查询资料得知,接口返回 CompletableFuture 也能正常完成异步执行,压测发现吞吐量并不会变化,进一步验证了该方式,那么框架层是如何实现的呢?
在这里插入图片描述

AbstractMessageWriterResultHandler#writeBody 方法中有适配CompletableFuture的逻辑,大体如下:

controller层接口返回 CompletableFuture :

  1. 请求到达Controller方法。
  2. Controller方法被执行,返回一个CompletableFuture实例。
  3. RequestMappingHandlerAdapter 处理返回值。如果返回的是CompletableFuture或其他异步类型,它会查询ReactiveAdapterRegistry以找到适当的响应式适配器。
  4. ReactiveAdapterRegistry中,会匹配到对应CompletionStage的适配器。
  5. 该适配器封装了将CompletionStage转换为Mono的逻辑,这通常会间接调用Mono.fromFuture()

关键代码如下(spring 5.1.7.RELEASE版本):
定义并注册转换器: org.springframework.core.ReactiveAdapterRegistry.ReactorRegistrar#registerAdapters

在这里插入图片描述

处理具体请求时,其关键调用链路为:

org.springframework.web.reactive.DispatcherHandler#handle
org.springframework.web.reactive.DispatcherHandler#handleResult
org.springframework.web.reactive.result.method.annotation.AbstractMessageWriterResultHandler#writeBody

在这里插入图片描述

这篇关于webflux源码解析(5)-response处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113655

相关文章

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java Response返回值的最佳处理方案

《JavaResponse返回值的最佳处理方案》在开发Web应用程序时,我们经常需要通过HTTP请求从服务器获取响应数据,这些数据可以是JSON、XML、甚至是文件,本篇文章将详细解析Java中处理... 目录摘要概述核心问题:关键技术点:源码解析示例 1:使用HttpURLConnection获取Resp

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.