SpringCloud Gateway HttpWebHandlerAdapter鏈路調(diào)用請(qǐng)求流程介紹
前言
上一節(jié)我們說(shuō)到從HttpWebHandlerAdapter的handle方法說(shuō)起到DispatcherHandler的調(diào)用流程
那么HttpWebHandlerAdapter的handle方法是從哪里來(lái)調(diào)用的呢?
我們可以找下看哪些類使用了HttpHandler

通過(guò)這些類的名字,我們可以發(fā)現(xiàn),HttpHandler 往下就是具體的 Web 容器了,也就是說(shuō)有具體的 Web 容器來(lái)接受請(qǐng)求,然后通過(guò)調(diào)用 HttpWebHandlerAdapter#handler 來(lái)進(jìn)行后續(xù)的處理。這樣我們也就明白了 為什么 HttpHandler 的具體實(shí)現(xiàn)是一個(gè)適配器,因?yàn)樗m配不同的底層容器,Spring webFLux 不僅僅可以使用 NettyReactiveWebServer 作為底層Web 容器,也可以使用 tomcat、jetty等 servlet 的容器。
web容器
通過(guò)上面分析點(diǎn)進(jìn)去可以看到
NettyReactiveWebServerFactory.java
@Override
public WebServer getWebServer(HttpHandler httpHandler) {
HttpServer httpServer = createHttpServer();
ReactorHttpHandlerAdapter handlerAdapter = new ReactorHttpHandlerAdapter(httpHandler);
NettyWebServer webServer = createNettyWebServer(httpServer, handlerAdapter, this.lifecycleTimeout,
getShutdown());
webServer.setRouteProviders(this.routeProviders);
return webServer;
}通過(guò)方法名就可以發(fā)現(xiàn)這就是得到一個(gè)web服務(wù)
往上面一直追蹤可以找到入口是AbstractApplicationContext#onRefresh方法中,也就是在AbstractApplicationContext#refresh中調(diào)用的。熟悉Spring的同學(xué)可以看到這就是Spring容器啟動(dòng)的核心方法。
接著上面的代碼,可以看到第二行,實(shí)例化了ReactorHttpHandlerAdapter對(duì)象
點(diǎn)進(jìn)去可以看到核心的apply方法
@Override
public Mono<Void> apply(HttpServerRequest reactorRequest, HttpServerResponse reactorResponse) {
NettyDataBufferFactory bufferFactory = new NettyDataBufferFactory(reactorResponse.alloc());
try {
ReactorServerHttpRequest request = new ReactorServerHttpRequest(reactorRequest, bufferFactory);
ServerHttpResponse response = new ReactorServerHttpResponse(reactorResponse, bufferFactory);
if (request.getMethod() == HttpMethod.HEAD) {
response = new HttpHeadResponseDecorator(response);
}
//調(diào)用handle方法
return this.httpHandler.handle(request, response)
.doOnError(ex -> logger.trace(request.getLogPrefix() + "Failed to complete: " + ex.getMessage()))
.doOnSuccess(aVoid -> logger.trace(request.getLogPrefix() + "Handling completed"));
}
catch (URISyntaxException ex) {
if (logger.isDebugEnabled()) {
logger.debug("Failed to get request URI: " + ex.getMessage());
}
reactorResponse.status(HttpResponseStatus.BAD_REQUEST);
return Mono.empty();
}
}可以看到在這里調(diào)用開(kāi)始httpHandler#handle方法,
WebServerManager.java #WebServerManager this.handler = new DelayedInitializationHttpHandler(handlerSupplier, lazyInit); this.webServer = factory.getWebServer(this.handler);
此時(shí)的httpHandler是DelayedInitializationHttpHandle對(duì)象,調(diào)用其handle方法

可以看到最后實(shí)際調(diào)用的是HttpWebHandlerAdapter的handle方法
到此這篇關(guān)于SpringCloud Gateway HttpWebHandlerAdapter鏈路調(diào)用請(qǐng)求流程介紹的文章就介紹到這了,更多相關(guān)SpringCloud HttpWebHandlerAdapter內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot中實(shí)現(xiàn)策略模式+工廠模式的方法
這篇文章主要介紹了Springboot中實(shí)現(xiàn)策略模式+工廠模式,具體策略模式和工廠模式的UML我就不給出來(lái)了,使用這個(gè)這兩個(gè)模式主要是防止程序中出現(xiàn)大量的IF ELSE IF ELSE....,接下來(lái)咱們直接實(shí)現(xiàn)Springboot策略模式工廠模式2022-03-03
SpringBoot采用AJAX實(shí)現(xiàn)異步發(fā)布帖子詳解
Ajax是一種web應(yīng)用技術(shù),可以借助客戶端腳本(javascript)與服務(wù)端應(yīng)用進(jìn)行異步通訊,獲取服務(wù)端數(shù)據(jù)以后,可以進(jìn)行局部刷新,進(jìn)而提高數(shù)據(jù)的響應(yīng)和渲染速度。所有的Ajax請(qǐng)求都會(huì)基于DOM(HTML元素)事件,通過(guò)XHR(XMLHttpRequest)對(duì)象實(shí)現(xiàn)與服務(wù)端異步通訊局部更新2022-08-08
如何解決SpringBoot2.x版本對(duì)Velocity模板不支持的方案
這篇文章主要介紹了如何解決SpringBoot2.x版本對(duì)Velocity模板不支持的方案,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Spring里的Async注解實(shí)現(xiàn)異步操作的方法步驟
這篇文章主要介紹了Spring里的Async注解實(shí)現(xiàn)異步操作的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
SpringBoot啟動(dòng)自動(dòng)終止也不報(bào)錯(cuò)的原因及解決
這篇文章主要介紹了SpringBoot啟動(dòng)自動(dòng)終止也不報(bào)錯(cuò)的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Java單機(jī)環(huán)境實(shí)現(xiàn)定時(shí)任務(wù)技術(shù)
這篇文章主要介紹了Java單機(jī)環(huán)境實(shí)現(xiàn)定時(shí)任務(wù)技術(shù),文章內(nèi)容介紹詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04
java如何實(shí)現(xiàn)多線程的順序執(zhí)行
多線程是java的一種重要技術(shù),但是多線程的運(yùn)行是沒(méi)有絕對(duì)的順序的,那么java如何實(shí)現(xiàn)多線程的順序執(zhí)行,下面就一起來(lái)了解一下2021-05-05

