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

相关文章

Linux中shell解析脚本的通配符、元字符、转义符说明

《Linux中shell解析脚本的通配符、元字符、转义符说明》:本文主要介绍shell通配符、元字符、转义符以及shell解析脚本的过程,通配符用于路径扩展,元字符用于多命令分割,转义符用于将特殊... 目录一、linux shell通配符(wildcard)二、shell元字符(特殊字符 Meta)三、s

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

Python结合requests和Cheerio处理网页内容的操作步骤

《Python结合requests和Cheerio处理网页内容的操作步骤》Python因其简洁明了的语法和强大的库支持,成为了编写爬虫程序的首选语言之一,requests库是Python中用于发送HT... 目录一、前言二、环境搭建三、requests库的基本使用四、Cheerio库的基本使用五、结合req

使用Python处理CSV和Excel文件的操作方法

《使用Python处理CSV和Excel文件的操作方法》在数据分析、自动化和日常开发中,CSV和Excel文件是非常常见的数据存储格式,ython提供了强大的工具来读取、编辑和保存这两种文件,满足从基... 目录1. CSV 文件概述和处理方法1.1 CSV 文件格式的基本介绍1.2 使用 python 内

使用Python实现批量访问URL并解析XML响应功能

《使用Python实现批量访问URL并解析XML响应功能》在现代Web开发和数据抓取中,批量访问URL并解析响应内容是一个常见的需求,本文将详细介绍如何使用Python实现批量访问URL并解析XML响... 目录引言1. 背景与需求2. 工具方法实现2.1 单URL访问与解析代码实现代码说明2.2 示例调用

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery