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

通過這些類的名字,我們可以發(fā)現(xiàn),HttpHandler 往下就是具體的 Web 容器了,也就是說有具體的 Web 容器來接受請求,然后通過調(diào)用 HttpWebHandlerAdapter#handler 來進(jìn)行后續(xù)的處理。這樣我們也就明白了 為什么 HttpHandler 的具體實現(xiàn)是一個適配器,因為它要適配不同的底層容器,Spring webFLux 不僅僅可以使用 NettyReactiveWebServer 作為底層Web 容器,也可以使用 tomcat、jetty等 servlet 的容器。
web容器
通過上面分析點進(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;
}通過方法名就可以發(fā)現(xiàn)這就是得到一個web服務(wù)
往上面一直追蹤可以找到入口是AbstractApplicationContext#onRefresh方法中,也就是在AbstractApplicationContext#refresh中調(diào)用的。熟悉Spring的同學(xué)可以看到這就是Spring容器啟動的核心方法。
接著上面的代碼,可以看到第二行,實例化了ReactorHttpHandlerAdapter對象
點進(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)用開始httpHandler#handle方法,
WebServerManager.java #WebServerManager this.handler = new DelayedInitializationHttpHandler(handlerSupplier, lazyInit); this.webServer = factory.getWebServer(this.handler);
此時的httpHandler是DelayedInitializationHttpHandle對象,調(diào)用其handle方法

可以看到最后實際調(diào)用的是HttpWebHandlerAdapter的handle方法
到此這篇關(guān)于SpringCloud Gateway HttpWebHandlerAdapter鏈路調(diào)用請求流程介紹的文章就介紹到這了,更多相關(guān)SpringCloud HttpWebHandlerAdapter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot 使用Aop通知打印控制器請求報文和返回報文問題
這篇文章主要介紹了spring-boot 使用Aop通知打印控制器請求報文和返回報文,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2018-04-04
SpringBoot Security前后端分離登錄驗證的實現(xiàn)
這篇文章主要介紹了SpringBoot Security前后端分離登錄驗證的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java正則表達(dá)式之Pattern和Matcher的使用
本文詳細(xì)介紹了Java中處理正則表達(dá)式的Pattern和Matcher類的使用方法和實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09

