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

相关文章

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.