本文主要是介绍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 :
- 请求到达Controller方法。
- Controller方法被执行,返回一个
CompletableFuture
实例。 RequestMappingHandlerAdapter
处理返回值。如果返回的是CompletableFuture
或其他异步类型,它会查询ReactiveAdapterRegistry
以找到适当的响应式适配器。- 在
ReactiveAdapterRegistry
中,会匹配到对应CompletionStage
的适配器。 - 该适配器封装了将
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处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!