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

相关文章

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Golang 日志处理和正则处理的操作方法

《Golang日志处理和正则处理的操作方法》:本文主要介绍Golang日志处理和正则处理的操作方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录1、logx日志处理1.1、logx简介1.2、日志初始化与配置1.3、常用方法1.4、配合defer